`
whao189
  • 浏览: 123453 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

创建非阻塞的Socket服务器<一>

阅读更多
前一篇文章我专门为创建多线程的Socket服务,但是貌似没有很多人来看啊。。汗!不过这

并没有什么,我也是刚刚开始写博客,重要的是把自己的理解记下来防止以后忘了,当然了如

果能给其他的新手一些指引那更好!呵呵。。。不说了直接入正题。来看看我们今天讨论的内

容。

上一篇文章我们讨论了怎么创建多线程的socket服务,里面的demo以及讲解我已经写了出来

如果看了的同志们心里面现在应该都有一些印象了,但是在博客的结尾我也提出了一些问题,

怎么防止阻塞。。。。那么这边博文就是为了解决这个问题的。。。

那么 我们首先来认识一下几个类 和 接口:
ServerSocketChannel:可以说ServerSocket的替代类,支持阻塞通信与非阻塞通信
SocketChannel:Socket的替代类,支持阻塞通信与非阻塞通信
Selector:为ServerSocketChannel监控接受连接就绪事件,为SocketChannel监控连接

就绪、读就绪、写就绪事件

SelectionKey:代表ServerSocketChannel及SocketChannel 向Selector注册事件的

句柄。当一个SelectionKey对象位于Selector对象的selected-keys集合中时,就表示

与这个SelectionKey对象相关的事件发生了。。 以上这些类都是Channel接口的子类

备注:其实我们还要关注一个Buffer 和 Charset类  他们定义了缓冲和字符串与字节的互

相转换。

看到这里已经差不多了解了NIO的30%了。。。。。。。。但是要想真正的了解NIO 这些还远

远不够。

接下来我们来详细的看看:

首先我们得知道,ServerSocketChannel和SocketChannel都是SelectableChannel的

子类,SelectableChannel类以及他的子类都能委托Selector来监控他们可能发生的事情

看一些段伪代码:
Selector selector = Selector.open();
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
SelectionKey selectionKey = 
serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT);


看一下源码会发现 serverSocketChannel  的 register方法是从父类(SelectableChannel)继承而来的 register(Selector sel, int ops)但是调用的是

register(sel, ops, null);是的,典型的多态!

ServerSocketChannel 和 SocketChannel 他们都有register这个方法。。但是 他们

所关注的事件又不同。在ServerSocketChannel中register的时候只肯能发生一件事情,

也就是他的注册事件只有一件事那就是 OP_ACCEPT,但是 SocketChannel 却不同他可能

发生3个事件OP_CONNECT:客户端和服务端连接就绪事件,表示服务端和客户端已经连接成功

OP_READ:读就绪事件,表示在输入流中有可读的数据,可以执行read操作

OP_WRITE:写就绪时间,表示输出流中有可写的数据,可以执行write操作

另外还有另外的两个方法那就是read 和write只不过read和write需要参数都是

ByteBuffer。

好了,今天就先概括到这里,现在回想一下你对NIO包中类结构的理解,这篇博文只是对NIO

中的一个概括,明天我们将对他们一一讲解!希望对新同学们有帮助,当然了我也是新手!呵

呵。。





分享到:
评论

相关推荐

    Linux下的Socket编程实例(阻塞和非阻塞)

    阻塞和非阻塞Socket Socket 编程中有两种方式:阻塞(Blocking)和非阻塞(Non-Blocking)。阻塞 Socket 指的是在执行某个操作时,程序将等待该操作完成,而非阻塞 Socket 则可以继续执行其他操作,不会被阻塞。 ...

    Socket通信(TCP)非阻塞模式-select模型

    本资源是关于 Socket 通信的非阻塞模式下的 Select 模型的示例代码,基于 TCP 协议,分为服务器端和客户端。该示例代码展示了如何使用 Select 模型实现非阻塞 Socket 通信。 知识点1:非阻塞模式 非阻塞模式是指在...

    基于多线程的非阻塞 socket 编程

    基于多线程的非阻塞Socket编程是一种高效处理网络通信的技术,结合了多线程编程和非阻塞I/O。它用于构建高性能的网络服务器和客户端,可以同时处理多个连接而不使线程阻塞在I/O操作上。本文详细描述这种编程模式的...

    Winsocket入门教程二:非阻塞式服务器和客户端程序TCP.doc

    非阻塞是相对于阻塞而言,阻塞指的是在进行一个操作的时候,如服务器接收客户端的连接,如果该操作没有执行完成,程序会一直阻塞在操作执行的地方,直到该操作返回一个明确的结果。而非阻塞式程序则不一样,非阻塞式...

    lab8-SOCKET编程原理.ppt

    4. 通信方式:包括阻塞和非阻塞两种方式。 5. SOCKET 的位置:在应用层程序中,SOCKET 位于 IP 数据链路层和物理层之间,负责将应用层数据转换为网络数据。 6. 不同操作系统中的 SOCKET:包括 Windows Socket...

    完成端口(IOCP) 服务器源码

    1. 创建服务器socket, 并将socket设置为非阻塞模式 2. bind()绑定IP地此与端口 3. listen() 4. 创建IO完成端口,将socket绑定到IO完成端口上 5. 根据当前机器CPU个数创建工作者线程池 6. 使用AcceptEx()提前创建...

    tcp服务器客户端demo

    在程序启动时候创建一个工作模式的代理来区分是否启动服务器以及是阻塞方式还是非阻塞方式 在WorkModeProxy中根据配置决定使用Socket的类型,以及工作模式的类型 支持使用不同的socket,可以通过SocketFactory进行...

    python实现单线程多任务非阻塞TCP服务端

    创建服务器socket sock = socket(AF_INET, SOCK_STREAM) # 2.绑定主机和端口 addr = ('', 7788) # sock.bind(addr) # 3. 设置最大监听数目,并发 sock.listen(10) # 4. 设置成非阻塞 sock.setblocking(False) # 保存...

    (牛客网C++课程)Linux 高并发Web服务器项目实战(带定时检测代码)

    1. 线程池 + 非阻塞 socket + epoll + 事件处理的并发模型 2. 状态机解析HTTP请求 3. 心跳机制 4. 简易日志系统 主要内容: 1. 使用 socket 实现服务器和浏览器客户端的通信; 2. 用 epoll 事件检测技术实现 IO 多...

    MFC网络编程之自制浏览器

     对于这些概念,初学者的理解也许只能似是而非,我将用一个最简单的例子说明异步非阻塞Socket的基本原理和工作机制。目的是让初学者不仅对Socket异步非阻塞的概念有个非常透彻的理解,而且也给他们提供一个用Socket...

    c++SOCKET详解

    下面是对 C++ SOCKET 通讯的详细解释,包括五种常用的 I/O 模型、阻塞和非阻塞模式、套接字的使用等。 一、阻塞模式和非阻塞模式 在 Windows 平台下,套接字默认为阻塞模式。在阻塞模式下,执行 I/O 操作时,程序...

    Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】

    本文实例讲述了Python实现的服务器。分享给大家供大家参考,具体如下: python – 单进程服务器 #coding=utf-8 from socket import * #创建套接字 serSocket = socket(AF_INET, SOCK_STREAM) #重复使用绑定信息 ...

    c语言下进行socket通信.pdf

    在实际开发中,还需要考虑错误处理、多线程/进程支持、非阻塞I/O以及连接复用等高级特性。同时,为了保证网络通信的可靠性,可以使用TCP协议,而如果对实时性要求较高,可能会选择UDP协议。理解并熟练掌握这些基本...

    tcp服务器epoll的多种实现1

    Non-blocking I/O 是一种非阻塞的 I/O 模型,在这个模型中,进程不会阻塞,而是立即返回一个错误代码,表明 I/O 操作尚未完成。 Non-blocking I/O 的缺点是需要额外的逻辑来处理 I/O 事件。 I/O 多路复用是指使用一...

    服务器概要设计说明.docx

    Windows下有五种非阻塞I/O模型:选择〔Select〕、异步选择〔WSAAsyncSelect〕、事件选择〔WSAEventSelect〕、重叠I/O〔Overlapped I/O〕和完成端服务器概要设计说明全文共5页,当前为第2页。服务器概要设计说明全文...

    高性能IO模型浅析

    (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。 (3)IO多路复用(IO Multiplexing):即经典的Reactor...

    Windows网络编程.pdf

    设计一个基本的网络服务器需要完成以下几个步骤:初始化 Windows Socket,创建一个监听的 Socket,设置服务器地址信息,并将监听端口绑定到服务器上。 网络编程概念 网络编程概念是学习网络编程的基础,包括阻塞和...

    Linux高性能服务器编程

    9.2 poll系统调用 9.3 epoll系列系统调用 9.3.1 内核事件表 9.3.2 epoll_wait函数 9.3.3 LT和ET模式 9.3.4 EPOLLONESHOT事件 9.4 三组IO复用函数的比较 9.5 IO复用的高级应用一:非阻塞connect 9.6 IO复用...

    Tomcat面试专题及答案.pdf

    nio:JDK1.4 开始支持,同步阻塞或同步非阻塞 IO。 指定使用 NIO 模型来接受 HTTP 请求 protocol=”org.apache.coyote.http11.Http11NioProtocol” 指定使用 NIO 模型 来接受 HTTP 请求。默认是 BlockingIO,配置为 ...

Global site tag (gtag.js) - Google Analytics