[英]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.