Java NIO Socket编程:客户端与服务端消息通信示例

需积分: 1 0 下载量 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的网络通信。