建立连接后,Java套接字读取不接收立即发送的写入

时间:2011-03-16 14:23:03

标签: java sockets

我有一个java客户端和服务器我正在尝试编写Junit测试。在我的测试中,我等待服务器和客户端之间的连接,然后从服务器到客户端写一条消息来测试通信。我发现如果我立即写入它没有收到,客户端在BufferedReader.readLine()方法上保持阻塞状态。如果我在套接字连接和服务器写入调用之间添加休眠半秒,那么一切都能正常工作。

我正在试图找出为什么需要睡眠。我知道在我的waitForConnection()方法返回一个服务器和客户端连接的报告之前,套接字已经生成并且bufferedReader包裹着它的输入流。我最好的猜测是我需要确保在服务器调用它的write方法之前调用客户端的readLine方法;但我认为套接字会自动缓冲进来的输入并且不能立即读取?

任何人都可以确认(或反驳)我怀疑我必须保证客户端在服务器调用write之前调用了readline。如果这是必需的,任何人都可以建议一种方法,服务器可以检测客户端是否已准备好接收输入,而不必在TCP握手之外实现另一次握手?

编辑:我应该早点说出来,但是失败的测试是测试在旧连接失败时重新建立连接的能力。客户端连接后,我的模拟服务器终止socket / serverSocket,几秒钟后重新打开一个新的serverSocket并接受来自客户端的新连接。它是在客户端第二次建立连接后写入错误的。我之前的测试只测试连接,客户端收到写入似乎有效。

由于

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

  

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

你没有。服务器可以随时发送。

  

如果需要的话

不是。

你的问题出在其他地方。

答案 2 :(得分:0)

我遇到了同样的问题,甚至考虑过一个繁琐的确认过程。但实际上你不需要等待read被调用,问题就在其他地方。

在我的情况下,我将读取调用委托给一个单独的线程。但是,尽管线程中的read

,jUnit测试仍然成功完成
  • 还没有被召唤,
  • 仍处于阅读过程或
  • 更糟糕的是:线程甚至没有达到运行状态

主jUnit-Thread已经终止。

为了证明我的假设你可以把等待放在单元测试结束而不是#34;在套接字连接和服务器写入调用之间#34;发送/接收仍然有效。

为了完整起见:请不要忘记致电flush()

答案 3 :(得分:-1)

如何破坏单元测试中的服务器套接字?可能是在发送数据之前关闭套接字。