网络编程基础-Nio

master
bingor 3 years ago
parent 4d810fc5b9
commit 4de53a806b

@ -0,0 +1,112 @@
package com.msb.io.nio;/**
* @Author bingor
* @Date 2022/10/26 17:25
* @Description: com.msb.io.nio
* @Version: 1.0
*/
import java.io.ByteArrayOutputStream;
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.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
*@ClassName PoolServer
*@Description TODO
*@Author bingor
*@Date 2022/10/26 17:25
*@Version 3.0
*/
public class PoolServer {
private Selector selector;
private ExecutorService pool = Executors.newFixedThreadPool(10);
public void initServer(int port) throws IOException {
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.bind(new InetSocketAddress(port));
ssc.configureBlocking(false);
this.selector = Selector.open();
ssc.register(this.selector, SelectionKey.OP_ACCEPT);
}
public void listen() throws IOException {
//轮询访问selector
while (true) {
selector.select();
Set<SelectionKey> selectionKeys = selector.selectedKeys();
Iterator<SelectionKey> iterator = selectionKeys.iterator();
while (iterator.hasNext()) {
SelectionKey key = iterator.next();
iterator.remove();
if(key.isAcceptable()) {
ServerSocketChannel scc = (ServerSocketChannel) key.channel();
SocketChannel sc = scc.accept();
sc.configureBlocking(false);
sc.register(key.selector(), SelectionKey.OP_READ);
} else if(key.isReadable()) {
key.interestOps(key.interestOps()&(~SelectionKey.OP_READ));
pool.execute(new ThreadHandlerChannel(key));
}
}
}
}
public static void main(String[] args) throws IOException {
PoolServer poolServer = new PoolServer();
poolServer.initServer(8888);
poolServer.listen();
}
}
class ThreadHandlerChannel extends Thread {
private SelectionKey key;
public ThreadHandlerChannel(SelectionKey key) {
this.key = key;
}
@Override
public void run() {
SocketChannel sc = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
int size = 0;
while ((size = sc.read(buffer)) > 0) {
buffer.flip();
baos.write(buffer.array(), 0, size);
buffer.clear();
}
baos.close();
byte[] content = baos.toByteArray();
ByteBuffer writeBuf = ByteBuffer.allocate(content.length);
writeBuf.put(content);
writeBuf.flip();
sc.write(writeBuf);
if(size == -1) {
sc.close();
} else {
this.key.interestOps(this.key.interestOps()|SelectionKey.OP_READ);
this.key.selector().wakeup();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}

@ -0,0 +1,67 @@
package com.msb.io.nio;/**
* @Author bingor
* @Date 2022/10/26 14:04
* @Description: com.msb.io.nio
* @Version: 1.0
*/
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.Set;
/**
*@ClassName Server
*@Description TODO
*@Author bingor
*@Date 2022/10/26 14:04
*@Version 3.0
*/
public class Server {
public static void main(String[] args) throws IOException {
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.bind(new InetSocketAddress(8888));
ssc.configureBlocking(false);
System.out.println("server started, listening on :" + ssc.getLocalAddress());
Selector selector = Selector.open();
ssc.register(selector, SelectionKey.OP_ACCEPT);
//轮询
while(true) {
selector.select();
Set<SelectionKey> set = selector.selectedKeys();
Iterator<SelectionKey> iterator = set.iterator();
while (iterator.hasNext()) {
SelectionKey key = iterator.next();
iterator.remove();
handle(key);
}
}
}
private static void handle(SelectionKey key) throws IOException {
if(key.isAcceptable()) {
ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
ssc.configureBlocking(false);
ssc.register(key.selector(), SelectionKey.OP_READ);
} else if(key.isReadable()) {
SocketChannel sc = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(512);
buffer.clear();
int len = sc.read(buffer);
if(len != -1) {
System.out.println(new String(buffer.array(), 0, len));
}
ByteBuffer bufferToWrite = ByteBuffer.wrap("hello, client".getBytes());
sc.write(bufferToWrite);
}
}
}
Loading…
Cancel
Save