package easing.common.java.demo;
import lombok.SneakyThrows;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.Set;
@SuppressWarnings("all")
public class Demo {
public static void main(String[] args) {
new Thread(Demo::startServer).start();
new Thread(Demo::startClient).start();
}
@SneakyThrows
protected static void startServer() {
//创建ServerSocketChannel
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress(5555));
serverSocketChannel.configureBlocking(false);
//注册Selector
Selector selector = Selector.open();
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
//Selector监听事件
while (true) {
int result = selector.select(2000L);
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> iterator = selectedKeys.iterator();
while (iterator.hasNext()) {
SelectionKey key = iterator.next();
//有客户端连接
if (key.isAcceptable()) {
SocketChannel socketChannel = serverSocketChannel.accept();
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ);
System.out.println("Client Connected");
}
//有客户端可读
else if (key.isReadable()) {
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
SocketChannel channel = (SocketChannel) key.channel();
while (channel.read(byteBuffer) > 0) {
byteBuffer.flip();
System.out.println("Receive Data from Client: " + new String(byteBuffer.array(), 0, byteBuffer.remaining()));
byteBuffer.clear();
}
}
//移除已处理过的事件
iterator.remove();
}
}
}
@SneakyThrows
protected static void startClient() {
Thread.currentThread().sleep(2000L);
//创建ClientSocketChannel
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false);
//连接Server
InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", 5555);
socketChannel.connect(inetSocketAddress);
while (!socketChannel.finishConnect())
Thread.currentThread().sleep(100L);
//向服务端发送数据
for (int i = 0; i < 100; i++) {
Thread.currentThread().sleep(2000L);
ByteBuffer byteBuffer = ByteBuffer.wrap("connect".getBytes());
socketChannel.write(byteBuffer);
}
//关闭ClientSocketChannel
socketChannel.close();
}
}