最近在阅读netty(3.2.7)源码的时候,看到服务器端接受客户端连接代码的时候嗅到了一丝不和谐的气味,具体代码见:
org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink类里面的BOSS线程:
public void run() {
final Thread currentThread = Thread.currentThread();
channel.shutdownLock.lock();
try {
for (;;) {
try {
if (selector.select(1000) > 0) {
selector.selectedKeys().clear();
}
SocketChannel acceptedSocket = channel.socket.accept();
if (acceptedSocket != null) {
registerAcceptedChannel(acceptedSocket, currentThread);
}
} catch (SocketTimeoutException e) {
// Thrown every second to get ClosedChannelException
// raised.
} catch (CancelledKeyException e) {
// Raised by accept() when the server socket was closed.
} catch (ClosedSelectorException e) {
// Raised by accept() when the server socket was closed.
} catch (ClosedChannelException e) {
// Closed as requested.
break;
} catch (Throwable e) {

在研究Netty 3.2.7源码时,发现NioServerSocketPipelineSink的BOSS线程可能引发高并发环境下客户端连接丢包。代码中清除了所有SelectionKey并仅接受一个连接。通过修改代码进行测试,证实了该问题。在后续的Netty 3.6.5版本中,服务器端的Boss代码进行了改进,根据SelectionKey数量处理客户端请求,可能已解决丢包问题。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



