服务器端代码:
package nio.tcp;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.CharBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.nio.charset.Charset;import java.nio.charset.CharsetDecoder;import java.util.Iterator;import java.util.Set;public class UnblockServer { public static void main(String[] args) { SocketChannel socket = null; try { // 打开一个选择器 Selector selector = Selector.open(); // 客户端要使用SocketChannel,对应服务器的ServerSocketChannel ServerSocketChannel ssc = ServerSocketChannel.open(); // 绑定服务器IP和端口 InetSocketAddress isa = new InetSocketAddress(8710); ssc.socket().bind(isa); ssc.configureBlocking(false); // 向selector注册,要处理的是接收传入事件,所以权限设置为OP_ACCEPT SelectionKey acceptKey = ssc.register(selector,SelectionKey.OP_ACCEPT); // 操作? while (selector.select() > 0) { Set<SelectionKey> readyKeys = selector.selectedKeys(); Iterator it = readyKeys.iterator(); while (it.hasNext()) { SelectionKey key = (SelectionKey) it.next(); it.remove(); if (key.isAcceptable()) { System.out.println("Key is Acceptable"); socket = (SocketChannel) ssc.accept(); socket.configureBlocking(false); socket.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE); } if (key.isReadable()) { System.out.println("Key is readable"); socket = (SocketChannel) key.channel(); ByteBuffer buf = ByteBuffer.allocate(1024); socket.read(buf); buf.flip(); // 这段实用 Charset charset = Charset.forName("us-ascii"); CharsetDecoder decoder = charset.newDecoder(); CharBuffer charBuffer = decoder.decode(buf); String result = charBuffer.toString(); System.out.println("Receive Data:" + result); } if (key.isWritable()) { System.out.println("Key is writable"); String msg = "Message from server"; socket = (SocketChannel) key.channel(); //类型转换,实用 Charset set = Charset.forName("us-ascii"); CharsetDecoder dec = set.newDecoder(); CharBuffer charBuf = dec.decode(ByteBuffer.wrap(msg.getBytes())); System.out.println("Message from server:" + charBuf.toString()); int nBytes = socket.write(ByteBuffer.wrap((charBuf.toString()).getBytes())); } } } } catch (Exception e) { e.printStackTrace(); } }}
客户端代码:
package nio.tcp;import java.io.IOException;import java.net.InetAddress;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SocketChannel;public class UnblockClient { public static void main(String[] args) { try { InetSocketAddress ia = new InetSocketAddress(InetAddress.getLocalHost(),8710); //客户端要使用SocketChannel,对应服务器的ServerSocketChannel SocketChannel client = SocketChannel.open(); client.connect(ia); //设置为非阻塞,否则就和刚才的程序没啥区别了 client.configureBlocking(false); //发送数据 sendMessage(client); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static int sendMessage(SocketChannel client) { System.out.println("Inside SendMessage"); String msg = null; ByteBuffer bytebuf; int nBytes = 0; try { msg = "It's message from client!"; System.out.println("msg is "+msg); bytebuf = ByteBuffer.wrap(msg.getBytes()); for (int i = 0; i < 3; i++) { nBytes = client.write(bytebuf); System.out.println(i + " finished"); } try { Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } client.close(); return -1; } catch (IOException e) { e.printStackTrace(); } return nBytes; }}
我已经和网上的N多类似程序对照过了,但是我就是弄不明白,为什么客户端明明只是发送了三次数据,而服务器端却会不停地执行write和read操作呢?不是应该执行一次之后就完了的吗?
相关推荐
在`NioClient.java`中,客户端同样使用NIO进行通信。客户端首先创建一个`SocketChannel`,然后向服务器的`ServerSocketChannel`发起连接请求。接着,客户端可以设置自己的`Charset`来确保数据在传输过程中不出现乱码...
《NIO与Socket编程技术指南》是一本深入探讨Java NIO(New Input/Output)和Socket编程的专业书籍,由高洪岩撰写。本书主要针对Java开发者,旨在帮助他们理解和掌握这两种在开发网络应用中至关重要的技术。 Java ...
在这个“Nio非阻塞socket通信demo”中,我们可以深入理解NIO在Socket通信中的应用。 1. **Java NIO基础** - **通道(Channels)**:NIO的核心概念之一,通道是数据读写的目标或来源,如文件通道、套接字通道等。...
### Java NIO 实现Socket通信详解 #### 一、NIO与传统IO的区别及优势 在探讨如何使用Java NIO实现Socket通信之前,我们需要先理解NIO(Non-blocking I/O,非阻塞I/O)与传统阻塞I/O之间的区别。 **传统阻塞I/O...
基于NIO的socket举例 基于NIO的socket举例 基于NIO的socket举例 基于NIO的socket举例 基于NIO的socket举例基于NIO的socket举例 基于NIO的socket举例
Socket通信是网络编程的基本元素,它允许两台计算机通过TCP/IP协议进行通信。将Java NIO与Socket结合,可以构建出高效、可扩展的网络应用程序。 1. **Java NIO基础** Java NIO的核心组件包括通道(Channel)、缓冲...
非常详细地讲解了NIO中的缓冲区、通道、选择器、编码,以及使用Socket技术实现TCP/IP和UDP编程,细化到了演示全部SocketOption的特性,这对理解基于NIO和Socket技术为基础所开发的NIO框架是非常有好处的,本书以案例...
本实例"socket通信NIO代理模式demo"将展示如何利用NIO来构建一个高性能的代理服务器。 代理模式是一种设计模式,它允许我们创建一个代理对象来控制对原对象的访问。在NIO代理模式中,代理服务器作为客户端与目标...
"默蓝网络通信测试工具(NIOSocket工具)"正是这样一款针对TCP/IP和HTTP通信的专业测试工具,它为网络通信开发人员提供了强大的测试与分析能力。 首先,我们要理解TCP/IP协议的重要性。TCP(传输控制协议)和IP(网际...
在NIO中,Socket通信不再局限于传统的`java.net.Socket`和`java.net.ServerSocket`,而是通过`java.nio.channels.SocketChannel`和`java.nio.channels.ServerSocketChannel`进行。 1. **SocketChannel**:这是NIO中...
本项目利用NIO实现了一个简单的非阻塞socket通信的聊天工具,使得在高并发环境下,服务器能够同时处理多个客户端连接,提高系统性能。 1. **非阻塞I/O**: 在BIO模型中,读写操作是阻塞的,即当没有数据可读或无法...
`Socket`在NIO中的实现是`SocketChannel`,它代表了网络上的一个连接。`ServerSocketChannel`则用于监听客户端的连接请求。通过`ServerSocketChannel`的`accept()`方法,服务器可以接收新的客户端连接,然后将其注册...
在NIO中,我们不再像BIO那样等待一个操作完成,而是通过选择器(Selector)监控多个通道(Channel),从而实现多路复用。 在Java NIO中,核心组件包括以下几个: 1. **通道(Channel)**:类似于流,但支持双向...
本篇将基于给定的标题“采用NIO实现一个Socket服务器”来详细阐述如何使用NIO进行Socket服务端的开发。 首先,理解NIO的核心概念: 1. **通道(Channel)**:通道是连接到I/O设备的途径,可以读取或写入数据。常见的...
NioSocket是一个基于Java NIO(非阻塞I/O)技术实现的网络通信框架,它包含服务器端(Server)和客户端(Client)两部分。在Java编程中,NIO(New Input/Output)提供了一种不同于传统IO模型的I/O操作方式,其核心...
标题“nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio”表明这个压缩包包含了一个关于Java NIO的实例,特别是关于NIO套接字(Socket)的编程示例。NIO套接字是Java NIO库中用于网络通信的关键组件,它们允许...
在Java中,Socket通信涉及三种不同的模型:BIO(Blocking I/O)、NIO(Non-blocking I/O)和Netty,这些都是实现高并发、高性能网络服务的重要手段。 **1. Socket基础** Socket,通常被称为套接字,是网络通信的...
本文将通过一个对比实例,探讨一般Socket客户端与Mina NIO (Non-blocking I/O) Socket客户端的差异和特点,帮助开发者理解这两种技术在实际应用中的选择。 首先,普通Socket客户端基于BIO(Blocking I/O)模型,它...
"android-socket-nio-master.zip" 是一个关于Android中使用Socket结合NIO实现高效通信的项目,其目标是提高Socket通信的性能和处理大量并发连接的能力。 NIO(非阻塞I/O)是Java提供的一个替代传统I/O的API,主要...
`NonBlockingServer.java`和`Client.java`的代码分析和实践,可以帮助我们更好地理解和掌握Java NIO在Socket通信中的应用。在实际开发中,我们还需要考虑异常处理、资源管理等细节,以确保系统的稳定性和可靠性。