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();
Iterator<SelectionKey> ite = 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("我是客户端!");
}
}