Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java套接字读取未接收连接建立后立即发送的写入_Java_Sockets - Fatal编程技术网

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

Java套接字读取未接收连接建立后立即发送的写入,java,sockets,Java,Sockets,我有一个java客户机和服务器,我正在尝试编写Junit测试。在我的测试中,我等待服务器和客户端之间建立连接,然后在服务器和客户端之间写一条消息来测试通信。我发现,如果我立即执行写入操作,它将不会被接收,并且客户端将在BufferedReader.readLine()方法上保持阻塞状态。如果我在套接字连接和服务器写调用之间加上半秒钟的睡眠,一切都会正常工作 我在想为什么需要睡觉。我知道在waitForConnection()方法返回服务器和客户机已连接的报告之前,套接字已经生成,buffered

我有一个java客户机和服务器,我正在尝试编写Junit测试。在我的测试中,我等待服务器和客户端之间建立连接,然后在服务器和客户端之间写一条消息来测试通信。我发现,如果我立即执行写入操作,它将不会被接收,并且客户端将在BufferedReader.readLine()方法上保持阻塞状态。如果我在套接字连接和服务器写调用之间加上半秒钟的睡眠,一切都会正常工作

我在想为什么需要睡觉。我知道在waitForConnection()方法返回服务器和客户机已连接的报告之前,套接字已经生成,bufferedReader已经包围了它的输入流。我最好的猜测是,我需要确保在服务器调用客户机的write方法之前调用客户机的readLine方法;但我认为套接字会自动缓冲输入,而不是立即读取

有人能证实(或反驳)我的怀疑吗?我必须保证客户端在服务器调用write之前调用了readline。如果这是必需的,有谁能建议一种方法,让服务器能够检测客户机是否准备好接收输入,而不必执行TCP握手之外的另一次握手

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


谢谢

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


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

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

有人能证实(或反驳)我的怀疑吗?我必须保证客户端在服务器调用write之前调用了readline

你没有。服务器可以在它喜欢的任何时间发送

如果需要的话

事实并非如此


你的问题在别处。

我也有同样的问题,甚至考虑过繁琐的确认流程。但事实上,您不需要等待
读取
被调用,问题就出现在其他地方

在我的例子中,我将读取调用委托给一个单独的线程。但是jUnit测试成功地完成了,尽管线程中的
read

  • 还没接到电话
  • 仍在阅读过程中或
  • 更糟糕的是:线程甚至没有达到运行状态
当主jUnit线程已经终止时

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


为了完整起见:不要忘记调用flush()

谢谢您的反馈,但我已经确保flush和换行都已完成。flush事件确实导致了我最初的测试失败,但这一点更容易理解。serverSocket作为单元测试的拆卸方法的一部分被关闭。由于我的代码等待客户机读取服务器消息的时间长达5秒,因此我不认为拆卸会造成干扰。我还在测试过程中关闭ServerSocket以模拟连接faiilure,有关详细信息,请参阅我在描述中添加的段落关闭
ServerSocket
对从接受的套接字传输的数据没有影响。如果您的意思是
Socket
,在发送数据之前关闭它将导致发送抛出“Socket is closed”异常。