2011-03-16 66 views
0

我有一个Java客户端和服务器我试图写Junit测试。在我的测试中,我等待服务器和客户端之间的连接,然后写一条消息到服务器到客户端来测试通信。我发现如果我立即执行写操作,它没有收到,并且客户端在BufferedReader.readLine()方法中保持阻塞状态。如果我在套接字连接和服务器写入调用之间添加一个半秒的睡眠,那么一切都可以正常工作。Java套接字读取未收到连接建立后立即发送写入

我想弄清楚为什么需要睡眠。我知道套接字已经生成,并且在我的waitForConnection()方法返回一个服务器和客户端已连接的报告之前,在其输入流周围封装了一个bufferedReader。我最好的猜测是,我需要确保在服务器调用write方法之前调用客户端的readLine方法;但我认为套接字会自动缓冲输入并且不立即读取?

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

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

感谢

回答

0

你并不需要确保客户端读取服务器写入之前。网络层将缓冲流量直到消耗完。

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

+0

谢谢你的意见,但我已经确保既冲洗和换行正在做。同花顺的东西确实会导致我原来的测试失败,但那个更容易理解。 – user623257 2011-03-16 15:20:27

-1

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

+0

serverSocket作为单元测试的拆卸方法的一部分被关闭。由于我的代码等待客户端读取服务器消息的时间长达五秒钟,所以我认为拆卸并不会造成干扰。在测试过程中,我还关闭了ServerSocket以模拟连接故障,请参阅我添加到我的描述中的段落以了解详细信息 – user623257 2011-03-16 15:28:13

+0

关闭“ServerSocket”对从接受的套接字传输的数据没有影响。如果你的意思是'Socket',在发送数据之前关闭它会导致send发送'socket is closed'异常。 – EJP 2014-08-04 00:18:49

0

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

你不知道。服务器可以随时发送它喜欢的内容。

,如果这是需要

它不是。

你的问题在别处。

0

我有同样的问题,甚至想到一个繁琐的确认过程。但事实上,您不需要等待read才能被调用,而且问题位于其他位置。

在我的情况下,我将阅读调用委托给一个单独的线程。但是JUnit测试成功完成虽然read在线程

  • 没有被调用呢,
  • 仍然在阅读过程中或
  • 更糟:线程甚至没有达到运行状态

当主jUnit线程已经终止。

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

只是为了完整性:不要忘了叫flush()

相关问题