import java.io.IOException; import java.net.InetSocketAddress; 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.Scanner; import java.util.Set;
/** * 类说明 :NIO服务端的读写 * @author 郭莹棋 * @date 2018年10月19日 */
public class NioServerGy { public static void main(String[] args) throws IOException { int port = 5555; //获取ServerSocket信道实例 ServerSocketChannel sc = ServerSocketChannel.open(); //绑定信道端口 sc.bind(new InetSocketAddress(port)); //设置为非阻塞 sc.configureBlocking(false); //获取Selector实例 Selector s = Selector.open(); //当前信道接受网络请求 sc.register(s, SelectionKey.OP_ACCEPT); //设置标识 int num = 0; //开辟一个50字节的空间出来 ByteBuffer buffer = ByteBuffer.allocate(50); //获取所有信道数量 while((num = s.select()) >= 0) { Set<SelectionKey> keys = s.selectedKeys(); Iterator<SelectionKey> iterator = keys.iterator(); while(iterator.hasNext()) { SelectionKey key = iterator.next(); if(!key.isValid()) { key.cancel(); continue; } if(key.isAcceptable()) { System.out.println("当前信道为接收请求"); //当前信道接收请求 ServerSocketChannel channel = (ServerSocketChannel)key.channel(); //获取相连的客户端请求 SocketChannel client = channel.accept(); //设置接收数据信道为非阻塞 client.configureBlocking(false); //将该信道注册到Selector上 channel.register(s, SelectionKey.OP_READ); key.cancel(); continue; } if(key.isReadable()) { SocketChannel channel = (SocketChannel)key.channel(); int read = channel.read(buffer); String string = new String(buffer.array(),0,buffer.remaining()); System.out.println("[client]"+string); buffer.clear(); String recvMsg = "[server]"+string; buffer.put(recvMsg.getBytes()); //buffer.flip(); //channel.write(buffer); channel.register(s,SelectionKey.OP_WRITE ); buffer.clear(); key.cancel(); continue; } if(key.isWritable()) { SocketChannel channel = (SocketChannel)key.channel(); Scanner cc = new Scanner(System.in); String ss = cc.nextLine(); channel.write(ByteBuffer.wrap(ss.getBytes())); } } } } }