2013-06-24 50 views
0

我有一个TCP服务器客户端对。客户端有一个处理来自服务器的数据的线程。问题是,在从服务器接收到第一个数据之前,Buffered阅读器被阻止。但是一旦接收到第一个数据,它就会在有用数据之间发送0。有谁知道为什么?以及如何解决这个问题?缓冲读取器不阻止

connection = new Socket(ip, port); 
    output = new DataOutputStream(connection.getOutputStream()); 
    input = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

而这部分被修改为处理0的,然而,这并不理想:

try { 
       opcode = (char) input.read(); 
      } catch (IOException ex) { 
       ErrorFrame erfframe = new ErrorFrame("De verbinding is verbroken voordat we de opcode van het packet konden lezen", "Herverbinden", IRIGui.ConnectionType); 
      } 
      System.out.println("Data received!!" + opcode); 
      int opcodenr = Character.getNumericValue(opcode); 
      char sensortype = '0'; 
      try { 
       do { 
        sensortype = (char) input.read(); 
       } while (sensortype == 0); 

      } catch (IOException ex) { 
       ErrorFrame erfframe = new ErrorFrame("De verbinding is verbroken voordat we de sensortype van het packet konden lezen", "Herverbinden", IRIGui.ConnectionType); 
      } 

服务器代码:

公共静态无效的主要(字符串的argv [])抛出异常{ServerSocket welcomeSocket = new ServerSocket(25566);

while (true) { 
    Socket connectionSocket = welcomeSocket.accept(); 
    BufferedReader inFromClient = 
      new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
    DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 
    int request = inFromClient.read(); 
    System.out.println("erjioejfioe " + request); 
    if (request == 4) { 
     outToClient.writeBytes("41"); 
     outToClient.write(5); 
     outToClient.writeInt(5); 
     outToClient.writeInt(3); 
     outToClient.writeInt(6); 
     outToClient.writeInt(5); 
     outToClient.writeInt(1); 
    } 
    request = 0; 
    request = inFromClient.read(); 
    System.out.println("erjioejfioe " + request); 
    if (request == 4) { 
     System.out.println("SENDING THE SHIT"); 
     outToClient.writeBytes("41"); 
     outToClient.write(5); 
     outToClient.writeInt(3); 
     outToClient.writeInt(7); 
     outToClient.writeInt(2); 
     outToClient.writeInt(4); 
     outToClient.writeInt(3); 
     System.out.println("We get here!!"); 
    } 
    break; 
} 

}

+0

发送代码是什么样的?为什么你会惊讶的发现阻塞直到发送了某些东西? – EJP

+0

我添加了服务器代码。我并不感到惊讶,因为它应该阻止。但收到第一份数据后,我感到很惊讶 –

回答

1

你正在写整数,这是32位,而在你的情况下,所有有三个前导零个字节,读字符,这是16位的,所以你看每一个奇怪的字符组成两个零字节。这没有任何意义。如果您使用writeInt()编写,请使用readInt()阅读。其他所有DataInput/OutputStream方法也一样。对称使用它们。

这里没有任何证据表明没有阻塞。

+0

好的,谢谢。我的错 –