1 0

请谈谈NIO scoket适用的与不适用的场景10

我个人的理解,由于“NIO socket”的实现主体上一般为一个线性的处理过程。
所以只适合做 “请求 —— 响应 ”式的网络连接。
也就是说客户端必须向服务器发送一个请求, 服务器才能响应给客户端数据。这种场景比较典型就是web服务器。

但对于由服务器主动发起的信息的服务则无从下手,比如说一个在线游戏服务器。服务器端常常需要向所有在线用户发送同步数据信息。类似此种服务只能由传统的 “多线程IO socket” 来实现。

不知道我这种理解是否正确,是否因为知识的有限对NIO有些误解,望朋友帮我解惑。谢谢。
问题补充:
类似一楼朋友的文章我已经看过很多。所以才会有我的疑问。

这么说吧, 假如是一个聊天室。A B C 三个玩家分别连入。

A发言。那么我们只能在服务器端得A事件,并返回给A。B C如何才能再次注册一个写事件。并得到A的发言。
如果A对B发送密语。服务如何开启B的写事件,并发送A的话给B。
服务器如果每个小时为用户报时一次,现在是几点整。又该如何注册所有人的写事件,并发送信息。

也就是说类似这种server push的事情在nio中竟然无法实现。

2009年3月17日 09:33

2个答案 按时间排序 按投票排序

1 0


NIO非堵塞应用通常适用用在I/O读写等方面,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内容,如果没有内容进来,read()也是傻傻的等,这会影响我们程序继续做其他事情,那么改进做法就是开设线程,让线程去等待,但是这样做也是相当耗费资源的。

Java NIO非堵塞技术实际是采取Reactor模式,或者说是Observer模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的I/O读写,不堵塞了。

NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有事件发生时,他会通知我们,传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的socketchannel,然后,我们从这个Channel中读取数据,放心,包准能够读到,接着我们可以处理这些数据。

Selector内部原理实际是在做一个对所注册的channel的轮询访问,不断的轮询(目前就这一个算法),一旦轮询到一个channel有所注册的事情发生,比如数据来了,他就会站起来报告,交出一把钥匙,让我们通过这把钥匙来读取这个channel的内容。

在传统的网络编程中,我们通常使用一个专用线程(Thread)来处理一个Socket连接,通过使用NIO,一个或者很少几个Socket线程就可以处理成千上万个活动的Socket连接。

NIO可以提高性能。每个客户端连接之后,会有一个独立的SocketChannel与它通信,这个 SocketChannel会在用户的整个生存周期中存在。用户假如断开连接,服务器会得到-1,并且会抛出Connection reset异常,通过捕捉这两个特征,可以在用户意外断开连接后清理相关的资源。由于NIO是异步通信的,所以没有复杂的线程治理。

2009年3月17日 09:52
0 0

楼上的第一句话百度一下330个结果.....

2009年3月17日 11:05

