Java NIO Socket编程:客户端与服务端消息通信示例
需积分: 1 12 浏览量
更新于2024-10-10
收藏 5KB ZIP 举报
资源摘要信息: "本文详细介绍了Java NIO socket编程的基本知识,提供了客户端发送消息和服务端接收消息的代码示例。NIO(New I/O)是Java提供的一种用于替代标准I/O的新I/O库,其目的是提高性能,特别是在处理大量连接时。NIO通过使用选择器(Selectors)、通道(Channels)和缓冲区(Buffers)等新概念来实现非阻塞IO,与传统的I/O相比,NIO可以在等待数据准备好时继续执行其他任务,因此可以实现更高的吞吐量。
在Java NIO中,服务端和客户端的通信模型与传统IO有所不同。服务端需要创建一个ServerSocketChannel,配置为非阻塞模式,并绑定到一个端口上监听连接请求。当客户端的SocketChannel尝试连接时,服务端需要接受连接并进行处理。客户端则需要创建SocketChannel,连接到服务端的地址和端口上,并通过通道发送或接收数据。
以下是服务端接收消息和客户端发送消息的简单Java代码示例:
服务端代码示例:
```***
***.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.nio.channels.Selector;
import java.io.IOException;
public class NIOServer {
public static void main(String[] args) throws IOException {
Selector selector = Selector.open();
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
serverSocketChannel.socket().bind(new InetSocketAddress(8080));
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
if (selector.select() > 0) {
Iterator<SelectionKey> it = selector.selectedKeys().iterator();
while (it.hasNext()) {
SelectionKey key = it.next();
if (key.isAcceptable()) {
// 接受连接
SocketChannel clientChannel = serverSocketChannel.accept();
clientChannel.configureBlocking(false);
clientChannel.register(selector, SelectionKey.OP_READ);
} else if (key.isReadable()) {
// 读取客户端发送的数据
SocketChannel clientChannel = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int read = clientChannel.read(buffer);
buffer.flip();
String message = new String(buffer.array(), 0, read);
System.out.println("Received message: " + message);
}
it.remove();
}
}
}
}
}
```
客户端代码示例:
```***
***.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
public class NIOClient {
public static void main(String[] args) throws IOException {
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false);
socketChannel.connect(new InetSocketAddress("localhost", 8080));
String message = "Hello, Server!";
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.put(message.getBytes());
buffer.flip();
socketChannel.write(buffer);
buffer.clear();
int read = socketChannel.read(buffer);
if (read > 0) {
buffer.flip();
System.out.println(new String(buffer.array(), 0, read));
}
socketChannel.close();
}
}
```
在这个示例中,服务端使用Selector监听多个SocketChannel的状态变化,通过选择器的select()方法来等待网络事件的发生,一旦有事件发生,就可以在选择器返回的selectedKeys集合中找到相应的SelectionKey,然后根据事件类型进行相应处理。客户端则通过SocketChannel的connect方法建立连接,然后使用ByteBuffer作为数据交换的缓冲区,通过write方法发送数据,read方法接收服务端返回的响应。"
以上就是Java NIO socket编程的相关知识点和代码示例,通过这些示例,可以进一步了解NIO的非阻塞IO模型以及如何在Java中进行基于NIO的网络通信。
2011-12-12 上传
265 浏览量
2020-09-04 上传
2020-09-16 上传
2011-09-27 上传
2020-08-31 上传
393 浏览量
2022-05-16 上传
2013-07-09 上传
shandongwill
- 粉丝: 5987
- 资源: 676