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

Java客户端服务器发送字节接收器无限期侦听,java,sockets,client-server,Java,Sockets,Client Server,我正在尝试为Windows编写一个Java程序,该程序涉及与位于外部计算机上的服务器程序的通信。我的程序成功连接到服务器,成功向服务器写入字节数组,并等待响应 我知道服务器正在一次一个字节地将字节(响应)打印回我。我尝试过使用DataInputStream对象和各种方法(read、readByte等),我尝试过使用BufferedReader对象及其方法(read、readLine等),但我使用过的所有reader对象和各种方法都遇到了相同的问题 正在成功读取字节(每次读取一个或多个字节时,我可

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

我知道服务器正在一次一个字节地将字节(响应)打印回我。我尝试过使用DataInputStream对象和各种方法(read、readByte等),我尝试过使用BufferedReader对象及其方法(read、readLine等),但我使用过的所有reader对象和各种方法都遇到了相同的问题

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

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

我真的很想在这方面得到一些帮助。很重要的一点是我要尽快完成这个项目,除了这个沟通问题,它基本上已经完成了。非常感谢您的帮助

-抢劫

--编辑--

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


谢谢大家的帮助

定义结束条件的是您

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

否则你可以

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

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

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

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

< P>另一个选项(不是很好,但听起来像你可能要做的那样)是尝试对接收到的数据进行操作。例如,如果您正在接收一个序列化对象,您可以尝试将其反序列化。如果成功,则表示您已收到所有数据。如果没有,试着多读一些


你能告诉我们你收到的是什么样的数据吗?数据中是否有任何内容可以检查以确定消息是否完整?

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

如果确实没有其他方法可以知道消息何时完成,则可以使用超时。i、 一旦你得到了数据,并且在100毫秒或1秒钟内没有收到任何数据,你可能会认为你已经拥有了所有数据

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


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

是否关闭流?在客户端-服务器测试程序中发送数据后,我尝试关闭客户端上的writer对象,结果成功,但服务器随后导致运行时异常,表示在尝试创建DataOutputStream对象以向客户端写入响应时连接已关闭。但在我试图编写的实际程序中,我无法控制服务器做什么或不做什么。此外,提前发送数据长度不是一个选项,因为我联系的服务器不这样做,我无法控制服务器代码。该程序实际上是Otway Rees安全协议的一个实现。涉及三方:客户端、客户端B和服务器。A和B希望彼此通信,因此他们使用服务器对其进行身份验证,并提供一个会话密钥,两者都可以用于通信。这是大学最后一年的任务,我的实现必须与讲师的参考实现互操作。传递的消息使用NT编码(以Null结尾的编码)进行编码。消息的每一部分都以00结尾。但是,一条消息可以包含不同数量的部分。嗯……当你说零件数量可变时,协议中是否没有关于将要到达的零件实际数量的指示?嗯,是的,事实上,有。这是一个很好的观点。如果消息被适当地发送,那么消息中应该有固定数量的NT编码段。这是值得研究的,但我忍不住觉得这是错的。我真的应该能够有一个从另一个实体读取数据的通用函数。协议要求至少对内容进行一些检查,以了解何时接收到所有内容,这并不少见。如果你想