java NIO代码示例
来源:互联网 发布:sql挂起清理注册表 编辑:程序博客网 时间:2024/06/05 06:46
服务端:
package cn.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.Iterator;/** * NIO服务端 * @author 小路 */public class NIOServer {//通道管理器private Selector selector;/** * 获得一个ServerSocket通道,并对该通道做一些初始化的工作 * @param port 绑定的端口号 * @throws IOException */public void initServer(int port) throws IOException {// 获得一个ServerSocket通道ServerSocketChannel serverChannel = ServerSocketChannel.open();// 设置通道为非阻塞serverChannel.configureBlocking(false);// 将该通道对应的ServerSocket绑定到port端口serverChannel.socket().bind(new InetSocketAddress(port));// 获得一个通道管理器this.selector = Selector.open();//将通道管理器和该通道绑定,并为该通道注册SelectionKey.OP_ACCEPT事件,注册该事件后,//当该事件到达时,selector.select()会返回,如果该事件没到达selector.select()会一直阻塞。serverChannel.register(selector, SelectionKey.OP_ACCEPT);}/** * 采用轮询的方式监听selector上是否有需要处理的事件,如果有,则进行处理 * @throws IOException */@SuppressWarnings("unchecked")public void listen() throws IOException {System.out.println("服务端启动成功!");// 轮询访问selectorwhile (true) {//当注册的事件到达时,方法返回;否则,该方法会一直阻塞selector.select();// 获得selector中选中的项的迭代器,选中的项为注册的事件Iterator ite = this.selector.selectedKeys().iterator();while (ite.hasNext()) {SelectionKey key = (SelectionKey) ite.next();// 删除已选的key,以防重复处理ite.remove();// 客户端请求连接事件if (key.isAcceptable()) {ServerSocketChannel server = (ServerSocketChannel) key.channel();// 获得和客户端连接的通道SocketChannel channel = server.accept();// 设置成非阻塞channel.configureBlocking(false);//在这里可以给客户端发送信息哦channel.write(ByteBuffer.wrap(new String("向客户端发送了一条信息").getBytes()));//在和客户端连接成功之后,为了可以接收到客户端的信息,需要给通道设置读的权限。channel.register(this.selector, SelectionKey.OP_READ);// 获得了可读的事件} else if (key.isReadable()) {read(key);}}}}/** * 处理读取客户端发来的信息 的事件 * @param key * @throws IOException */public void read(SelectionKey key) throws IOException{// 服务器可读取消息:得到事件发生的Socket通道SocketChannel channel = (SocketChannel) key.channel();// 创建读取的缓冲区ByteBuffer buffer = ByteBuffer.allocate(10);channel.read(buffer);byte[] data = buffer.array();String msg = new String(data).trim();System.out.println("服务端收到信息:"+msg);ByteBuffer outBuffer = ByteBuffer.wrap(msg.getBytes());channel.write(outBuffer);// 将消息回送给客户端}/** * 启动服务端测试 * @throws IOException */public static void main(String[] args) throws IOException {NIOServer server = new NIOServer();server.initServer(8000);server.listen();}}
客户端:
package cn.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.SocketChannel;import java.util.Iterator;/** * NIO客户端 * @author 小路 */public class NIOClient {//通道管理器private Selector selector;/** * 获得一个Socket通道,并对该通道做一些初始化的工作 * @param ip 连接的服务器的ip * @param port 连接的服务器的端口号 * @throws IOException */public void initClient(String ip,int port) throws IOException {// 获得一个Socket通道SocketChannel channel = SocketChannel.open();// 设置通道为非阻塞channel.configureBlocking(false);// 获得一个通道管理器this.selector = Selector.open();// 客户端连接服务器,其实方法执行并没有实现连接,需要在listen()方法中调//用channel.finishConnect();才能完成连接channel.connect(new InetSocketAddress(ip,port));//将通道管理器和该通道绑定,并为该通道注册SelectionKey.OP_CONNECT事件。channel.register(selector, SelectionKey.OP_CONNECT);}/** * 采用轮询的方式监听selector上是否有需要处理的事件,如果有,则进行处理 * @throws IOException */@SuppressWarnings("unchecked")public void listen() throws IOException {// 轮询访问selectorwhile (true) {selector.select();// 获得selector中选中的项的迭代器Iterator ite = this.selector.selectedKeys().iterator();while (ite.hasNext()) {SelectionKey key = (SelectionKey) ite.next();// 删除已选的key,以防重复处理ite.remove();// 连接事件发生if (key.isConnectable()) {SocketChannel channel = (SocketChannel) key.channel();// 如果正在连接,则完成连接if(channel.isConnectionPending()){channel.finishConnect();}// 设置成非阻塞channel.configureBlocking(false);//在这里可以给服务端发送信息哦channel.write(ByteBuffer.wrap(new String("向服务端发送了一条信息").getBytes()));//在和服务端连接成功之后,为了可以接收到服务端的信息,需要给通道设置读的权限。channel.register(this.selector, SelectionKey.OP_READ);// 获得了可读的事件} else if (key.isReadable()) {read(key);}}}}/** * 处理读取服务端发来的信息 的事件 * @param key * @throws IOException */public void read(SelectionKey key) throws IOException{//和服务端的read方法一样}/** * 启动客户端测试 * @throws IOException */public static void main(String[] args) throws IOException {NIOClient client = new NIOClient();client.initClient("localhost",8000);client.listen();}}
阅读全文
0 0
- java NIO代码示例
- (译)java NIO 示例代码
- java nio 的读写操作代码示例
- TCP/NIO示例代码
- NIO Buffer代码示例
- JAVA NIO 服务器与客户端实现示例(代码1)
- Java NIO 非阻塞式(non-block) 代码示例
- JAVA NIO 服务器与客户端实现示例(代码1)
- java NIO使用示例
- JAVA NIO的示例
- java nio示例
- JAVA 之 NIO小示例
- Java NIO 总结与示例
- java nio socket简单示例
- Java NIO DatagramChannel编程示例
- Java NIO Pipe使用示例
- java NIO流代码
- NIO Socket非阻塞模式代码示例
- Full GC有关问题学习分析(转载)
- maven添加jar包的方法
- Ubuntu 16.04配置Android源码编译环境
- Get value from agent failed:cannot connet to [[10.12.36.17]:10050]:[111] Connection refused.解决方法
- RAC 通过rman、duplicate迁移至单实例
- java NIO代码示例
- angular复选框默认选中以及验证是否至少选中一项
- 深入研究 Java Synchronize 和 Lock 的区别与用法
- HDU 1272-小希的迷宫
- 22.HTTP和HTTPS
- sublime text3 设置默认游览器
- TCP三次握手和四次挥手的全过程
- HDU
- zabbix告警时间和恢复时间相同的解决方法