NIO Server
package com.nio.server; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.*; import java.nio.charset.StandardCharsets; import java.util.Iterator; public class NIOServer { private Selector selector; ServerSocketChannel serverSocketChannel; public void initServer(int port) throws IOException { //打开一个通道 serverSocketChannel = ServerSocketChannel.open(); //通道设置非阻塞 serverSocketChannel.configureBlocking(false); //绑定端口号 serverSocketChannel.socket().bind(new InetSocketAddress("localhost", port)); //注册 this.selector = Selector.open(); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); } public void listen() throws IOException { System.out.println("服务启动成功..."); while (true) { selector.select(); Iteratorite = selector.selectedKeys().iterator(); while (ite.hasNext()) { SelectionKey key = ite.next(); if (key.isAcceptable()) { SocketChannel channel = serverSocketChannel.accept(); channel.configureBlocking(false); channel.register(selector, SelectionKey.OP_READ); } if (key.isReadable()) { recvAndReply(key); } ite.remove(); } } } public void recvAndReply(SelectionKey key) throws IOException { SocketChannel channel = (SocketChannel) key.channel(); ByteBuffer buffer = ByteBuffer.allocate(1024); int i = channel.read(buffer); if (i != -1) { String msg = new String(buffer.array()).trim(); System.out.println("NIO服务端收到消息:" + msg); channel.write(ByteBuffer.wrap("我是服务端!".getBytes(StandardCharsets.UTF_8))); System.out.println("NIO服务端返回消息:" + "我是服务端!"); } else { channel.close(); } } public static void main(String[] args) throws IOException { NIOServer server = new NIOServer(); server.initServer(8080); server.listen(); } }
NIO Client
package com.nio.client; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; public class NIOClient { SocketChannel channel; public void initClient(String host, int port) throws IOException { //构造socket连接 InetSocketAddress servAddr = new InetSocketAddress(host, port); //打开连接 this.channel = SocketChannel.open(servAddr); } public void sendAndRecv(String words) throws IOException { byte[] msg = words.getBytes(); ByteBuffer buffer = ByteBuffer.wrap(msg); System.out.println("客户端发送消息: " + words); channel.write(buffer); buffer.clear(); channel.read(buffer); System.out.println("客户端收到消息: " + new String(buffer.array()).trim()); channel.close(); } public static void main(String[] args) throws IOException { NIOClient client = new NIOClient(); client.initClient("localhost", 8080); client.sendAndRecv("我是客户端!"); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)