我做了一个应用,服务器ServerSocketChannel绑定端口8989
然后,我连续打开四个SocketChannel以连接到服务器:
在第个SocketChannel打开后,打印其内容为:
++ 增加任务: [127.0.0.1:8989->F:\WorkSpace\NBSpace\StudentSystem\config\resource\icon_down.gif]
+++ TcpAgent: java.nio.channels.SocketChannel[connected local=/127.0.0.1:5463 remote=/127.0.0.1:8989]
++ 增加任务: [127.0.0.1:8989->F:\WorkSpace\NBSpace\StudentSystem\config\resource\m0.gif]
+++ TcpAgent: java.nio.channels.SocketChannel[connected local=/127.0.0.1:5464 remote=/127.0.0.1:8989]
++ 增加任务: [127.0.0.1:8989->F:\WorkSpace\NBSpace\StudentSystem\config\resource\icon.png]
+++ TcpAgent: java.nio.channels.SocketChannel[connected local=/127.0.0.1:5465 remote=/127.0.0.1:8989]
++ 增加任务: [127.0.0.1:8989->F:\WorkSpace\NBSpace\StudentSystem\config\resource\tray.png]
+++ TcpAgent: java.nio.channels.SocketChannel[connected local=/127.0.0.1:5466 remote=/127.0.0.1:8989]
从上面可以看出,第个SocketChannel都在不同的端口打开了,并且每个SocketChannel的isConnected()为true;问题:服务器端总只能接受一个连接:
+++ 连接请求Key个数: 1
+++ 接收一个连接请求: java.nio.channels.SocketChannel[connected local=/127.0.0.1:8989 remote=/127.0.0.1:5463]
而其它的三个都边不上,但是他们isConnected()又为true;而服务器一直在等待连接:
int count = this.acceptSelector.select(50);
      if (count > 0) {
        Set<SelectionKey> keys = acceptSelector.selectedKeys();
        System.out.println("+++ 连接请求Key个数: " + keys.size());
        Iterator<SelectionKey> selectKeys = keys.iterator();
        while (selectKeys.hasNext()) {
          selectKeys.next();
          SocketChannel connection = this.serverSocket.accept();
          if (connection != null) {
            new TcpAgent(this.messageSelector, connection);
          }
        }
      }望各位多多指教:问题到底出在哪里?

解决方案 »

  1.   

    if (connection != null) {
                new TcpAgent(this.messageSelector, connection);
              } 我怎么没看到线程呢?
      

  2.   

    TcpAgent专门处理有关connection的读写数据,它注册到消息选择器中messageSelector.
      

  3.   

    一般用到的socket通信 最好是用线程 除了 最开始学习做测试外
    而在实际应用中 百分百要用线程控制的 楼主不妨试一下
      

  4.   

    ServerSocketChannel 就一个,所以选择出来的就一个,不管有多少个客户端在等待连接。
      

  5.   

    另外,在SocketChannel connection = this.serverSocket.accept();  后 添加selectKeys.remove() 一下。
    今天正好碰到这个问题。