`

NIO示例

nio 
阅读更多
NIO服务端代码:
public class NIOServer {
	
	private Selector selector;

	
	public void startServer(int port) throws IOException {

		ServerSocketChannel serverChannel = ServerSocketChannel.open();
		// 设置通道为非阻塞
		serverChannel.configureBlocking(false);

		serverChannel.socket().bind(new InetSocketAddress(port));

		this.selector = Selector.open();
		
		serverChannel.register(selector, SelectionKey.OP_ACCEPT);
	}

	
	public void listen() throws IOException {
		while (true) {
			//当注册的事件到达时,方法返回;否则,该方法会一直阻塞
			selector.select();
			Iterator<SelectionKey> it = this.selector.selectedKeys().iterator();
			while (it.hasNext()) {
				SelectionKey key = (SelectionKey) it.next();
				// 此处一定要删除
				it.remove();

				if (key.isAcceptable()) {
				    
					ServerSocketChannel server = (ServerSocketChannel) key
							.channel();
					
					SocketChannel channel = server.accept();
					System.out.println("remote socket is:"+channel.socket().getInetAddress());
					channel.configureBlocking(false);

					channel.write(ByteBuffer.wrap(new String("send one msg to client").getBytes()));
	
					channel.register(this.selector, SelectionKey.OP_READ);
					
				} else if (key.isReadable()) {
						read(key);
				}

			}

		}
	}
	
	public void read(SelectionKey key) throws IOException{
	
		SocketChannel channel = (SocketChannel) key.channel();
		
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		int len = channel.read(buffer);
		byte[] data = new byte[len];
		System.arraycopy(buffer.array(), 0, data, 0, len);
		String msg = new String(data).trim();
		System.out.println("server receive one msg:"+msg);
		ByteBuffer outBuffer = ByteBuffer.wrap(msg.getBytes());
		channel.write(outBuffer);
	}
	
	public static void main(String[] args) throws IOException {
		NIOServer server = new NIOServer();
		server.startServer(8080);
		server.listen();
	}

}


NIO客户端代码:
public class NIOClient {
    
	private Selector selector;

	
	public void initClient(String ip,int port) throws IOException {
	
		SocketChannel channel = SocketChannel.open();
		
		channel.configureBlocking(false);
		
		this.selector = Selector.open();
		
		channel.connect(new InetSocketAddress(ip,port));
		channel.register(selector, SelectionKey.OP_CONNECT);
	}

	public void listen() throws IOException {
		while (true) {
			selector.select();
			Iterator<SelectionKey> it = this.selector.selectedKeys().iterator();
			while (it.hasNext()) {
				SelectionKey key = (SelectionKey) it.next();

				it.remove();

				if (key.isConnectable()) {
					SocketChannel channel = (SocketChannel) key.channel();
					if(channel.isConnectionPending()){
						channel.finishConnect();
						
					}

					channel.configureBlocking(false);

					channel.write(ByteBuffer.wrap(new String("你在他乡还好吗").getBytes()));

					channel.register(this.selector, SelectionKey.OP_READ);
					
				} else if (key.isReadable()) {
						read(key);
				}

			}

		}
	}

	public void read(SelectionKey key) throws IOException{
	    SocketChannel channel = (SocketChannel) key.channel();
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        int len = channel.read(buffer);
        byte[] data = new byte[len];
        System.arraycopy(buffer.array(), 0, data, 0, len);
        String msg = new String(data).trim();
        System.out.println("client receive one msg:"+msg);
        ByteBuffer outBuffer = ByteBuffer.wrap(msg.getBytes());
	}
	
	
	public static void main(String[] args) throws IOException {
		NIOClient client = new NIOClient();
		client.initClient("localhost",8080);
		client.listen();
	}

}
分享到:
评论

相关推荐

    java nio示例代码

    这些示例通常会包含简单的读写文件、服务器端与客户端的通信以及多路复用的使用,帮助初学者快速理解NIO的工作原理和实际应用。在学习过程中,你可以逐步深入,从基础的Buffer操作到复杂的Selector机制,掌握Java ...

    netty示例NIO示例

    myeclipse开发通信示例,框架netty,代码本人写的,而且已测试通过,先运行NettyService,再运行NettyClient即可看到效果。nio示例也有,原理一样,运行先后顺序同netty.

    nio入门文档及示例代码

    四、NIO示例代码 在`nio-src.rar`中可能包含了以下类型的示例代码: 1. **文件读写示例**:演示如何使用FileChannel进行文件的读取和写入,可能会包含`transferTo()`和`transferFrom()`等方法的使用。 2. **网络通信...

    NIOHTTPServer:带有 JDK 的 NIO 示例 HTTP 服务器

    带有 JDK 的 NIO 示例 HTTP 服务器 使用以下命令也使用 Maven build 构建项目 mvn clean install 使用以下 Maven 构建命令构建具有依赖库的项目 mvn clean assembly:assembly 从位于目标文件夹下的构建 jar 执行...

    JAVA nio的一个简单的例子

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种I/O模型,旨在提供一种更高效、更具弹性的I/O处理方式。相比于传统的BIO( Blocking I/O)模型,NIO在处理高并发和大...

    code4netty:BIO、PIO(Pseudo-Asynchronous)、NIO示例,以及基于Netty的实现各种功能的测试demo。基于Netty4.1.22

    - **NIO示例**:演示了如何使用Java NIO进行非阻塞I/O操作。 - **Netty基础功能**:包括服务器启动、客户端连接、数据传输、心跳检测、异常处理等。 - **高级特性**:可能涵盖了Netty的ChannelHandlerContext、...

    NIO实例

    压缩包中的"dsapp"可能是某种数据服务应用程序的名称,它可能使用了NIO技术来提高其I/O性能,或者是一个包含NIO示例代码的文件夹。如果能够访问这个文件,我们可以学习到具体的代码实现,进一步了解NIO在实际编程中...

    java socket Bio Nio example

    **NIO示例:** ```java Selector selector = Selector.open(); ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.bind(new InetSocketAddress(8080)); ...

    java NIO详细教程

    #### 五、Java NIO 示例 ##### Channel和Buffer操作示例 ```java // 创建一个FileChannel FileChannel fileChannel = new FileInputStream(file).getChannel(); // 创建一个ByteBuffer ByteBuffer buffer = ...

    java NIO原理和使用

    下面是一个简单的 Java NIO 示例,展示了如何使用 `FileChannel` 和 `ByteBuffer` 进行文件复制: ```java package nio; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio....

    javaSE相关示例代码, 如JDK新特性,集合分析,NIO,concurrent等 Java学习资料

    通过NIO示例代码,我们可以学习如何创建通道、选择器,以及如何进行异步的数据读写。 4. **并发编程**:Java并发编程是Java SE中的一个重要领域,涉及线程、同步、锁、原子变量、并发容器等。Java提供了丰富的并发...

    java_NIO_入门

    在实际操作中,运行NIO示例代码需要一些基本配置: - 安装JDK1.4或以上版本,并将其路径设置好以便能够使用命令行编译和运行Java程序。 - Windows系统下可以使用“Command”或者“***”命令提示符,而在UNIX系统下...

    aio_bio_nio.rar

    NIO示例则可能使用Selector、ServerSocketChannel和SocketChannel进行编程。 **应用场景** - **BIO**:适用于简单的服务器,如早期的Tomcat服务器,以及需要低延迟、高响应的单线程或少量连接的应用。 - **NIO**:...

    java nio基础使用示例

    以上就是Java NIO的基础使用示例。通过这种方式,服务器可以高效地处理来自多个客户端的连接请求,而不需要为每个客户端创建单独的线程,降低了系统的资源消耗。值得注意的是,Java NIO的API相对复杂,使用时需要...

    Java NIO测试示例

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效、灵活的I/O操作方式。NIO与传统的 Blocking I/O(阻塞I/O)模式相比,...

    JavaNIO[整理].pdf

    4. NIO示例: - NIO读取文件示例中,使用FileChannel从文件中读取数据,通过`channel.read(buffer)`将数据读入Buffer,而不是直接读到字节数组,这样可以批量读取,提高效率。 ```java public void nioRead(String...

    NIO原生API示例

    本文将深入探讨NIO原生API的示例,基于提供的"ServerImpCopy.java"文件名,我们可以推测这是一个关于服务器端NIO实现的示例代码。 在Java NIO中,核心组件包括通道(Channels)、缓冲区(Buffers)和选择器...

    Java_NIO深入浅出.doc

    4. NIO示例: 与传统的IO相比,NIO在读取文件内容时,可以使用`FileChannel`和`ByteBuffer`。`FileChannel`可以从文件中读取数据到缓冲区,然后从缓冲区获取数据,而不是直接从文件流中读取。这种方式减少了数据...

    Java使用BIO和NIO进行文件操作对比代码示例

    "Java使用BIO和NIO进行文件操作对比代码示例" Java BIO和NIO是两种不同的输入/输出(IO)模型,在文件操作中发挥着重要作用。BIO(Blocking I/O)是一种同步阻塞IO模式,而NIO(Non-Blocking I/O)是一种同步非阻塞...

    xsocket NIO框架示例

    xsocket NIO框架示例 resources 中有相关的 资料。telnet服务测试教程。和相关jar

Global site tag (gtag.js) - Google Analytics