Java套接字读取未接收连接建立后立即发送的写入
我有一个java客户机和服务器,我正在尝试编写Junit测试。在我的测试中,我等待服务器和客户端之间建立连接,然后在服务器和客户端之间写一条消息来测试通信。我发现,如果我立即执行写入操作,它将不会被接收,并且客户端将在BufferedReader.readLine()方法上保持阻塞状态。如果我在套接字连接和服务器写调用之间加上半秒钟的睡眠,一切都会正常工作 我在想为什么需要睡觉。我知道在waitForConnection()方法返回服务器和客户机已连接的报告之前,套接字已经生成,bufferedReader已经包围了它的输入流。我最好的猜测是,我需要确保在服务器调用客户机的write方法之前调用客户机的readLine方法;但我认为套接字会自动缓冲输入,而不是立即读取 有人能证实(或反驳)我的怀疑吗?我必须保证客户端在服务器调用write之前调用了readline。如果这是必需的,有谁能建议一种方法,让服务器能够检测客户机是否准备好接收输入,而不必执行TCP握手之外的另一次握手 编辑:我应该早点说,但是失败的测试是测试在旧连接失败时重新启动连接的能力。在客户端连接之后,我的模拟服务器将终止socket/serverSocket,几秒钟后重新打开一个新的serverSocket并接受来自客户端的新连接。在客户端第二次建立连接后,写入失败。我之前的测试只是测试一个连接,而客户端收到一个写操作,这似乎可以正常工作Java套接字读取未接收连接建立后立即发送的写入,java,sockets,Java,Sockets,我有一个java客户机和服务器,我正在尝试编写Junit测试。在我的测试中,我等待服务器和客户端之间建立连接,然后在服务器和客户端之间写一条消息来测试通信。我发现,如果我立即执行写入操作,它将不会被接收,并且客户端将在BufferedReader.readLine()方法上保持阻塞状态。如果我在套接字连接和服务器写调用之间加上半秒钟的睡眠,一切都会正常工作 我在想为什么需要睡觉。我知道在waitForConnection()方法返回服务器和客户机已连接的报告之前,套接字已经生成,buffered
谢谢在服务器写入之前,您无需确保客户端正在读取。网络层将缓冲流量,直到其被消耗
确保在服务器上发出消息后对OutputStream调用flush。否则,在缓冲区填满之前,可能不会进行实际的网络调用。此外,您使用readLine可能会有问题。也许您没有发出行终止字符?使用更基本的读取(char[])方法可能更好。如何在单元测试中销毁服务器套接字?可能是在发送数据之前关闭了套接字 有人能证实(或反驳)我的怀疑吗?我必须保证客户端在服务器调用write之前调用了readline 你没有。服务器可以在它喜欢的任何时间发送 如果需要的话 事实并非如此
你的问题在别处。我也有同样的问题,甚至考虑过繁琐的确认流程。但事实上,您不需要等待
读取
被调用,问题就出现在其他地方
在我的例子中,我将读取调用委托给一个单独的线程。但是jUnit测试成功地完成了,尽管线程中的read
- 还没接到电话
- 仍在阅读过程中或
- 更糟糕的是:线程甚至没有达到运行状态
为了完整起见:不要忘记调用flush()谢谢您的反馈,但我已经确保flush和换行都已完成。flush事件确实导致了我最初的测试失败,但这一点更容易理解。serverSocket作为单元测试的拆卸方法的一部分被关闭。由于我的代码等待客户机读取服务器消息的时间长达5秒,因此我不认为拆卸会造成干扰。我还在测试过程中关闭ServerSocket以模拟连接faiilure,有关详细信息,请参阅我在描述中添加的段落关闭
ServerSocket
对从接受的套接字传输的数据没有影响。如果您的意思是Socket
,在发送数据之前关闭它将导致发送抛出“Socket is closed”异常。