日期:2014-05-20  浏览次数:20743 次

启动mina2.0服务以后,会建立多个链接(tcp)
问题描述:我建了一个简单的mina2.0应用,在win xp上启动以后发现会在系统上占用多个端口。在linux上则因为建立过多链接无法启动。
mina所用的版本:mina-*-2.0.0-RC1 系列jar包

代码:
Java code

import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

import cn.com.beapp.server.common.MessageCodecFactory;

public class TestServer {
    
    public static void main(String[] args) {
        NioSocketAcceptor acceptor = new NioSocketAcceptor();
        
        try {
            acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new MessageCodecFactory()));
            
            acceptor.setHandler(new TestHandle());
            
            acceptor.getSessionConfig().setReadBufferSize(1024 * 20);
            acceptor.getSessionConfig().setSendBufferSize(1024 * 20);
            acceptor.getSessionConfig().setReceiveBufferSize(1024 * 20);
            
            acceptor.bind(new InetSocketAddress(10001));
        } catch (IOException e) {
        }
    }
}


//相关Handle类
import org.apache.mina.core.service.IoHandlerAdapter;

public class TestHandle extends IoHandlerAdapter {
    
    
}



启动后的netstat状态:
C:\Documents and Settings\Administrator>netstat

Active Connections

  Proto Local Address Foreign Address State
  TCP LIZHOU:5098 localhost:5099 ESTABLISHED
  TCP LIZHOU:5099 localhost:5098 ESTABLISHED
  TCP LIZHOU:5100 localhost:5101 ESTABLISHED
  TCP LIZHOU:5101 localhost:5100 ESTABLISHED
  TCP LIZHOU:5102 localhost:5103 ESTABLISHED
  TCP LIZHOU:5103 localhost:5102 ESTABLISHED
  TCP LIZHOU:5104 localhost:5105 ESTABLISHED
  TCP LIZHOU:5105 localhost:5104 ESTABLISHED
  TCP LIZHOU:2695 219.133.62.2:http ESTABLISHED
  TCP LIZHOU:3649 219.133.62.2:http CLOSE_WAIT
  TCP LIZHOU:4547 219.133.62.2:http CLOSE_WAIT
  TCP LIZHOU:4784 121.14.11.70:http CLOSE_WAIT
  TCP LIZHOU:4854 bg-in-f104.1e100.net:http CLOSE_WAIT

C:\Documents and Settings\Administrator>


启用前的netstat状态:
C:\Documents and Settings\Administrator>netstat

Active Connections

  Proto Local Address Foreign Address State
  TCP LIZHOU:2695 219.133.62.2:http ESTABLISHED
  TCP LIZHOU:3649 219.133.62.2:http CLOSE_WAIT
  TCP LIZHOU:4547 219.133.62.2:http CLOSE_WAIT
  TCP LIZHOU:4784 121.14.11.70:http CLOSE_WAIT
  TCP LIZHOU:4854 bg-in-f104.1e100.net:http CLOSE_WAIT

C:\Documents and Settings\Administrator>

请各位路过的高手看看,帮忙解答,有高分相赠哦。谢谢!

------解决方案--------------------
netstat -o 看哪个进程
------解决方案--------------------
楼主看一下专家的那两篇文章吧:Java NIO类库Selector机制解析(上、下)

http://blog.csdn.net/haoel/archive/2008/03/27/2224055.aspx
http://blog.csdn.net/haoel/archive/2008/03/27/2224069.aspx
------解决方案--------------------
你用的是 Mina 2.0RC 版吧,刚才看了一下 Mina 的源代码。在 Mina 中会根据服务器处理器 + 1 的数量来创建NioProcessor 而 JDK 中的 Windows 的 NIO 实现需要使用一对互联的端口进行通知之用。

如果要减小这个数量的话,可以指定处理器的数量,使用 NioSocketAcceptor 带有 int 参数的构造,比如传个 1 进去(这是最小值了)。这时 NioProcessor 将使用一个 Selector 通道。但是 NioSocketAcceptor 中也有一个 Selector 通道。因此在 MINA 中最少得有两个 Selector 通道,在 Windows NIO 中会建立两对互联的 TCP 通道。