【问题标题】:Getting socket timeout when receiving frequent requests at once一次接收频繁请求时获取套接字超时
【发布时间】:2016-01-23 08:41:22
【问题描述】:

我试图用我的手机为我的笔记本电脑构建一个遥控器。 我编写了一个在我的笔记本电脑上运行的服务器应用程序,该远程应用程序用作服务器应用程序的客户端。 我想实现一个鼠标垫,问题是当我在“触摸板”上移动手指太快时,经过几次迭代,我在服务器端收到了读取时间。

服务器代码 final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(20);

    Runnable serverTask = new Runnable()
    {
        @Override
        public void run()
        {
            ServerSocket serverSocket = null;
            try
            {
                serverSocket = new ServerSocket(DEFAULT_PORT);
                serverSocket.setReuseAddress(true);
                _working = true;
                while (_working)
                {
                    Socket clientSocket = serverSocket.accept();
                    clientSocket.setSoTimeout(10000);
                    clientProcessingPool.submit(new ClientTask(clientSocket));
                }
            }
            catch (IOException e)
            {
                System.err.println("Unable to process client request");
                e.printStackTrace();
            }
            finally
            {
                try
                {
                    if (serverSocket != null)
                    {
                        serverSocket.close();
                    }
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    };
    Thread serverThread = new Thread(serverTask);
    serverThread.start();

private class ClientTask implements Runnable
{
    private final Socket    clientSocket;

    private ClientTask(Socket clientSocket)
    {
        this.clientSocket = clientSocket;
    }

    @Override
    public void run()
    {
        System.out.println("Got a client !");
        try
        {
            System.out.println("Connected!");
            DataOutputStream dOut = new DataOutputStream(clientSocket.getOutputStream());
            DataInputStream dIn = new DataInputStream(clientSocket.getInputStream());

            String request = dIn.readUTF();
            parseRequest(request);
            System.out.println("request=" + request);

            dOut.writeUTF("Got the command");
            dOut.flush(); // Send off the data

            dIn.close();
            dOut.close();

            clientSocket.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

我想也许只有当从起始位置到结束位置的距离大于 STEPS(一个常数)时我才会发送请求,然后才发送请求。但我认为鼠标不会流畅地移动。

谢谢。

【问题讨论】:

    标签: android sockets timeout touch


    【解决方案1】:

    RXAndroid 和 RXJava 非常适合异步处理这些请求,并允许您为频繁的请求添加去抖动功能。查看 Reactive.io

    【讨论】:

    • 我还需要使用 RXAndroid 还是只使用 RXJava,您能否解释一下这些库将如何帮助我解决问题?
    • youtube.com/watch?v=k3D0cWyNno4 这个视频很好地解释了您可以为此目的使用这些库的方式。你应该同时使用这两个来让它更容易
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多