Java NIO 提供了反应堆模式非阻塞的Socket通信,代码很简单
public class TcpServer implements Runnable {
private ServerSocketChannel socketChannel;
private Selector selector;
private int activeSockets;
private int port;
public TcpServer(){
activeSockets = 0;
port = 9999;
try {
socketChannel = ServerSocketChannel.open();
selector = Selector.open();
ServerSocket socket = socketChannel.socket();
socket.bind(new InetSocketAddress(port));
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_ACCEPT);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while(true){
try {
selector.select();
} catch (IOException e) {
continue;
}
Set<SelectionKey> keys = selector.selectedKeys();
activeSockets = keys.size();
if(activeSockets==0){
continue;
}
for(SelectionKey key:keys){
if(key.isAcceptable()){
doServerSocketEvent(key);
continue;
}
if(key.isReadable()){
doClientReadEvent(key);
continue;
}
if(key.isWritable()){
doClientWriteEvent(key);
continue;
}
}
}
}
private void doServerSocketEvent(SelectionKey key) {
SocketChannel client = null;
ServerSocketChannel server = (ServerSocketChannel)key.channel();
try {
client = server.accept();
if(client == null){
return;
}
client.configureBlocking(false);
client.register(selector, SelectionKey.OP_READ|SelectionKey.OP_WRITE);
} catch (IOException e) {
try {
client.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
private void doClientWriteEvent(SelectionKey key) {
SocketChannel socketChannel = (SocketChannel)key.channel();
ByteBuffer buffer = ByteBuffer.allocate(10);
byte[] data = "0000000000".getBytes();
buffer.put(data);
buffer.flip();
try {
socketChannel.write(buffer);
} catch (IOException e) {
e.printStackTrace();
}
}
private void doClientReadEvent(SelectionKey key) {
ByteBuffer receiveBuffer;
ByteBuffer buffer = ByteBuffer.allocate(1024);
SocketChannel socketChannel = (SocketChannel)key.channel();
if(socketChannel.isOpen()){
int nBytes = 0;
buffer.clear();
try {
nBytes = socketChannel.read(buffer);
} catch (IOException e) {
e.printStackTrace();
}
buffer.flip();
if (nBytes > 0) {
receiveBuffer = ByteBuffer.allocate(nBytes);
receiveBuffer.clear();
buffer.get(receiveBuffer.array());
receiveBuffer.flip();
}
}
}
public static void main(String[] args) {
TcpServer server = new TcpServer();
new Thread(server).start();
}
}
分享到:
相关推荐
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,相对于传统的BIO( Blocking I/O)模型,NIO在处理高并发、大数据量的网络应用时表现出更高的效率和...
Java NIO,全称为Non-Blocking Input/...以上就是Java NIO的基本概念和工作流程,以及结合文件名推测的`NIOServer.java`和`NIOClient.java`可能实现的功能。学习和理解NIO,对于开发高并发、高性能的Java应用至关重要。
NioServer.java
Ioserver java Nio socket 框架 是个不错的NIO 通讯框架,本来想学习mina框架,看了看mina的源码太头痛,本人觉得看懂了Ioserver 再看mina的框架,想多的学习 java NIO 的也可以下载 看看,很值得学习啊!!!
标题中的“nioserver.zip_NIO_event driven java_java nio_java nioserv_nioser”表明这是一个关于Java NIO的服务器实现,且是基于事件驱动模式的。事件驱动编程是一种设计模式,它允许程序对特定事件做出响应,而...
在这个场景下,Java NIO能够帮助服务器有效地处理多个客户端连接,并实现客户端之间消息的互发。 首先,我们要理解Java NIO的基本组件。主要包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。通道是...
本例子中的"NioServer"可能是一个简单的Java NIO服务器端程序,用于演示如何使用NIO进行网络通信。下面我们将深入探讨Java NIO的关键组件和工作原理。 1. **通道(Channel)**:通道是数据传输的途径,类似于传统的...
java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server发数据,server收到后分别打印收到的消息...
new NIOServer().initServer(8888); } catch (IOException e) { e.printStackTrace(); } } } ``` 以上代码展示了如何使用Java NIO实现一个简单的服务端。在这个例子中,我们创建了一个`ServerSocketChannel`,...
首先,我们来看`NioServer.java`。这个文件中包含了一个基于NIO的服务器端实现。服务器的核心组件是`Selector`,它允许一个单独的线程监听多个套接字通道的状态变化。当客户端发起连接请求时,服务器会注册`...
【标题】:“NIOServer”是一个关于网络编程的Java实现,它使用了Java的非阻塞I/O(Non-blocking I/O,NIO)技术。在Java中,NIO是一种替代传统阻塞I/O(BIO)模型的方式,提供了更高效的数据传输能力。此项目可能是...
NIO(Non-blocking Input/Output)是Java编程语言中的一种I/O模型,它与传统的阻塞I/O(BIO)模型相比,具有更高的性能和更灵活的架构。NIO在Java 1.4版本中引入,全称为New Input/Output,它的核心在于“非阻塞”二...
本例包含服务器端和客户端,多线程,每线程多次发送,Eclipse工程,启动服务器使用 nu.javafaq.server.NioServer,启动客户端使用 nu.javafaq.client.NioClient。另本例取自javafaq.nv上的程序修改而成
java nio 作者的ppt。 How to Build a Scalable ...文中讲述如何使用java nio来实现高性能的服务器。 1、建立高性能服务器遇到问题? 2、java nio 和 reactor 的映射关系 3、如果使用java nio 来实现高性能服务器
Java NIO(New IO)是Java 1.4版本引入的一种新的I/O API,它提供了非阻塞I/O操作的能力,极大地提升了Java在处理网络通信和文件读写时的性能。在这个“java nio聊天室源码”项目中,我们可以看到如何使用NIO构建一...
在给定的部分代码示例中,可以看到一个简单的Java IO Echo Server实现。这个例子展示了如何使用传统的Java IO来实现一个服务器端的应用程序,它可以接收客户端发送的消息,并将接收到的信息原样返回给客户端。这里...
例如,可能有一个名为`NioServer`的主类,用于初始化ServerSocketChannel,注册选择器,以及处理接收到的连接和数据。还有可能包含`ThreadPool`类,用于管理线程池,以及`BufferHandler`类,负责处理缓冲区中的数据...
Java NIO,即Non-Blocking I/O,是Java在JDK 1.4引入的一套新的I/O API,旨在提供一种更加高效的方式来处理I/O操作,尤其是对于网络编程和高并发场景。NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器...
使用NIO socket不需要多线程来处理多个连接的请求,效率非常高 ...4,修改封装http做成短连接处理,就是一个小型的webserver,或者结合java2D和robot做远程监控 5,封装自己的协议可以做成自己需要的服务器端程序,
Java NIO(New IO)是Java 1.4版本引入的一个新特性,是对传统IO模型的重大改进。在传统的IO模型中,数据传输基于字节流或字符流,使用阻塞IO,即当读写操作进行时,如果数据没有准备好,线程会被阻塞,直到数据准备...