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的通信实例,带UML结构图及server、client源码。
NioServer.java
Ioserver java Nio socket 框架 是个不错的NIO 通讯框架,本来想学习mina框架,看了看mina的源码太头痛,本人觉得看懂了Ioserver 再看mina的框架,想多的学习 java NIO 的也可以下载 看看,很值得学习啊!!!
java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server发数据,server收到后分别打印收到的消息...
一个基于事件驱动的JAVA NIO 服务器源码!
本例包含服务器端和客户端,多线程,每线程多次发送,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: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。 ...
NIO非阻塞通讯模式!NIO非阻塞通讯模式!
使用NIO socket不需要多线程来处理多个连接的请求,效率非常高 ...4,修改封装http做成短连接处理,就是一个小型的webserver,或者结合java2D和robot做远程监控 5,封装自己的协议可以做成自己需要的服务器端程序,
实现java nio的标准例子,包括server端和client端。
该JAVA NIO项目包含server服务端完整项目源码、client客户端项目工程源码。
小型简单但完整的Java NIO服务器,任何人都可以免费使用。 目前,它仅处理发送和接收字符串,并且尚未进行优化-但它易于理解并适应您的需求。
Java NIO非堵塞技术实际是采取Reactor模式,或者说是Observer模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的I/O读写,不堵塞了。 Java NIO...
JAVA服务器基于JAVA NIO I. 实现HTTP协议 II. 实现HTTPS协议 III. 实现FASTCGI协议(Client端) 运行HTTP/HTTPS服务器 运行开发包下jar文件 java -jar http-server-version-{version}.jar ...
同时整个服务端的流程处理,建立于事件机制上。在 [接受连接->读->业务处理->写 ->关闭连接 ]这个 过程中,触发器将触发相应事件,由事件处理器对相应事件分别响应,完成服务器端的业务处理。...
java NIO 高性能 socket通讯,服务端采用单线程,降低了cpu的压力,普通io socket通讯,server需要每个连接运行个线程,容易出现问题,效率也低
use telnet as client , and implements server using nio
import java.nio.channels.SocketChannel; import java.util.Iterator; import com.nio.user.ClientUser; import com.nio.user.ClientUserManager; import com.nio.user.UserData; public class NIOClient { ...
java nio 服务器范例及j2me代码连接服务器的测试代码。