尝试在java中通过tcp发送kilobyte消息时出错

时间:2015-10-11 16:08:23

标签: java sockets tcp

我试图通过比较客户端维护的已发送计数器的消息与服务器端的消息接收计数器来测试TCP连接中的数据包丢失。我发送的消息是25千克,前5个字节包含来自客户端的计数,以字母填充星号以保持5字节长度。但是,在3或4条成功消息之后,服务器无法找到计数。有什么我忘记考虑的事情吗?我的猜测是服务器无法跟上客户端,因为成功的消息数量在出错之前从3到4不等。

客户端代码:

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 ++;    
        }  
    }

服务器端代码:

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 ++;
      }
   }

服务器输出:

java TCPServer

开始循环

收到计数字符串:&#34; 0 ****&#34; 客户端数量:0,服务器数量:0

收到计数字符串:&#34; 1 ****&#34; 客户端数量:1,服务器数量:1

收到计数字符串:&#34; 2 ****&#34; 客户数:2,服务器数:2

收到计数字符串:&#34; 3 ****&#34; 客户数:3,服务器数:3

收到计数字符串:&#34;&#34;

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)

2 个答案:

答案 0 :(得分:2)

您执行此操作的方式存在许多问题。最大的问题是你在Socket上调用read(byte []),但从不检查实际读取了多少字节。您也没有在标题之后读取与消息一起发送的字节。

您可能想看一下DataFetcher,我处理(套接字)输入流的解决方案

答案 1 :(得分:1)

我曾经处理写作&amp;按照下面的代码读取字节数组,即使对于超级字节的数据也是如此。

用于在套接字中写入和读取字节数组的示例代码

/* 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); 
}