package nio.asyn;
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.nio.channels.spi.SelectorProvider;
import java.util.Iterator;
public class OperationServer implements Runnable {
private int port1 = 8090;
private int port2 = 9090;
private Selector selector;
/**
* Selector对象,负责监控所有的连接到服务器的网络事件的发生
*/
private ServerSocketChannel serverChannel1;
private ByteBuffer readBuffer = ByteBuffer.allocate(8192);
private ServerSocketChannel serverChannel2;
private SocketChannel socketChannel1;
private SocketChannel socketChannel2;
private AddProcessor client1Processor = new AddProcessor();
private MultiProcessor client2Processor = new MultiProcessor();
public OperationServer(){
initSelector();
}
@Override
public void run() {
while (true) {
try {
this.selector.select();
Iterator selectedKeys = this.selector.selectedKeys().iterator();
while (selectedKeys.hasNext()) {
SelectionKey key = (SelectionKey) selectedKeys.next();
selectedKeys.remove();
if (!key.isValid()) {
continue;
}
if (key.isAcceptable()) {
this.accept(key);
} else if (key.isReadable()) {
this.read(key);
} else if (key.isWritable()) {
this.write(key);
}
}
} catch (IOException e) {
e.printStackTrace();
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void accept(SelectionKey key) throws IOException {
ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel();
if (serverSocketChannel.equals(serverChannel1)) {
socketChannel1 = serverSocketChannel.accept();
socketChannel1.configureBlocking(false); //将客户端Channel设置为非阻塞型
socketChannel1.register(this.selector, SelectionKey.OP_READ);
/**
* 将客户端Channel注册到Selector对象上,并且指出客户端Channel所感
* 兴趣的事件为可读和可写
*/
} else {
socketChannel2 = serverSocketChannel.accept();
socketChannel2.configureBlocking(false);
socketChannel2.register(this.selector, SelectionKey.OP_READ);
}
}
public void read(SelectionKey key) throws IOException {
SocketChannel socketChannel = (SocketChannel) key.channel();
this.readBuffer.clear();
// Attempt to read off the channel
int numRead;
try {
numRead = socketChannel.read(this.readBuffer);
} catch (IOException e) {
// The remote forcibly closed the connection, cancel
// the selection key and close the channel.
key.cancel();
socketChannel.close();
return;
}
if (numRead == -1) {
// Remote entity shut the socket down cleanly. Do the
// same from our end and cancel the channel.
key.channel().close();
key.cancel();
return;
}
String input = new String(readBuffer.array()).trim();
if (socketChannel.equals(socketChannel1)) {
client1Processor.process(input);
} else {
client2Processor.process(input);
}
}
public void write(SelectionKey key) {
}
/**
* 注册事件到selector;
*/
public void initSelector() {
try {
selector = SelectorProvider.provider().openSelector(); //初始化Selector对象
this.serverChannel1 = ServerSocketChannel.open(); //初始化服务器Channel对象
serverChannel1.configureBlocking(false);
InetSocketAddress isa = new InetSocketAddress("localhost", this.port1);
serverChannel1.socket().bind(isa);//获取服务器Channel对应的//ServerSocket对象
serverChannel1.register(selector, SelectionKey.OP_ACCEPT); //将服务器Channel注册到Selector对象,并指出服务器Channel所感兴趣的事件为可接受请求操作
this.serverChannel2 = ServerSocketChannel.open();
serverChannel2.configureBlocking(false);
InetSocketAddress isa2 = new InetSocketAddress("localhost", this.port2);
serverChannel2.socket().bind(isa2);
serverChannel2.register(selector, SelectionKey.OP_ACCEPT);//client.register(selector,SelectionKey.OP_READ|SelectionKey.OP_READ);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
OperationServer server = new OperationServer();
Thread t = new Thread(server);
t.start();
}
}
分享到:
相关推荐
CS模式,即Client-Server(客户端-服务器)模式,是一种常见的网络通信架构,广泛应用于各种互联网服务,包括聊天应用。在这个架构中,客户端是用户交互的界面,而服务器端则负责处理请求、存储数据和提供服务。在这...
在Java NIO服务器开发中,它允许服务器处理多个客户端连接,而无需为每个连接创建单独的线程,从而避免了线程创建和销毁的开销,提升了系统的资源利用率。 标题中的“java nio服务器”指的是使用Java NIO API构建的...
注意,Netty通常使用NIO(非阻塞I/O)模式,这使得它在高并发场景下表现优秀。 在深入研究案例之前,确保你对Java NIO有一定的了解,因为Netty的基础就是NIO。此外,理解ByteBuf(Netty中的缓冲区类)的使用也很...
- **NIO在高并发服务器中的应用**:例如Tomcat服务器、Netty框架等都利用了Java NIO的特性来提高性能。 - **NIO与TCP/IP套接字**:NIO可以方便地与TCP/IP套接字结合,实现高效的网络通信。 总之,Java NIO非阻塞...
NIO(Non-Blocking I/O)是一种异步非阻塞式 I/O 模式,服务器使用单个线程来处理多个客户端请求,提高了服务器的性能和可扩展性。 AIO(Asynchronous I/O)是一种异步非阻塞式 I/O 模式,服务器使用回调函数来处理...
NIO 模式可以使服务器端处理大量的客户端连接,提高服务器端的并发能力和可扩展性。 五、Java NIO 服务器端开发的实现细节 Java NIO 服务器端开发的实现细节包括缓冲区的操作、通道的操作、选择器的操作等。缓冲区...
Java NIO服务器设计通常涉及到以下几个核心概念: 1. **通道(Channels)**:通道是数据传输的途径,类似于传统的输入/输出流。Java NIO提供了多种类型的通道,如FileChannel、SocketChannel、DatagramChannel等,...
Jetty、Tomcat和Mina都是Java领域中著名的Web服务器和应用服务器,它们在NIO架构上有着相似的设计模式。本文将从这三个框架中提炼出NIO构架网络服务器的经典模式,并逐一解析它们的核心机制。 首先,Jetty的NIO实现...
### 多线程NIO客户端实例解析 #### 核心概念与原理 在深入解析这段代码之前,我们先来理解一下几个核心的概念:**多线程**、**NIO(Non-blocking I/O)**以及它们如何协同工作在客户端编程中。 - **多线程**:在...
在NIO代理模式中,代理服务器作为客户端与目标服务器之间的中介,接收客户端的请求,然后转发给目标服务器,并将目标服务器的响应返回给客户端。这种方式可以用于隐藏真实服务器的地址,或者增加额外的安全层,同时...
综上所述,基于Java NIO的反应器模式设计与实现,可以大幅提升网络服务器的性能,通过非阻塞IO、事件驱动、选择器等机制,高效地处理高并发的数据传输任务,并且优化了线程资源的使用,减少了线程上下文切换的时间...
它使用pub / sub模式,并在设备,服务器和应用程序之间转换消息。 它通常用于物联网(IoT)技术。 用法 创建一个客户端并连接到MQTT代理。 let client = MQTTClient ( host : " mqtt.eclipse.org " , port : ...
Java NIO(Non-Blocking I/O)是一种同步非阻塞式的 I/O 模式,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有 I/O 请求就进行处理。NIO ...
### 使用Java NIO编写高性能服务器的关键知识点 #### 一、NIO概述 - **NIO简介**:NIO(New IO)自JDK 1.4引入以来,为Java提供了非阻塞IO的支持,这对于提高服务端应用的性能至关重要。NIO的核心特性包括缓冲区...
至此,我们已经创建了一个简单的NIO Socket服务器,能够接受客户端连接并进行数据传输。实际应用中,还需要考虑异常处理、多线程处理客户端、关闭资源等细节。通过阅读提供的“NIO_Sample”压缩包中的代码示例,可以...
相反,C/S模式则是传统的客户端-服务器架构,其中一部分设备作为服务器提供服务,而另一部分设备作为客户端请求服务。在C/S模式的聊天室中,所有用户都连接到同一台或一组服务器,由服务器处理并转发消息。这种方式...
3. **过滤器链(Filter Chain)**:服务器端的过滤器链是一种设计模式,用于在数据处理过程中添加多个处理阶段。在这个例子中,有两个过滤器已经实现: - **日志过滤器(Logger Filter)**:此过滤器负责记录客户端...
Reactor模式允许单个线程高效地处理多个客户端的I/O事件。在Reactor模式中,通常有一个或多个事件处理器负责监听事件,然后将这些事件分发给相应的处理器进行处理。Reactor模式可以有不同的实现版本,包括基础模式、...
在Java编程领域,客户端-服务器(Client-Server)程序是一种常见的架构模式,它涉及两个主要组件:客户端应用程序和服务器端应用程序。在这个“Java客户端服务器程序学习笔记”中,我们将深入探讨这一主题,包括如何...