Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无多线程的多客户端程序_Java_Sockets_Client Server - Fatal编程技术网

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

Java 无多线程的多客户端程序,java,sockets,client-server,Java,Sockets,Client Server,有没有办法在Java中使用套接字编写多客户端程序而不使用多线程 我听说过套接字映射,但它是如何工作的 我知道多线程,但现在我不应该使用它。我只是把它放在一起。这只是使用java.nio编程的一个示例。我认为这个代码相当直截了当。它将服务器套接字绑定到端口3000-3009。每当客户机发送数据时,它都会将数据回显给他们。它可以处理尽可能多的连接。当然,您应该实现更多的错误处理,但这将更难阅读以供参考。以这种方式处理数据比使用每个客户端线程的方法要困难一些,如果您希望有一个混合类型的服务器,其中非活

有没有办法在Java中使用套接字编写多客户端程序而不使用多线程

我听说过套接字映射,但它是如何工作的


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

我只是把它放在一起。这只是使用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();
  }
Selector=Selector.open();

对于(int port=3000;portlike只是在一个类中有两个套接字?或者什么?这是为了服务器?还是客户端?您可以使用非阻塞IO创建一个单线程服务器。但是我不会。多线程和多个CPU是扩展单个机箱的唯一方法。现代系统过于依赖多线程。删除多线程不是一件容易的事st practice@3kings客户端需要相互通信…@markspace您的意思是什么?(单线程)多个客户端如何实现client@faraa请参见下面Walter的示例。这就是我的意思。请注意,他将选择器设置为非阻塞模式(
server.configureBlocking(false)
).thank's…所以没有任何方法可以使用传统IO来解决这个问题…是吗?如果你是指java.IO包,那么不是。这些都是阻塞套接字。如果你想查看我没有使用过的库,但得到很多赞扬,你可以查看