服务器
java
package chat;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
/**
* @author: zh
* @create: 2023-09-13 10:52
*/
public class Server {
private Selector selector;
private ServerSocketChannel serverSocketChannel;
private static final int PORT = 666;
public Server() throws IOException {
selector = Selector.open();
serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
serverSocketChannel.socket().bind(new InetSocketAddress(PORT));
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
}
public void listen() throws IOException {
while (true) {
int count = selector.select();
if (count > 0) {
Iterator<SelectionKey> iterator = selector.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(socketChannel.getRemoteAddress() + " up");
} else if (key.isReadable()) {
read(key);
}
iterator.remove();
}
}
}
}
private void read(SelectionKey key) throws IOException {
SocketChannel socketChannel = null;
try {
socketChannel = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int count = socketChannel.read(buffer);
if (count > 0) {
String msg = new String(buffer.array());
System.out.println(msg);
send(msg, socketChannel);
}
} catch (Exception e) {
System.out.println(socketChannel.getRemoteAddress() + " down");
key.channel();
socketChannel.close();
}
}
private void send(String msg, SocketChannel self) throws IOException {
System.out.println("send...");
for (SelectionKey key : selector.keys()) {
Channel channel = key.channel();
if (channel instanceof SocketChannel && channel != self) {
SocketChannel target = (SocketChannel) channel;
ByteBuffer byteBuffer = ByteBuffer.wrap(msg.getBytes());
target.write(byteBuffer);
}
}
}
public static void main(String[] args) throws IOException {
new Server().listen();
}
}
客户端
java
package chat;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.Scanner;
/**
* @author: zh
* @create: 2023-09-13 11:25
*/
public class Client {
private static final int PORT = 666;
private static final String HOST = "127.0.0.1";
private SocketChannel socketChannel;
private Selector selector;
private String username;
public Client() throws IOException {
selector = Selector.open();
socketChannel = socketChannel.open(new InetSocketAddress(HOST, PORT));
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ);
username = socketChannel.getLocalAddress().toString().substring(1);
System.out.println("ready");
}
private void send(String info) throws IOException {
info = username + " say " + info;
socketChannel.write(ByteBuffer.wrap(info.getBytes()));
}
private void read() throws IOException {
int count = selector.select();
if (count > 0) {
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
while (iterator.hasNext()) {
SelectionKey key = iterator.next();
if (key.isReadable()) {
SocketChannel channel = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
channel.read(buffer);
String msg = new String(buffer.array());
System.out.println(msg);
}
}
}
}
public static void main(String[] args) throws IOException {
Client client = new Client();
new Thread(() -> {
while (true) {
try {
client.read();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String msg = scanner.nextLine();
client.send(msg);
}
}
}