我试图通过比较在服务器端的消息接收计数器与客户端上维护的消息发送计数器来跨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)