Java NIO非堵塞技术实际是采取Reactor模式,或者说是Observer模式为我们监察I/O端口,如果有内容进来,会自动通知我们。
在服务端我们可以使用非阻塞的方式。 下面是一段server端的程序。 client 可以采用阻塞方式来请求。
NIO
有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有事件发生时,他会通知我们,传回一组SelectionKey, 我们读取这些Key, 就会获得我们刚刚注册过的socketchannel,然后,我们从
这个Channel中读取数据,放心,包准能够读到,接着我们可以处理这些数据。
Selector内部原理实际是在做一个对所注册的channel的轮询访问,不断的轮询(目前就这一个算法),一旦轮询到一个channel有所注册的事情发生,比如数据来了,他就会站起来报告,交出一把钥匙,让我们通过这把钥匙来读取这个channel的内容。
做一个备忘吧。
package com.jimmy.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;
public class NoBlockServerSocket {
private Selector selector;
private ByteBuffer byteBuffer=ByteBuffer.allocate(1024);
public NoBlockServerSocket(int port) throws IOException {
selector=Selector.open();
ServerSocketChannel serverSocketChannel=ServerSocketChannel.open();//创建nio通道
serverSocketChannel.socket().bind(new InetSocketAddress(port));//创建基于nio通道的socket链接绑定
serverSocketChannel.configureBlocking(false);//配置使通道不阻塞
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);//将通道绑定到选择器
}
public Selector getSelector() {
return selector;
}
public void setSelector(Selector selector) {
this.selector=selector;
}
public void listen() {
try {
for(;;) {
int i=selector.select();//获取通道内关心事件的集合。
if(i<1){
continue;
}
//Selector传回一组SelectionKeys
Iterator<SelectionKey> iter=selector.selectedKeys().iterator();
if(iter.hasNext()) {
SelectionKey selectionKey=iter.next();
//一个key被处理完成后,就都被从就绪关键字(ready keys)列表中除去
iter.remove();
process(selectionKey);
}
System.out.println(" loop " + new Date());
}
} catch(IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void process(SelectionKey selectionKey) throws IOException {
System.out.println("selectionKey.isAcceptable()"+selectionKey.isAcceptable());
System.out.println("selectionKey.isReadable()"+selectionKey.isReadable());
System.out.println("selectionKey.isWritable()"+selectionKey.isWritable());
if(selectionKey.isAcceptable()) {//获得客户端链接,并注册到选择器中,观察的动作有读写。
ServerSocketChannel server=(ServerSocketChannel)selectionKey.channel();
SocketChannel socketChannel=server.accept();
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
System.out.println("accept:" + selectionKey.interestOps() + " " + selectionKey.readyOps());
} else if(selectionKey.isReadable()) {//这个通道是一个可读的状态。进行读取操作
SocketChannel channel=(SocketChannel)selectionKey.channel();
int count=channel.read(byteBuffer);
if(count > 0) {
byteBuffer.flip();
byte[] bbb=byteBuffer.array();
System.out.println("i receive" + new String(bbb, 0, count));
byteBuffer.clear();
}
} else if(selectionKey.isWritable()) {//这个通道是一个可以写的状态,进行写入的操作
System.out.println("isWritable:" + selectionKey.interestOps());
SocketChannel channel=(SocketChannel)selectionKey.channel();
byteBuffer.clear();
byteBuffer.put(new Date().toString().getBytes());
byteBuffer.flip();
channel.write(byteBuffer);
channel.close();
byteBuffer.clear();
}
System.out.println("\n\n\n");
}
public static void main(String[] args) {
int port=8888;
try {
NoBlockServerSocket server=new NoBlockServerSocket(port);
System.out.println("listening on " + port);
server.listen();
} catch(IOException e) {
e.printStackTrace();
}
}
}
分享到:
相关推荐
SocketChannel非阻塞网络编程
java的ServerSocketChannel与SocketChannel的使用
一个关于SocketChannel、ServerSocketChannel、Selector的综合案例
这是一个非阻塞通信学习的基础模板,让你轻松掌握非阻塞通信。里面还包含了可运行的jar包,可以抢先体验效果哦~_~
NIO SSL 与阻塞IO不同,JVM不提供扩展基本套接字通道类的标准SSLSocketChannel和SSLServerSocketChannel类。 相反,必须使用手动编排SSL交换。 该项目提供了和,可以像和一样使用。入门直接下载您可以直接下载并将其...
一个 Java SocketChannel 实现,它使用提供的 Proxy 实例通过提供的代理建立网络连接。 SocketChannel 是通过表面下的 Socket 实例实现的。 限制 此实现目前仅支持阻塞模式。 请注意,这是 SocketChannel 实例的默认...
使用socket channel 连接服务器,断线重连,发送...可以通过以下2种方式创建SocketChannel: 打开一个SocketChannel并连接到互联网上的某台服务器。 一个新连接到达ServerSocketChannel时,会创建一个SocketChannel。
2、聊天室群聊,可以创建聊天室,进入聊天室的人可以在里面聊天,创建的人或者是第一个人为管理员,拥有踢人的权限;广场上有一个聊天室列表。 3、私聊,在广场和聊天室界面都有一个显示当前在线的人的列表,广场...
【IT十八掌徐培成】Java基础第27天-02.NIO-ServerSocketChannel-SocketChannel.zip
NIO(服务端和客户端代码) 博文链接:https://songjianyong.iteye.com/blog/1757406
利用Socket实现聊天室实时聊天功能,包含服务器端以及客户端,输入指定IP和端口号进行监控
SocketChannel被Selector检查,检查其声称可以接受的状态是否已经产生,如当SocketChannel在向Selector注册是设置了可接受状态为Read,此时当SocketChannel接收到数据后将进入可读状态。 如果需要实现一个线程或...
1.ServerSocketChannel与SocketChannel通讯 2.java Fork/Join 与ThreadPool使用
● SocketChannel:Socket的替代类,支持阻塞通信与非阻塞通信。 ● Selector:为ServerSocketChannel监控接收连接就绪事件,为SocketChannel监控连接就绪、读就绪和写就绪事件。 ● SelectionKey:代表...
socket 长连接 简单例子,适合初学的朋友,里面有多线程 实现的,包括心跳包,数据分为两部分传送,首先双方约定用一个4字节的数组告诉对方要传送数据的长度,然后在写入数据,这样长连接的时候,双方可以知道对方...
用JAVA写的一个FPT小程序,可实现简单的Ftp功能,Server端有Ui界面。
java socket 大文件传输,快速传输, 数据包的分片,组装,涉及UDP,TCP传输技术,NIO非阻塞等等,适合对socket编程进一步学习的同学
实现了客户端和服务器之间的通信,服务器是用socketChannel实现,
基于Mina的网络通讯,分为服务端和客户端。 研究selector NIO实现时,发现了这个架构。...Mina的底层实现实际就是selector和SocketChannel。所以如果对Mina源码感兴趣的可以先去看下selector相关的例子。
Java NIO系列教程 Java NIO Channel Buffer Selector SocketChannel