2015-10-23 82 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本視頻很好地解釋了您可以將這些庫用於此目的的方式。你應該使用兩者來使它更容易 –