`
竹林闲人
  • 浏览: 13084 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论
  • 竹林闲人: zwchen 写道玩好技术,最重要是发自内心的热爱。开始几年, ...
    毕业安家
  • zwchen: 玩好技术,最重要是发自内心的热爱。开始几年,对技术最好偏执点好 ...
    毕业安家

很诡异的nio非阻塞通信

阅读更多
我先把代码贴出来吧

public class AServer {
	public static void main(String[] args) throws Exception {
		ServerSocketChannel server = ServerSocketChannel.open();
		server.configureBlocking(false);
		server.socket().bind(new InetSocketAddress(8080));
		Selector selector = Selector.open();
		server.register(selector, SelectionKey.OP_ACCEPT);
		
		while (true) {
			selector.select();
			System.out.println("selector.select()---------" + selector.select());
			//readKeys集合
			Iterator<SelectionKey> iter = selector.selectedKeys().iterator();
			while (iter.hasNext()) {
				SelectionKey key = iter.next();
				iter.remove();
				
				if (key.isAcceptable()) {
					System.out.println("acceptable");
//					ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
					SocketChannel client = server.accept();
					client.configureBlocking(false);
					client.register(selector, SelectionKey.OP_READ);
				} else if (key.isReadable()) {
					System.out.println("this server is readable");
				}
			}
		}
	}
}


-------------------------------------------------------------------------------------------------------
public class AClient {
	public static void main(String[] args) throws Exception {
		SocketChannel client = SocketChannel.open();
		client.configureBlocking(false);
		Selector selector = Selector.open();
		client.register(selector, SelectionKey.OP_CONNECT);
		client.connect(new InetSocketAddress("localhost", 8080));
		
		while (true) {
			selector.select();
			//readKeys
			Iterator<SelectionKey> iter = selector.selectedKeys().iterator();
			while (iter.hasNext()) {
				SelectionKey key = iter.next();
				iter.remove();
				
				if (key.isConnectable()) {
//					System.out.println("connnect");
					SocketChannel socket = (SocketChannel) key.channel();
					socket.configureBlocking(false);
//					socket.register(selector, SelectionKey.OP_READ);
//					System.out.println("client is connected");
				} else if (key.isReadable()) {
					System.out.println("client is read");
				}
			}
		}
	}
}


-------------------------------------------------------------------------------------------------------
我注释掉AServer中的System.out.println("acceptable")和AClient中的System.out.println("connnect"),在AServer中就不能打印System.out.println("this server is readable")这句了。

还有两个问题就是我没有注掉System.out.println("acceptable")和System.out.println("connnect")时,AServer中一直会执行System.out.println("this server is readable");AClient也会一直执行System.out.println("connnect"),我感到疑惑的是执行了
SelectionKey key = iter.next();
				iter.remove();
这个之后,key不是被删除了么,不应该出现很多次
if (key.isConnectable()) {
//					System.out.println("connnect");
					SocketChannel socket = (SocketChannel) key.channel();
					socket.configureBlocking(false);
//					socket.register(selector, SelectionKey.OP_READ);
//					System.out.println("client is connected");
				} 
这里面打印的内容呀

还有个疑惑就是在AServer中
SocketChannel client = server.accept();
					client.configureBlocking(false);
					client.register(selector, SelectionKey.OP_READ);
执行了这段代码,client注册SelectionKey.OP_READ为可读的操作,是服务器端和客户端的key都是Readable可读的?如果是可读的为什么在AClient中没有打印
System.out.println("client is read");
这句呀。

由于才接触到nio这块,不是很熟悉,大家可以帮我看看么,感谢ing
分享到:
评论

相关推荐

    基于JavaNIO的非阻塞通信的研究与实现

    ### 基于Java NIO的非阻塞通信的研究与...尽管非阻塞通信带来了很多优势,但在某些特定情况下,如错误处理等方面,传统的阻塞模式可能更为适用。因此,在实际开发中,根据具体的应用场景选择合适的通信模式至关重要。

    阻塞通信和非阻塞通信的区别

    在Java中,通过使用java.nio包中的类可以实现非阻塞通信。 阻塞通信是指在发送或接收数据时,当前线程将被阻塞,直到数据发送或接收完成。这种模式下,线程将被阻塞,无法执行其他操作。例如,在使用阻塞Socket时,...

    Nio非阻塞socket通信demo

    在这个“Nio非阻塞socket通信demo”中,我们可以深入理解NIO在Socket通信中的应用。 1. **Java NIO基础** - **通道(Channels)**:NIO的核心概念之一,通道是数据读写的目标或来源,如文件通道、套接字通道等。...

    Java NIO非阻塞服务端与客户端相互通信

    总之,Java NIO非阻塞服务端与客户端通信的关键在于利用非阻塞IO和选择器,实现高效的多路复用,有效利用系统资源,提升并发处理能力。通过实践本教程中的代码示例,你将能够清晰地理解这一概念并掌握其应用技巧。

    用Java实现非阻塞通信

    java.nio包提供了支持非阻塞通信的类,主要包括: ● ServerSocketChannel:ServerSocket的替代类,支持阻塞通信与非阻塞通信。 ● SocketChannel:Socket的替代类,支持阻塞通信与非阻塞通信。 ● Selector:为...

    JavaSocket学习---NIO实现非阻塞的通信

    接下来是`EchoClient.java`,客户端通常采用单线程阻塞I/O模型,但在NIO模式下,也可以实现非阻塞通信。客户端创建一个`SocketChannel`连接到服务器,然后同样注册到`Selector`,设置感兴趣的读事件。客户端发送数据...

    基于NIO非阻塞的java聊天demo(支持单聊和群聊)

    在这个基于NIO非阻塞的Java聊天demo中,我们将会看到如何利用NIO实现一个支持单聊和群聊的应用。 首先,NIO的核心组件包括Channel、Buffer、Selector和Pipe。在传统的IO模型中,数据是从流的一端流向另一端,而在...

    java非阻塞通信研究

    总之,Java非阻塞通信的研究涵盖了Java NIO和NIO.2的核心机制,以及如何在实际项目中应用这些技术来构建高并发、低延迟的系统。通过深入理解这些概念,开发者能够构建出更加高效、可扩展的Java应用程序。《Java非...

    Java-NIO非阻塞服务器示例.docx

    Java-NIO非阻塞服务器示例 本资源主要讲解了Java-NIO非阻塞服务器的示例,通过使用Java-NIO包来实现非阻塞的服务器端模式。下面是从代码中提取的知识点: 一、Java-NIO包简介 Java-NIO(New I/O)包是Java 1.4...

    使用NIO实现非阻塞socket通信

    本项目利用NIO实现了一个简单的非阻塞socket通信的聊天工具,使得在高并发环境下,服务器能够同时处理多个客户端连接,提高系统性能。 1. **非阻塞I/O**: 在BIO模型中,读写操作是阻塞的,即当没有数据可读或无法...

    Android开发进阶之NIO非阻塞包

    ### Android开发进阶之NIO非阻塞包 #### NIO非阻塞通讯方式解析 在探讨Android DDMS源码中的NIO(Non-blocking I/O)非阻塞通讯方式时,我们首先需要理解NIO的基本概念及其在Android开发中的应用。 **NIO简介**:...

    阻塞及非阻塞通信

    阻塞与非阻塞通信是计算机网络编程中的两种基本通信方式,主要涉及到Java NIO(Non-blocking Input/Output,非阻塞输入/输出)框架。Java NIO 提供了一种新的方式来处理I/O操作,使得程序在进行读写操作时,不再必须...

    Java NIO非阻塞服务器示例.docx

    在这个名为"Java NIO非阻塞服务器示例"的文档中,展示了如何使用Java NIO创建一个简单的非阻塞服务器。首先,我们来看服务器的核心组件: 1. **ServerSocketChannel**:这是Java NIO中的一个关键类,用于监听客户端...

    JavaNIO非阻塞服务器示例.pdf

    在这个Java NIO非阻塞服务器示例中,我们看到如何使用Mina2.0框架来构建一个简单的服务器。 首先,让我们了解NIO的基本概念。传统的Java IO基于流和字节缓冲区,采用阻塞I/O模型,即当一个操作(如读或写)进行时,...

    android开发进阶之NIO非阻塞包

    ### Android开发进阶之NIO非阻塞包 #### 关键知识点概述 1. **NIO(New I/O)的概念**:NIO是Java 1.4版本开始引入的新I/O处理模型,它通过非阻塞的方式提高了I/O操作的性能。在Android开发中,利用NIO可以显著...

    Android开发进阶之NIO非阻塞包[定义].pdf

    总的来说,Android开发中的NIO技术提供了高性能、非阻塞的网络通信解决方案,有效地解决了多线程管理和资源消耗的问题。它不仅简化了并发编程,也提升了Android应用程序在网络通信方面的效率。对于Android开发者来说...

    JAVA非阻塞通信技术原理研究与实现.pdf

    为此,Java非阻塞通信技术应运而生,它基于Java NIO(New I/O)包的全新设计理念,为服务端的高并发处理提供了新的解决方案。 Java NIO的非阻塞通信机制,与传统阻塞式通信的最大区别在于它采用了事件驱动的方式...

    非阻塞通信例子【nonblocking】示例

    在Java中,非阻塞通信主要通过NIO(Non-blocking Input/Output,非阻塞输入/输出)实现,这是一种基于事件驱动的I/O模型,允许程序在等待数据准备就绪时进行其他操作。 非阻塞通信的核心概念是通道(Channel)和...

    非阻塞通信

    在Java中,非阻塞通信主要通过NIO(New IO)库来实现,这个库提供了一种不同于传统IO的处理方式,即BIO(Blocking IO)。NIO引入了选择器(Selector)、通道(Channel)和缓冲区(Buffer)等概念,使得开发者可以更...

    自己写的Java NIO 同步不阻塞IO操作

    描述中提到的"用nio想的一个不阻塞NIOSocket例子"可能是一个Java NIO的Socket通信示例,利用NIO的Channel和Selector来实现客户端和服务器之间的非阻塞通信。通常,NIO中的SocketChannel用于网络通信,Selector用于...

Global site tag (gtag.js) - Google Analytics