服务器端:相当于是一个接收客户端消息的分发器,为了简单,直接在接收到客户端的消息后,
直接发送给所有的客户端
package chatroom.chatserver;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
public class ChatServer {
public static void main(String[] args) {
new ChatServer().serverRun();
}
public void serverRun() {
Selector selector = null;
try {
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
ServerSocket socket = serverSocketChannel.socket();
socket.bind(new InetSocketAddress(8888));
selector = Selector.open();
// 这里只是将该channel的accept设置为了selector感兴趣的,
// 此时并没有准备好,只有当客户端有连接请求的时候,这个channel的
// 感兴趣事件才会准备好
SelectionKey register = serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
System.out.println("启动监听:8888端口");
while (true) {
// 这里只有存在准备好的事件的时候,才会返回,否则会一直阻塞
// 怎么才算准备好的? (当有相应的事件到来的时候