我有一个Java服务器和一个用Python编写的客户端。 python客户端只发送10个数据包,每次发送之间等待2秒。但是,在python脚本终止之前,java服务器似乎不识别数据包,它最终接收所有消息,就像它们同时进入一样。我已经看过wireshark并验证客户端正在正确发送所有数据包。
ServerSocket serverSocket = new ServerSocket(6789);
Socket clientSocket = null;
System.out.println ("Waiting for connection.....");
try {
clientSocket = serverSocket.accept();
}
catch (IOException e) {
System.err.println("Accept failed.");
System.exit(1);
}
System.out.println ("Connection successful");
System.out.println ("Waiting for input.....");
String data;
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
while ((data = in.readLine()) != null) {
System.out.println ("Server: " + data);
}
Python代码: 导入套接字 进口时间
TCP_IP = '192.168.1.127'
TCP_PORT = 6789
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((TCP_IP, TCP_PORT))
for i in range(10):
sock.send("Packet #: %s" % str(i))
time.sleep(2)
输出我看到了:
Connection successful
Waiting for input.....
Server: Packet: #: 0Packet: #: 1Packet: #: 2Packet: #: 3Packet: #: 4Packet: #: 5Packet: #: 6Packet: #: 7Packet: #: 8Packet: #: 9
答案 0 :(得分:1)
您在服务器中使用BufferedReader.readLine()
但从未从客户端发送新的线路符号。
因此,服务器不知道它是否会在该行中接收更多数据,因此必须等到确定不再在该行上发送数据:关闭套接字是表明这一点的一种方式。
将\n
添加到您从客户端发送的数据包的末尾。
sock.send("Packet #: %s\n" % str(i))
答案 1 :(得分:0)
您正在尝试阅读完整的一行。但是因为你从不发送换行符\n
,所以它只是等待流关闭。在您的客户端发送换行符或不读取行。