gpt4 book ai didi

java - 如何关闭被阻止的 SSLSocket?

转载 作者:行者123 更新时间:2023-11-29 03:38:31 28 4
gpt4 key购买 nike

我有一个 Java 服务器需要关闭所有连接的选项。作为其中的一部分,我在每个客户端套接字上调用 close() 。我遇到的问题是这个调用有时会无限期地阻塞。

我只能通过模拟数百个用户来重现这一点,因此很难确定,但我怀疑当该套接字在写入时被阻塞时会发生这种情况。

我在另一个问题中读到,在套接字上调用 shutdownOutput() 有帮助,但 SSLSocket(我正在使用)不支持它。

还有别的办法吗?是否发送排队等待写入的任何数据并不重要 - 我只需要终止连接即可。

最佳答案

在对我自己的应用程序进行了大量测试之后,我或许能够对此有所了解。我观察到的现象如下:

关闭 JavaSSLSocket ,已打开并在 Thread 中处理A,来自并发 Thread Bclose()调用有时会阻塞直到下一个 read()Thread A,然后返回指示 EOF .在对 close() 的异步调用之间在 Thread B 和任何 read()Thread AA 可以成功执行write()该套接字上的操作。

我现在认为只有在 Thread 时才会出现这种情况。 B 执行 close()startHandshake() 之前Thread 发起的调用A 已经完成。之后关闭SSLSocket似乎就没有问题了异步。

这给我们留下了如何解决问题的问题。显然,一些基于状态的行为会有所帮助。

如果一个人可以忍受异步的延迟close()Thread B,调用 getSession()之前close()似乎工作得很好,因为它让 B 等到 A 准备好 SSL session 。但是,这可能会导致每个套接字出现延迟,并且在 close() 的情况下也可能会导致额外的工作量。不会在 Thread 中执行BA 开始使用套接字之前。

更好但不那么简单的解决方案是使用两个单向标志。 A 将使用一个 ( handshakeDone ) 来指示 SSL 握手已完成(B 没有非阻塞 API 方式来找出这一点)。另一个 ( toBeClosed ) 将被 B 用来指示套接字应该关闭。

A 会检查 toBeClosed在执行握手之后。 B 会调用 close()如果handshakeDone为 false 或设置 toBeClosed否则。

请注意,要使其成功,AB 中都需要有原子 block 。我将把具体的实现(与上述算法相比可能进行了优化)留给您。

可能还有其他情况异步close()不过,对 SSL 套接字的调用行为不当。

关于java - 如何关闭被阻止的 SSLSocket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14232420/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com