Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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_Exception - Fatal编程技术网

Java套接字中的写操作是否可能在没有同步读操作的情况下抛出?

Java套接字中的写操作是否可能在没有同步读操作的情况下抛出?,java,sockets,exception,Java,Sockets,Exception,假设我有两个线程,一个用于阅读,一个用于发送;如果写入失败,另一个线程中的读取操作是否也会失败 我认为至少有一种情况不是这样的(如果发送线程被中断,则InterruptedIOException),但还有其他情况吗?如果是这样,这些情况中是否有一些与网络问题有关?当另一端的套接字关闭时,您可能无法写入(因为数据无处可去),但可能有未读的数据,您仍然可以读取 如果读操作超时,可能需要关闭套接字并终止任何写操作。e、 g.如果另一端已锁定。如果不这样做,写入线程可能会永远阻止等待写入已超时(可能永远

假设我有两个线程,一个用于阅读,一个用于发送;如果写入失败,另一个线程中的读取操作是否也会失败


我认为至少有一种情况不是这样的(如果发送线程被中断,则InterruptedIOException),但还有其他情况吗?如果是这样,这些情况中是否有一些与网络问题有关?

当另一端的套接字关闭时,您可能无法写入(因为数据无处可去),但可能有未读的数据,您仍然可以读取


如果读操作超时,可能需要关闭套接字并终止任何写操作。e、 g.如果另一端已锁定。如果不这样做,写入线程可能会永远阻止等待写入已超时(可能永远)的套接字。

我想这取决于您的情况。可能最常见的情况是你的连接关闭,这意味着阅读和写作都会失败。然而,这并不一定是真的。你可能有一些奇怪的防火墙设置,允许你读而不写


我给你的建议是单独编写每个线程,而不是想出每个可能的场景。如果你试着去阅读,但你不能,会发生什么?如果您尝试在另一个线程中写入,但无法完成,会发生什么情况?如果两个线程都可以读写非常重要,那么设计一些回退机制,如果当前线程在某些方面出现问题(当然,如果另一个线程仍然处于活动状态),则停止另一个线程。

另一种方法是关闭套接字进行写入。你不能写,但仍然可以读。

事实上,我想知道是否有写失败的情况也会导致关闭读取端,而不是等待它失败。@penpenpen,只有当写错误意味着你想放弃任何未读数据时才可以。我想不出一个好的理由来这样做。我不太清楚:我感兴趣的是,在哪些情况下(如果有的话),我最终在写操作中失败,而读端仍然被阻塞。在这种情况下,我希望关闭并重新启动以保持一致状态。如果写的异常总是导致读的事件,那么事实上我只能让事情分开处理。很难说。如果您的internet连接突然关闭,windows会毫不犹豫地在您尝试从套接字读写时抛出异常,但这与您描述的情况不同。我的观点是,最好假设这种情况可能发生,并为这种情况做好准备,而不是看看是否可能发生这种情况,然后相应地编写代码。如果出现写入异常,几乎可以肯定是连接重置,这也会导致读取抛出,而且在任何情况下都表明连接是软管连接,因此您必须关闭它。事实上,我想不出写异常并不意味着这一点。我认为你描述的情况实际上不可能发生,因为另一个被锁定,不读取任何内容,因此TCP窗口始终为零。这实际上很容易复制(与许多其他场景相反),只需暂停读取程序-例如,如果程序在*nix上,则按ctrl-Z停止程序。实际上我们已经处理读取超时,因此这方面的事情是可以的。在我的情况下,这将是应用程序中的一个错误,因此如果这是唯一的其他情况,然后就可以忽略了。我没说这是唯一的另一个案例;-)选择这个作为答案,因为它给出了一个写抛出而读不失败的情况。