2015-10-11 58 views
0

我试图通过比较在服务器端的消息接收计数器与客户端上维护的消息发送计数器来跨TCP连接测试数据包丢失。我发送的消息是25千字节,前5个字节包含来自客户端的计数,字符串形式为长度为5个字节的字符串。但是,在3或4个成功消息之后,服务器无法找到计数。有什么我忘记考虑?我的猜测是,服务器无法跟上客户端,因为错误发生之前成功消息的数量从3到4不等。尝试在java中通过tcp发送kilobyte消息时出错

客户端代码:

try{ 
     clientSocket = new Socket("192.168.0.15", SERVER_PORT); 
     DataInputStream in = new DataInputStream(clientSocket.getInputStream()); 
     DataOutputStream out = new DataOutputStream(clientSocket.getOutputStream()); 
     int messageCounter = 0; 
     byte [] message1 = new byte[25 * 1024]; 
     byte [] returnMessage1 = new byte[25 * 1024]; 
     byte [] count; 
     long startTime1 = System.nanoTime(); 
     while (messageCounter < 100000) { 
      System.out.println(messageCounter); 
      addCountToMessage(formatCount(messageCounter).getBytes(), message1); 
      out.write(message1); 
      in.read(returnMessage1);  
      messageCounter ++;  
     } 
    } 

SERVER端代码:

try { 
     byte [] data = new byte[35 * 1024]; 
     System.out.println("STARTING LOOP"); 
     System.out.println("***********************************"); 
     int messageCounter = 0; 
     int clientMessageCount = 0; 
     String clientCountString = ""; 
     byte[] clientCount = new byte[5]; 

     while (true){ 
      in.read(data); 
      clientCount[0] = data[0]; 
      clientCount[1] = data[1]; 
      clientCount[2] = data[2]; 
      clientCount[3] = data[3]; 
      clientCount[4] = data[4]; 

      clientCountString = new String(clientCount); 
      System.out.println("Received Count String: \"" + clientCountString + "\""); 
      clientCountString = clientCountString.replace("*", ""); 
      clientMessageCount = Integer.parseInt(clientCountString); 

      System.out.println("Client Count: " + clientMessageCount + ", Server Count: " + messageCounter); 
      out.write(data); 
      System.out.println("***********************************"); 
      messageCounter ++; 
     } 
    } 

OUTPUT服务器:

java TCPServer 

STARTING LOOP


收到的计字符串: “0 ****” 客户数:0,服务器的数量:0


收到的计字符串: “1 ****” 客户端数量:1,服务器数量: 1


收到的计字符串: “2 ****” 客户端计数:2,服务器计数:2


收到的计字符串:“ 3 ****” 客户端数量:3,服务器的数量:3


收到的计字符串: “”

Exception in thread "Thread-0" java.lang.NumberFormatException: For input string: "" 
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
at java.lang.Integer.parseInt(Integer.java:481) 
at java.lang.Integer.parseInt(Integer.java:527) 
at Connection.run(TCPServer.java:52) 

回答

1

我用来处理写&读取的字节数组按照下面的代码,它总是对我的作品甚至兆字节的数据。

实施例的代码写入和读出的字节数组,并从插座

/* Write byte array */ 
OutputStream out = socket.getOutputStream(); 
DataOutputStream dos = new DataOutputStream(out); 
int length = msgBytes.length; 
dos.writeInt(length); 
if (length > 0) { 
    dos.write(msgBytes); 
} 

/*Read byte array */ 
DataInputStream dis = new DataInputStream(socket.getInputStream()); 
int length = dis.readInt();     
if(length>0) { 
    byte[] msgBytes = new byte[length]; 
    dis.readFully(msgBytes, 0, length); 
} 
2

有许多你在做这种方式的问题。最大的问题是你所有的调用都在你的Socket上调用read(byte []),但是从不检查实际读取的字节数。您也没有读取消息头后消息应该与消息一起发送的字节。

你可能想看看DataFetcher,我的解决方案,以应对(插座)输入流