相关推荐

    NioSocket,包括server端和client端

    在Java编程中,NIO(New Input/Output)提供了一种不同于传统IO模型的I/O操作方式,其核心特点是能够进行多路复用,即一个线程可以同时处理多个连接,这使得NioSocket在高并发场景下具有较好的性能表现。 服务器端...

    java NIO socket聊天室

    使用NIO socket不需要多线程来处理多个连接的请求,效率非常高 可以作为NIO socket入门的例子,Reactor模式,重点理解key.attach, jar文件里包含了源代码 1,运行server.bat启动服务器,可以打开编辑,修改端口号 ...

    Java NIO Socket基本

    NIO在Java 1.4版本引入,其设计目标是提供一种更高效、更灵活的I/O操作方式,特别适合处理大量并发连接的场景,如服务器端编程。在NIO中,我们不再像BIO那样等待一个操作完成,而是通过选择器(Selector)监控多个...

    《NIO与Socket编程技术指南》_高洪岩

    《NIO与Socket编程技术指南》是一本深入探讨Java NIO(New Input/Output)和Socket编程的专业书籍,由高洪岩撰写。本书主要针对Java开发者,旨在帮助他们理解和掌握这两种在开发网络应用中至关重要的技术。 Java ...

    一般Socket客户端与Mina NIO Socket客户端对比示例

    1. 性能:Mina NIO由于其非阻塞特性,在高并发环境下性能更优,而普通Socket客户端在低并发或响应时间要求不高的场景下可能更具优势。 2. 并发能力:Mina NIO的并发能力远超普通Socket,因为其可以有效利用线程资源...

    java NIO socket聊天

    `Socket`在NIO中的实现是`SocketChannel`,它代表了网络上的一个连接。`ServerSocketChannel`则用于监听客户端的连接请求。通过`ServerSocketChannel`的`accept()`方法,服务器可以接收新的客户端连接,然后将其注册...

    java nio socket 例子

    本例包含服务器端和客户端,多线程,每线程多次发送,Eclipse工程,启动服务器使用 nu.javafaq.server.NioServer,启动客户端使用 nu.javafaq.client.NioClient。另本例取自javafaq.nv上的程序修改而成

    默蓝网络通信测试工具(NIOSocket工具)支持TCP/IP和HTTP通信-网络通信开发人员必备

    "默蓝网络通信测试工具(NIOSocket工具)"正是这样一款针对TCP/IP和HTTP通信的专业测试工具,它为网络通信开发人员提供了强大的测试与分析能力。 首先,我们要理解TCP/IP协议的重要性。TCP(传输控制协议)和IP(网际...

    java nio 实现socket

    在探讨如何使用Java NIO实现Socket通信之前,我们需要先理解NIO(Non-blocking I/O,非阻塞I/O)与传统阻塞I/O之间的区别。 **传统阻塞I/O模型**:在传统的Java IO编程中,当我们调用`read()`或`write()`方法时,...

    基于NIO的socket举例

    基于NIO的socket举例 基于NIO的socket举例 基于NIO的socket举例 基于NIO的socket举例 基于NIO的socket举例基于NIO的socket举例 基于NIO的socket举例

    《NIO与Socket编程技术指南》高洪岩.zip

    非常详细地讲解了NIO中的缓冲区、通道、选择器、编码,以及使用Socket技术实现TCP/IP和UDP编程,细化到了演示全部SocketOption的特性,这对理解基于NIO和Socket技术为基础所开发的NIO框架是非常有好处的,本书以案例...

    nio的socket

    与`Socket`不同的是,`SocketChannel`是非阻塞的,这意味着当没有数据可读或无法写入时,线程不会被阻塞,而是可以执行其他任务。 2. **ServerSocketChannel**:对应于服务端的监听通道,它用于代替`ServerSocket`...

    基于NIO socket高并发的监控系统

    支持高并发,可以通过socket传输文件。 服务机实现了的功能:1、不间断的接收客户端的消息。2、当有指令过来的时候跟客户机建立连接操作完成后断开连接; 客户机实现了的功能:1、不间断的发送本机运行情况。2、监听...

    Socket与NIO的Demo.rar

    用于博文https://blog.csdn.net/lyz_zyx/article/details/104062815《Android网络编程(十四) 之 Socket与NIO》中演示Socket与NIO使用的Demo

    Socket 之 BIO、NIO、Netty 简单实现

    **RPC(Remote Procedure Call)与Socket** RPC是一种远程调用技术,使得客户端可以像调用本地方法一样调用远程服务器上的方法。在Socket通信中,RPC可以借助于序列化和反序列化机制将方法调用和参数转换成可传输的...

    nio socket 消息推送

    总的来说,`NIO`在`Socket`消息推送中的应用能够显著提高服务端的并发处理能力,尤其适用于大规模的实时消息推送场景。结合`SpringBoot`的便捷性,可以快速构建出高效、稳定的消息推送服务。然而,`NIO`的学习曲线较...

    java socket nio 研究

    总的来说,Java Socket结合NIO,能够构建出高性能的网络应用,尤其适用于需要处理大量并发连接的场景,如聊天服务器、流媒体服务等。`NonBlockingServer.java`和`Client.java`的代码分析和实践,可以帮助我们更好地...

    socket通信NIO代理模式demo实例

    Socket通信在IT行业中是网络编程的基础,特别是在Java领域,它提供了服务器与客户端间进行数据交换的接口。NIO(Non-blocking I/O)是Java提供的一个高效I/O模型,相较于传统的IO模型,NIO具有非阻塞、多路复用等...

    android-socket-nio-master.zip

    在Android中,NIO适用于服务器端需要处理大量短连接或长连接的场景,如聊天应用、实时游戏等。 在Socket通信中,NIO主要通过Selector和Channel两个核心组件来实现。Selector负责监听多个Channel的读写事件,而...

    Ioserver java Nio socket 框架

    Ioserver java Nio socket 框架 是个不错的NIO 通讯框架,本来想学习mina框架,看了看mina的源码太头痛,本人觉得看懂了Ioserver 再看mina的框架,想多的学习 java NIO 的也可以下载 看看,很值得学习啊!!!

Global site tag (gtag.js) - Google Analytics