file-type

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

ZIP文件

4星 · 超过85%的资源 | 下载需积分: 50 | 11KB | 更新于2025-03-09 | 87 浏览量 | 25 下载量 举报 收藏
download 立即下载
### 知识点: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
上传资源 快速赚钱