有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

无多线程的java多客户端程序

有没有办法不用多线程就用Java中的socket编写多客户端程序

我听说过socket映射,但它是如何工作的

我知道多线程,但现在我不应该使用它


共 (1) 个答案

  1. # 1 楼答案

    我只是把它拼凑起来。这只是一个用java编程的例子。nio。我认为这个代码相当直截了当。它将服务器套接字绑定到端口3000-3009。每当客户机发送数据时,它都会将数据回显给他们。它可以处理尽可能多的连接。当然,您应该实现更多的错误处理,但这将更难阅读以供参考。以这种方式处理数据比使用每个客户端线程的方法要困难一些,如果您希望有一个混合类型的服务器,其中非活动连接进入非阻塞模式,并且当您开始接收数据时,可以使用缓存的线程池跳回阻塞模式

    要测试它,只需打开一个shell并使用telnet localhost 3000

      Selector selector = Selector.open();
      for(int port=3000;port<3010;port++){
         ServerSocketChannel server = ServerSocketChannel.open();
         server.configureBlocking(false);
         server.socket().bind(new InetSocketAddress(port));
         server.register(selector, SelectionKey.OP_ACCEPT);
         System.out.println("Bound to " + server);
      }
    
      ByteBuffer buffer = ByteBuffer.allocate(0x4000);
      while(selector.isOpen()){
         selector.select();
         Iterator<SelectionKey> keys = selector.selectedKeys().iterator();
         while(keys.hasNext()){
            SelectionKey key = keys.next();
            if(!key.isValid()) continue;
    
            if(key.isReadable()){
               buffer.clear();
               SocketChannel socket = (SocketChannel)key.channel();
               if(socket.read(buffer) == -1){ //-1 is end of stream
                  System.out.println("Client Disconnected " + socket);
                  socket.close();
                  continue;
               }else{
                  buffer.flip();
                  socket.write(buffer); //echo data back to client
               }
    
            }else if(key.isAcceptable()){
               ServerSocketChannel serverChannel = (ServerSocketChannel)key.channel();
               SocketChannel socket = serverChannel.accept();
               socket.configureBlocking(false);
               socket.register(selector, SelectionKey.OP_READ);
               System.out.println("Client Connected " + socket);
            }
         }
         selector.selectedKeys().clear();
      }