2015-10-23 50 views
0

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

服务器代码 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(); 
     } 
    } 

我想也许我将发送请求仅当从起始位置到终止位置的距离比工序(一个常数),然后才发送请求更大。但我认为老鼠不会流畅地移动。

谢谢。

回答

1

RXAndroid和RXJava非常适合异步处理这些请求,并允许您为常见请求添加去抖动。退房Reactive.io

+0

我是否还需要使用RXAndroid或只是RXJava,你也可以解释这个库如何帮助我解决我的问题吗? –

+0

https://www.youtube.com/watch?v=k3D0cWyNno4本视频很好地解释了您可以将这些库用于此目的的方式。你应该使用两者来使它更容易 –