繁体   English   中英

建立连接后,Java套接字读未接收到发送的写操作

[英]Java socket read not receiving write sent immediately after connection is established

我有一个Java客户端和服务器,我正在尝试编写Junit测试。 在测试中,我等待服务器和客户端之间建立连接,然后将一条消息从服务器发送到客户端以测试通信。 我发现我是否立即进行写操作,但仍未收到,并且客户端在BufferedReader.readLine()方法上保持阻塞状态。 如果我在套接字连接和服务器写调用之间添加了半秒的睡眠,则一切运行正常。

我试图弄清楚为什么需要睡眠。 我知道套接字已经生成,并且在我的waitForConnection()方法返回带有服务器和客户端已连接的报告的返回值之前,已将套接字的输入流包裹着bufferedReader。 我最好的猜测是,我需要确保在服务器调用客户端的readLine方法之前,先调用客户端的readLine方法。 但我以为套接字会自动缓冲传入的,不是立即读取的输入?

任何人都可以确认(或驳斥)我的怀疑,即我必须保证客户端在服务器调用write之前已调用readline。 并且如果需要这样做,谁能提出一种方法,使服务器可以检测客户端是否准备好接收输入,而无需执行除TCP握手之外的其他握手?

编辑:我早该说过了,但是失败的测试是测试当旧的失败时重新建立连接的能力。 客户端连接后,我的模拟服务器杀死了socket / serverSocket,几秒钟后重新打开了一个新的serverSocket并接受了来自客户端的新连接。 客户端第二次建立连接之后,写入才会失败。 我的较早测试仅测试连接,并且客户端收到写操作似乎起作用。

谢谢

任何人都可以确认(或驳斥)我的怀疑,即我必须保证客户端在服务器调用write之前已调用readline。

你不知道 服务器可以根据需要发送任何时间。

如果需要的话

不是。

您的问题出在其他地方。

我遇到了同样的问题,甚至想到了一个麻烦的确认过程。 但是实际上,您不需要等待read调用就可以解决问题了。

就我而言,我将read调用委托给了一个单独的线程。 但是尽管线程中进行了read ,但jUnit测试已成功完成

  • 还没接到电话
  • 仍在阅读过程中或
  • 更糟糕的是:线程甚至没有达到运行状态

当主jUnit-Thread已终止时。

为了证明我的假设,您可以将等待放在单元测试的末尾,而不是“在套接字连接和服务器写调用之间”,发送/接收仍然可以进行。

仅出于完整性考虑:不要忘记调用flush()

您无需在服务器写入之前确保客户端正在读取。 网络层将缓冲流量,直到流量被消耗为止。

在服务器上发出消息后,请确保在OutputStream上调用flush。 否则,在缓冲区填满之前可能无法进行实际的网络调用。 另外,您对readLine的使用可能会出现问题。 也许您不是在发出行终止符? 最好使用更基本的read(char [])方法。

如何在单元测试中销毁服务器插槽? 可能是您在发送数据之前关闭了套接字。

暂无
暂无

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

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