我正在尝试为 Windows 编写一个 Java 程序,该程序涉及与位于外部计算机上的服务器程序进行通信。我的程序成功连接到服务器,成功向其写入字节数组,并等待响应。
我知道服务器一次一个字节地向我打印字节(响应)。我尝试过使用 DataInputStream 对象及其各种方法(read、readByte 等),我尝试使用 BufferedReader 对象及其方法(read、readLine 等),但我使用过的所有读取器对象和各种方法所有人都遇到了同样的问题。
字节已成功读取(每次读取一个或多个字节时,我可以将它们打印到控制台,它们就是我期望的那样)。问题是我的读者不知道何时停止阅读。即使服务器已发送所有字节,我端的读取器功能也会无限期地等待更多数据,因此程序会卡在读取功能处。
这个问题似乎影响了我尝试过的所有技术。我一直在使用一个简单的客户端程序和服务器程序运行测试,每个程序大约 40 或 50 行长,其中客户端连接到服务器,并向其发送一些字节。我为服务器读取器尝试过的所有技术都会导致上述相同的问题(服务器挂起等待来自客户端的更多输入,即使它已发送所有数据)。
我真的非常渴望得到一些帮助。重要的是我要尽快完成这个程序,除了这个沟通问题之外,它基本上已经完成了。任何帮助深表感谢!
-罗布
--编辑--
最后,我选择了一种算法,该算法通过跟踪已读取的消息段的数量(段由两个空值分隔:00)并将其与预期的数量进行比较来终止字节的读取。段(作为参数传递给读取函数)。这不是一个理想的方法,但它确实有效,而且我没有时间再处理该程序了。
感谢大家的帮助!
最佳答案
由你来定义结束条件。
一种常见、简单的情况是简单地关闭连接(这是 P9100 打印协议(protocol)的定义)。读取现在应该返回 -1。
否则你可以
- 在数据前加上长度前缀。服务器在收到 n 个字节后停止读取
- 以专用字节终止数据。当找到标记字节时,服务器停止接收。
这是你的问题还是我误解了?
关于Java客户端服务器发送字节接收器无限期监听,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4586861/