NIO实现的简单的客户端与服务端通信(非阻塞)
来源:互联网 发布:签到赚钱的软件 编辑:程序博客网 时间:2024/06/06 17:20
利用NIO的ServerSocketChannel实现的客户端与服务端通信
基础知识
一、使用 NIO 完成网络通信的三个核心:
1. 通道(Channel):负责连接
java.nio.channels.Channel 接口:
|--SelectableChannel
|--SocketChannel
|--ServerSocketChannel
|--DatagramChannel
|--Pipe.SinkChannel
|--Pipe.SourceChannel
2. 缓冲区(Buffer):负责数据的存取
3. 选择器(Selector):是 SelectableChannel 的多路复用器。用于监控 SelectableChannel 的 IO 状况
二、服务端开发流程
- 获取通道
- 切换非阻塞模式
- 绑定连接
- 获取选择器
- 将通道注册到选择器上, 并且指定“监听接收事件”
- 轮询式的获取选择器上已经“准备就绪”的事件
- 获取当前选择器中所有注册的“选择键(已就绪的监听事件)”
- 获取准备“就绪”的是事件
- 判断具体是什么事件准备就绪
- 若“接收就绪”,获取客户端连接
- 客户端链接切换非阻塞模式
- 将该通道注册到选择器上
- 获取当前选择器上“读就绪”状态的通道
- 读取数据
三、客户开发流程
- 获取通道
- 切换非阻塞模式
- 分配指定大小的缓冲区
- 发送数据给服务端
四、代码实例
package cn.com.github.nio.file;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;/** * 类的描述信息 * * @author panzhuowen * @version 1.0.1 */public class Server { public static void main(String[] args) throws IOException { ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.configureBlocking(false); serverSocketChannel.bind(new InetSocketAddress(8089)); Selector selector = Selector.open(); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); while (selector.select() > 0) { Iterator<SelectionKey> iterator = selector.selectedKeys().iterator(); while (iterator.hasNext()) { SelectionKey selectionKey = iterator.next(); if (selectionKey.isAcceptable()) { SocketChannel socketChannel = serverSocketChannel.accept(); socketChannel.configureBlocking(false); socketChannel.register(selector, SelectionKey.OP_READ); } else if (selectionKey.isReadable()) { SocketChannel socketChannel = (SocketChannel) selectionKey.channel(); ByteBuffer byteBuffer = ByteBuffer.allocate(1024); int len = 0; while((len = socketChannel.read(byteBuffer)) > 0 ){ byteBuffer.flip(); System.out.println(new String(byteBuffer.array(), 0, len)); byteBuffer.clear(); } } } iterator.remove(); } }}
package cn.com.github.nio.file;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SocketChannel;import java.util.Date;import java.util.Scanner;/** * 类的描述信息 * * @author panzhuowen * @version 1.0.1 */public class Client { public static void main(String[] args) throws IOException { SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 8089)); ByteBuffer buf = ByteBuffer.allocate(1024); //4. 发送数据给服务端 Scanner scan = new Scanner(System.in); while(scan.hasNext()){ String str = scan.next(); buf.put((new Date().toString() + "\n" + str).getBytes()); buf.flip(); socketChannel.write(buf); buf.clear(); } //5. 关闭通道 socketChannel.close(); }}
1 0
- NIO实现的简单的客户端与服务端通信(非阻塞)
- NIO实现TCP的非阻塞通信
- NIO的非阻塞通信
- 使用简单的ServiceSockt实现服务端与客户端的通信
- Java review--NIO实例:实现服务端和客户端的简单通信
- 使用NIO实现非阻塞式的网络通信
- 简单的服务端与客户端通信代码
- NIO非阻塞通信服务端部分代码
- JavaNIO: NIO与普通阻塞IO的区别及NIO服务端与客户端示例
- NIO学习之Selector,SelectionKey与客户端与服务端通信简单实现(1)
- 简单的客户端,服务端通信
- NIO应用实现多客户端与服务端通信
- 利用Tcp和socket实现的客户端与服务端的简单通信
- Java中利用socket实现简单的服务端与客户端的通信(入门级)
- Java中利用socket实现简单的服务端与客户端的通信(基础级)
- Java简单实现UDP服务端和客户端的通信
- Socket TCP 协议实现服务端和客户端的简单通信
- nodejs socket实现的服务端和客户端简单通信
- 【Java 5】Unknown column 'user_name' in 'field list'
- AIDL实现Android进程间的通信
- 产品经理之互联网产品-全栈工程师熊盼
- RabbitMQ基础概念详细介绍
- MD5加密的C++实现代码
- NIO实现的简单的客户端与服务端通信(非阻塞)
- ExpandableListView的一些基本语法以及用法,程序员须知的基本标准
- Word Vector
- zhu的Oracle数据库笔记
- 05-树7 堆中的路径 (25分)
- Python中常用的一些模块
- mybatis的缓存机制
- poj1952(经典dp题)
- PopupWindow的使用