发送字节接收器的Java客户端服务器无限期地侦听

时间:2011-01-03 17:48:34

标签: java sockets client-server

我正在尝试为Windows编写一个涉及与外部计算机上的服务器程序通信的Java程序。我的程序成功连接到服务器,成功地向其写入一个字节数组,并等待响应。

我知道服务器一次打印一个字节的字节(响应)。我尝试过使用各种方法的DataInputStream对象(read,readByte等),我尝试过使用BufferedReader对象及其方法(read,readLine等)但是我使用过的所有读者对象和各种方法所有人都遇到了同样的问题。

正在成功读取字节(每次读取一个或多个字节,我都可以将它们打印到控制台,它们就是我所期望的那样)。问题是我的读者不知道何时停止阅读。即使服务器发送了所有字节,我端的读取器功能也会无限期地等待更多数据,因此程序会挂起读取功能。

这个问题似乎影响了我尝试过的所有技巧。我一直在使用一个简单的客户端程序和服务器程序运行测试,每个程序长约40或50行,客户端连接到服务器,并向其发送一些字节。我为服务器读取器尝试的所有技术都会导致上面提到的相同问题(服务器挂起等待来自客户端的更多输入,即使它已经发送了所有数据)。

我非常渴望得到一些帮助。重要的是我很快就完成了这个程序,除了这个通信问题之外它基本完成了。任何帮助深表感谢!

-Rob

- 编辑 -

最后,我决定使用一种算法,通过跟踪已读取的消息段的数量(段由两个空值分隔:00)来终止字节读取,并将其与预期的数量进行比较segment(作为参数传递给read函数)。它不是一种理想的方法,但它有效,而且我没有时间再研究该程序。

感谢大家的帮助!

4 个答案:

答案 0 :(得分:1)

定义结束条件的人。

一个常见的简单案例是简单地关闭连接(这是P9100打印协议的定义)。读取现在应该返回-1。

否则你可以

  • 使用长度为数据添加前缀。服务器在收到n个字节后停止读取
  • 使用专用字节终止数据。找到标记字节时,服务器停止接收。

这是你的问题还是我误解了?

答案 1 :(得分:1)

您需要服务器关闭连接,或者您需要能够从数据中判断服务器的消息已完成 - 可能使用特殊字节(例如零字节),或者通过发送长度数据本身之前的数据。

否则,应用程序无法区分服务器已完成发送数据(等待下一个请求)与服务器在发送数据时暂停的区别。

答案 2 :(得分:0)

另一种选择(不是很好,但听起来你可能会这么做)是试图对收到的数据采取行动。例如,如果您正在接收序列化对象,则可以尝试对其进行反序列化。如果成功,您已收到所有数据。如果没有,请尝试阅读更多内容。

您能告诉我们您收到的数据类型的更多信息吗?您可以检查数据中的任何内容以确定消息是否完整?

答案 3 :(得分:0)

因此,您的应用程序可以继续运行,您可以在单独的线程中读取响应数据。

如果确实没有其他方法可以知道消息何时结束,则可以使用超时。也就是说,一旦你获得了数据并且你没有再收到100毫秒或1秒的数据,你可能会认为你拥有这些数据。

更好的选择是编写代码,这样就不需要知道消息的结尾。它可以在处理它们时处理每个“响应”,在它们到达时将它们视为流事件。

数据返回的方式,似乎假设您不需要知道数据何时完成。