无多线程的java多客户端程序 2 年,3 月 Questions & Answers 1733 有没有办法不用多线程就用Java中的socket编写多客户端程序 我听说过socket映射,但它是如何工作的 我知道多线程,但现在我不应该使用它
# 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(); }
# 1 楼答案
我只是把它拼凑起来。这只是一个用java编程的例子。nio。我认为这个代码相当直截了当。它将服务器套接字绑定到端口3000-3009。每当客户机发送数据时,它都会将数据回显给他们。它可以处理尽可能多的连接。当然,您应该实现更多的错误处理,但这将更难阅读以供参考。以这种方式处理数据比使用每个客户端线程的方法要困难一些,如果您希望有一个混合类型的服务器,其中非活动连接进入非阻塞模式,并且当您开始接收数据时,可以使用缓存的线程池跳回阻塞模式
要测试它,只需打开一个shell并使用telnet localhost 3000