package NIO;
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.Date;
import java.util.Iterator;
import java.util.Set;
/**
* @author lijiangtao
* @description 多路复用类
* @date 2020/9/23
*/
public class MultiplexerTimeServer implements Runnable{
private Selector selector;
private ServerSocketChannel serverSocketChannel;
private volatile boolean stop;
public MultiplexerTimeServer(int port){
try {
selector = Selector.open();
serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
serverSocketChannel.socket().bind(new InetSocketAddress(port),1024);
serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT);
System.out.println("time server is start in port:"+port);
}catch (Exception e){
e.printStackTrace();
System.exit(1);
}
}
@Override
public void run() {
while (!stop){
try {
selector.select(100);
Set<SelectionKey> selectionKeys = selector.selectedKeys();
Iterator<SelectionKey> iterator = selectionKeys.iterator();
SelectionKey key = null;
while (iterator.hasNext()){
key = iterator.next();
iterator.remove();
try {
this.handleInput(key);
}catch (Exception e){
if(key != null){
key.cancel();
if(key.channel() != null){
key.channel().close();
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
if (selector != null){
try {
//多路复用器selector 关闭后,上面注册的channel 和 pipe 等资源会自动关闭,释放资源
selector.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void stop(){
this.stop = true;
}
private void handleInput(SelectionKey key) throws IOException {
if(key.isValid()){
if (key.isAcceptable()) {
//处理新连接 相当于完成tcp三次握手
ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
SocketChannel sc = ssc.accept();
sc.configureBlocking(false);
//创建一个新的链接到selector
sc.register(selector,SelectionKey.OP_READ);
}
if (key.isReadable()) {
SocketChannel socketChannel = (SocketChannel) key.channel();
ByteBuffer readBuffer = ByteBuffer.allocate(1024);
int read = socketChannel.read(readBuffer);
if (read > 0){
readBuffer.flip();
byte[] bytes = new byte[readBuffer.remaining()];
readBuffer.get(bytes);
String body =new String(bytes, "UTF-8");
System.out.println("the time server receiver order :"+body);
String currentTime = "QUERY TIME ORDER".equalsIgnoreCase(body)?new Date().toString():"BAD ORDER";
this.doWrite(socketChannel,currentTime);
}else if(read < 0){
key.cancel();
socketChannel.close();
}else {
;//读取到 0 字节
}
}
}
}
private void doWrite(SocketChannel channel,String response) throws IOException {
if(response != null && response.length() > 0){
byte[] bytes = response.getBytes();
ByteBuffer writeBuffer = ByteBuffer.allocate(bytes.length);
writeBuffer.put(bytes);
writeBuffer.flip();
channel.write(writeBuffer);
}
}
}
九转成圣
- 粉丝: 5778
- 资源: 2959
最新资源
- 讲义+题目.rar
- python基于深度学习的人脸识别考勤系统源码+文档说明(高分毕业设计项目)
- Python 中实现超参数优化的朴素贝叶斯(Naive Bayes)多特征分类预测的项目示例(含完整的程序,GUI设计和代码详解)
- Python 实现CNN-RNN深度学习模型的项目示例(含完整的程序,GUI设计和代码详解)
- Python 实现BiGRU(双向门控循环单元)进行多输入单输出回归预测的项目实例(含完整的程序,GUI设计和代码详解)
- Python 实现MKELM(多核极限学习机)进行多特征分类预测的详细项目实例(含完整的程序,GUI设计和代码详解)
- Python 实现的蜣螂优化算法(DBO)来优化反向传播神经网络进行多输入单输出回归预测(含完整的程序,GUI设计和代码详解)
- Python 实现SSA-CNN-GRU(麻雀算法优化卷积门控循环单元)进行时间序列预测的详细项目实例(含完整的程序,GUI设计和代码详解)
- 毛玻璃个人引导页HTML源码.zip
- Python 实现支持向量机(SVM)进行二分类预测的详细项目实例(含完整的程序,GUI设计和代码详解)
- Python 实现通过麻雀算法优化的卷积神经网络(CNN)进行多输入单输出的回归预测实例(含完整的程序,GUI设计和代码详解)
- Python 实现通过麻雀算法优化的最小二乘支持向量机(LSSVM)进行多输入单输出的回归预测实例(含完整的程序,GUI设计和代码详解)
- Python 实现灰狼优化算法(GWO)来优化长短期记忆神经网络(LSTM),以进行时间序列预测实例(含完整的程序,GUI设计和代码详解)
- Python 的TreeBagger函数实现随机森林回归预测,并应用于多输入单输出问题实例(含完整的程序,GUI设计和代码详解)
- Matlab实现基于小波包结合鹈鹕算法优化卷积神经网络DWT-POA-CNN实现电缆故障诊断的详细项目实例(含完整的程序,GUI设计和代码详解)
- Matlab实现RIME-CNN-BiLSTM-Attention霜冰优化卷积双向长短期记忆网络注意力多变量回归预测(SE注意力机制)的详细项目实例(含完整的程序,GUI设计和代码详解)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