【问题标题】:Java TCP server not receiving packets until client disconnectsJava TCP服务器在客户端断开连接之前不接收数据包
【发布时间】:2016-10-24 15:11:54
【问题描述】:

我有一个用 Java 编写的 TCP 服务器和一个用 Python 编写的客户端。 python 客户端仅发送 10 个数据包,每次发送之间等待 2 秒。但是,java 服务器似乎在 python 脚本终止之前无法识别数据包,它最终接收到所有消息,就好像它们同时进来一样。我用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

【问题讨论】:

    标签: java python sockets tcp


    【解决方案1】:

    您在服务器中使用BufferedReader.readLine()...但从未从客户端发送换行符。

    因此,服务器不知道它是否会在该行中接收更多数据,因此必须等到确定不会在该行上发送更多数据:关闭套接字是一种方法表明这一点。

    \n 添加到您从客户端发送的数据包的末尾。

    sock.send("Packet #: %s\n" % str(i))
    

    【讨论】:

      【解决方案2】:

      您正在尝试阅读完整的行。但是因为您从不发送换行符\n,所以它只会等到流关闭。在您的客户端中发送换行符或不读取行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多