`
whao189
  • 浏览: 124275 次
  • 性别: 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

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

呵。。





分享到:
评论

相关推荐

    MFC实现非阻塞Socket通信

    本文将深入探讨如何使用MFC实现非阻塞Socket通信,并结合protobuf(Protocol Buffers)作为数据交换格式,构建一个允许多个客户端与单一服务器进行通信的系统。 首先,我们来理解“非阻塞Socket”。在传统的阻塞...

    Socket C++ TCP阻塞\非阻塞 服务器 客户端 开发

    ### Socket C++ TCP阻塞与非阻塞服务器客户端开发 #### 概述 本文档将详细介绍如何使用C++ Winsock库来开发TCP非阻塞服务器。通过本篇内容的学习,您将了解到设置socket函数为非阻塞模式的方法,并且能够深入了解...

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

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

    C++ socket 阻塞与非阻塞

    - **非阻塞模式**:服务器端可以使用一个线程来处理多个连接,通过轮询检查每个连接的状态,从而提高资源利用率。但是,这需要更精细的控制和调度,以防止性能瓶颈。 三、定时清除服务器连接资源 在服务器端,有时...

    socket 多线程 例程 非阻塞模式

    总之,"socket多线程例程非阻塞模式"是一个实用的编程实例,涵盖了网络通信、多线程以及异步处理的关键技术,对于学习和理解这些概念非常有价值。通过对源代码的分析和实践,开发者能够提升自己的网络编程技能,为...

    windows的阻塞和非阻塞Socket编程

    非阻塞Socket(Non-blocking Socket)则提供了另一种解决方案。在非阻塞模式下,当尝试读取数据但缓冲区为空,或者尝试写入但网络不可写时,recv()和send()函数并不会挂起,而是立即返回一个错误代码。开发者需要...

    python多线程非阻塞socket

    非阻塞Socket允许Socket在等待数据时不会被挂起,而是立即返回,这样可以提高系统的整体效率。 在Python中,我们可以使用`threading`模块来创建和管理线程。创建一个线程的基本步骤包括定义一个运行函数,然后创建...

    非阻塞模式socket程序

    1. `socket_server.py`:服务端代码,展示了如何创建一个非阻塞的Socket服务器,监听客户端连接,并通过poll或其他I/O多路复用机制处理客户端请求。 2. `socket_client.py`:客户端代码,演示了如何建立非阻塞的...

    非阻塞Socket的应用

    1. **服务器端**:创建并监听一个非阻塞Socket,通过I/O复用或异步I/O来处理来自多个客户端的连接请求。当有新的连接到达或数据可读时,服务器会处理这些事件,并将数据转发给其他客户端或存储到数据库。 2. **...

    feizuse.rar_C socket 非阻塞_网络服务_非阻塞_非阻塞 socket

    "feizuse.rar"中的源码可能包含了一个简单的网络服务器示例,展示了如何在Windows环境下创建非阻塞`socket`,设置异步事件,并响应来自客户端的连接请求和数据传输。通过分析和学习这个源码,我们可以了解到以下关键...

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

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

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

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

    异步非阻塞socket聊天室程序

    "异步非阻塞socket聊天室程序"是一个使用C++语言,并基于MFC(Microsoft Foundation Classes)库构建的项目,旨在实现高效的多用户通信。下面将详细阐述这个程序背后的关键知识点。 首先,我们关注的是"异步非阻塞...

    Python实现socket非阻塞通讯功能示例

    这篇文章会详细探讨如何使用Python实现socket非阻塞通信,并结合示例分析其原理、多线程以及客户端和服务器端的具体实现技巧。 首先,了解socket编程的基础概念至关重要。Socket是计算机网络数据传输的基本操作单元...

    C++封装类CWSocket(多线程 非阻塞)

    非阻塞模式在网络编程中是一种重要的设计模式。在阻塞模式下,当一个socket调用(如recv或send)执行时,如果数据尚未准备好,那么程序会暂停,等待数据的到来。而在非阻塞模式下,这些函数会在没有数据可读或无法...

    Nio非阻塞socket通信demo

    在“Nio非阻塞socket通信demo”中,你可能会看到如何创建和配置这些组件,以及如何编写处理读写事件的回调函数。通过这个示例,你可以深入理解NIO在Socket通信中的工作原理,并学习如何在实际项目中应用。

    使用NIO实现非阻塞socket通信

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

    socket 同步服务器存储

    因此,对于高并发场景,开发者通常会选择非阻塞的I/O模型,如异步套接字、IOCP(I/O完成端口)或者使用事件驱动的框架,如Node.js的Event Loop。 此外,服务器通常会进行错误处理和异常捕获,确保在出现错误时能...

    使用AIO实现非阻塞socket通信

    非阻塞socket通信与传统的阻塞I/O模式不同,阻塞模式会在数据未准备好时挂起线程,直到数据可读或可写。而非阻塞模式下,当请求的数据未准备好时,系统会立即返回一个状态,让调用者可以继续执行其他任务,等到数据...

    nodeJS+socket.io做一个简单的聊天室

    其非阻塞I/O模型和事件驱动特性使得它在构建高并发、实时应用时表现优秀,而Socket.IO则是一个为实时应用提供双向通信的库,它在Node.js环境中工作得非常出色。 首先,我们需要安装Node.js和npm(Node包管理器)。...

Global site tag (gtag.js) - Google Analytics