从另一工具发布的tcp套接字读取数据

时间:2019-01-04 09:28:26

标签: java sockets tcp

一个工具将数据推送到端口,并且Java套接字应该读取它。 我检查是否使用Netcat接收到数据 nc -lv ip port

我读取数据的Java代码如下:

ServerSocket server = new ServerSocket(port);
System.out.println("Server started"); 
System.out.println("Waiting for a client ..."); 

Socket socket = server.accept(); 
System.out.println("Client accepted"); 

// takes input from the client socket 
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream())); 
while (true) {
     String line = in.readUTF(); 
     System.out.println(line); 
}

尽管Netcat命令显示数据,程序仍将永远等待请求。任何帮助将不胜感激。

预先感谢

Shakti

2 个答案:

答案 0 :(得分:0)

理想的server.accept();呼叫将在该端口上等待某些请求。 对于服务器端,应使用Server.accept(),其中您将在某个端口上侦听,而客户端将向该端口发出请求。

在这种情况下,您应该从套接字读取而不是创建服务器套接字。

您可以参考以下链接来解决您的目的

Read Data from a Java Socket

https://docs.oracle.com/javase/tutorial/networking/sockets/readingWriting.html

答案 1 :(得分:0)

DataInput.readUTF()的约定是要读取的字符串的长度包含在前两个字节中:

  

首先,读取两个字节,并以与readUnsignedShort方法完全相同的方式构造一个无符号的16位整数。 该整数值​​称为UTF长度,它指定要读取的其他字节数

如果您的其他工具没有以完全相同的方式对UTF数据字符串进行编码,则服务器很可能会将发送的数据的第一个字节误解为要读取的数据长度,而只是挂起等待以便剩余的数据到达。

例如,假设您的工具发送了以 ASCII 编码的字符串“ Hello World”。 以十六进制表示,即是

48 65 6C 6C 6F 20 57 6F 72 6C 64

您的服务器接收到数据,并且DataInput类开始根据合同将其解码为UTF8。前两个字节被读取为无符号短整数:

utf_length = (((48 & 0xff) << 8) | (65 & 0xff))

这产生了 18533 个字节的长度。一旦读取了流的其余9个字节,服务器将简单地阻止等待其余的 18524 字节到达,这正是预期的结果。我的猜测是这就是您的程序只是挂起的原因。

由于您没有说明客户端工具是什么,也不知道客户端工具如何对您正在读取的数据进行编码,因此很难知道这是不是原因。

如果这不是正确的答案,请使用其他详细信息甚至是可能对将来的访问者有所帮助的测试数据来更新您的问题。