
Java NIO实现客户端与服务端通信代码示例

### 知识点:Java NIO通信客户端和服务端典型代码分析
#### Java NIO简介
Java NIO(New IO,Non-blocking IO)是从Java 1.4版本开始引入的一套新的IO API,可以替代标准的Java IO API。NIO与原来的IO同样用于进行网络通信和文件操作,但它在包和接口上做了相当大的改动,并提供了不同的行为,它支持面向缓冲的(Buffer-oriented)、基于通道的(Channel-based)IO操作。
#### Java NIO核心组件
1. **缓冲区(Buffer)**:NIO中的缓冲区是进行读写数据的基本单位,所有的数据操作都在缓冲区完成。缓冲区实质上是一个数组,它在NIO中作为传输数据的中转站。
2. **通道(Channel)**:NIO中的通道类似于流,但有些不同:既可以从通道读取数据,也可以写数据到通道;而流的读写通常是单向的;通道可以异步地读写;通道中的数据总是要先读到一个缓冲区,或者总是要从一个缓冲区中写入。
3. **选择器(Selector)**:选择器允许单个线程管理多个输入通道。你可以注册多个通道到同一个选择器中,并使用一个单独的线程来检查这些通道是否有就绪的IO操作,从而避免了多线程环境下频繁的线程上下文切换。
#### 客户端和服务端代码结构
本示例中的客户端和服务端代码使用了Java NIO中的ServerSocketChannel和SocketChannel类。以下是客户端和服务端的基本代码结构。
##### 服务端(Server)
服务端主要包括以下步骤:
1. 打开ServerSocketChannel,用于监听新的连接。
2. 绑定监听地址(可以是本机地址)和端口。
3. 轮询 Selector,等待客户端连接。
4. 对于每一个就绪的SelectionKey(表示一个连接),进行IO操作。
##### 客户端(Client)
客户端主要包括以下步骤:
1. 打开SocketChannel。
2. 配置SocketChannel参数(可选)。
3. 连接到服务端的地址和端口。
4. 进行数据的发送和接收。
#### Java NIO客户端典型代码
客户端代码首先创建一个SocketChannel,并连接到服务端。之后它会读取用户输入的数据,通过SocketChannel发送给服务端,同时也能接收服务端返回的数据。
```java
SocketChannel clientSocketChannel = SocketChannel.open();
clientSocketChannel.connect(new InetSocketAddress("127.0.0.1", PORT));
// 将要发送给服务端的数据写入到缓冲区
ByteBuffer buffer = ByteBuffer.wrap(message.getBytes());
clientSocketChannel.write(buffer);
// 如果需要接收服务端的数据,则调用read方法
buffer.clear();
int bytesRead = clientSocketChannel.read(buffer);
```
#### Java NIO服务端典型代码
服务端代码通过ServerSocketChannel监听端口,当有客户端连接请求时,它接受连接并创建一个新的SocketChannel来处理通信。
```java
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress(PORT));
Selector selector = Selector.open();
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
selector.select();
Set<SelectionKey> selectionKeys = selector.selectedKeys();
for (SelectionKey key : selectionKeys) {
if (key.isAcceptable()) {
// 接受连接
SocketChannel client = serverSocketChannel.accept();
client.configureBlocking(false);
client.register(selector, SelectionKey.OP_READ);
} else if (key.isReadable()) {
// 读取数据
SocketChannel client = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int bytesRead = client.read(buffer);
if (bytesRead > 0) {
buffer.flip();
// 处理接收到的数据...
}
}
}
selectionKeys.clear();
}
```
#### 总结
以上展示了Java NIO通信模型下客户端和服务端的典型实现方式。服务端通过非阻塞的ServerSocketChannel监听连接请求,注册到Selector中进行管理,客户端则创建SocketChannel来建立和服务器之间的通信。NIO的这种设计提高了通信效率,适用于需要处理大量客户端连接的场景。尽管代码示例展示了最基本的通信过程,但它已经包含了NIO编程的核心概念。开发者可以在此基础上进一步理解并开发出复杂的网络通信应用。
相关推荐









xzwjraohuamin1
- 粉丝: 4
最新资源
- UrlReWriter技术详解与使用教程
- C#实现自动关闭显示器的软件工具
- 解决WIN2003安装IIS6.0文件缺失的疑难问题
- 北京局前置机4117协议在VS2010中的解析方法
- 《ASP.NET编程宝典十年典藏版》:十年经验的精华总结
- Expat 2.0.1源码包:Linux交叉编译核心依赖
- iPhone官网XMPPFramework实例分析
- CAD液压原理图插件——电磁阀及液压缸设计工具
- C#使用Winista.Htmlparser.net解析HTML文件技术解析
- 高效SSH代码封装实例:独立且易用的解决方案
- Linux环境下libpcap编程使用示例
- 掌握三维游戏编程技术的网络游戏设计教程
- 北京局高压箱4118协议在VS2010中的解析方法
- 如何检测Windows系统CPU硬件虚拟化支持
- 全面了解FlashFXP:FXP/ftp文件上传工具功能特点
- 探索清华同方L9TR4 TSUM16AL 25P05固件
- Source Insight:高效查看开源项目源代码
- 深入理解动态链接库编程的关键技术与应用
- PHP解密工具教程:使用ioncubed/zended快速解码文件
- 洗车管理软件:IC卡/ID卡及短信宝功能支持
- 兼容IE与Firefox的JS调试器使用指南
- 在WinCE5.0平台实现透明背景按钮的详细教程
- C#实现类QQ聊天工具及其服务器端设计
- MS Chart局部放大功能实现的简易示例