繁体   English   中英

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

[英]Read data from tcp socket published by another tool

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

而且我的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命令显示数据,程序仍将永远等待请求。 任何帮助是极大的赞赏。

提前致谢

沙克蒂

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

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

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

从Java套接字读取数据

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM