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