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

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

阅读更多
今天有一好友问我非阻塞 这一块的东西怎么没有写了。。

其实这两天却是有些浮躁了,看了看设计模式 学习了一些android的知识(毕竟现在

android 是我的工作内容啊)! 然而听到聊友这样的反应从我内心里来说还是很高兴的。

不管怎么说,我只希望我写的这些东西能够给他人一点提示,只要他人能够用得到就好,我就

是一个菜鸟,只不过是吧自己的理解记录一下,希望能通其他人共勉!

----------------------------------------------------------------------

承接 前几篇的内容。。。从前几篇的内容来看都是 细细的说了一下 NIO 包个个类的一些重要方法和属性,当然其实NIO包下并非只有这几个类!那么接下来我们就把这些 例子 综合一下 做一个小小的 实例!

做实例之前我要声明一点,接下来做的实例是我从孙卫琴,孙大姐的书籍中摘抄的,但是前面的理解 都是我个人的思想! 希望大家能明白这一点!

首先我们创建服务端目的在于 使用一个线程来处理三件事情,这样我们就打打提高了线程的

工作效率。

public class Server{
private Selector selector;
private ServerSocketChannel serverSocketChannel;
private int  port = 8000;
private Charset charset = Charset.forName("UTF-8");
  public Server(){
      selector = Selector.open();//这是一个静态方法创建一个 Selector
      serverSocketChannel = ServerSocketChannel.open();
      //这个地方一定要设置的 前面已经提到了 默认的是阻塞模式的
      serverSocketChannel.configureBlocking(false);
      //绑定端口
      serverSocketChannel.socket.bind(new InetSocketAddress(port));
  }
  public mainService(){
      //你可能会有疑问这个地方注册时候 是不是要注册三个
       //SelectionKey.OP_ACCEPT 但是 请记住 serverSocketChannel 就只能
       // 关注一个 连接接受时间
      serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT);
      while(selector.select()>0){
        Set selectKey = selector.selectedKeys();
        Iterator it   = selectKey.iterator();
        while(it.hasNext()){
            //这里我们要拿到 key 包含了socket所希望的任何事件
            SelectionKey key = (SelectionKey )it.next();
            it.remove();
            if(key.isAcceptable()){
             ServerSocketChannel ssc = (ServerSocketChannel)key.getChannel();
             SocketChannel socketChannel = (SocketChannel)ssc.accept();
             socketChannel.configureBlocking(false);
             ByteBuffer buffer = ByteBUffer.allocate(1024);
             socketCHannel.register(selector,SelectionKey.OP__READ | SelectionKey.OP_WRITE,buffer);
            }else if(key.isWriteable()){
                   writeService(key);
            }else if(key.isReadable()){
                   readService(key);
            }
        }
      }
  }
}

这里服务端就先到这里。。接下来会是客户端!
详细的东西 我会
分享到:
评论

相关推荐

    MFC实现非阻塞Socket通信

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

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

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

    windows的阻塞和非阻塞Socket编程

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

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

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

    C++ socket 阻塞与非阻塞

    本话题主要探讨的是在C++ Socket编程中的阻塞模式与非阻塞模式,以及它们在多线程环境下的应用和资源管理。 一、阻塞与非阻塞模式 1. **阻塞模式**:在阻塞模式下,当一个Socket调用(如recv或send)执行时,如果...

    socket 多线程 例程 非阻塞模式

    这个示例中的源代码包含了客户端和服务器端的实现,通过运行这些代码,你可以实际观察到多线程非阻塞模式下的socket通信。客户端发送数据到服务器,而服务器接收并回应,整个过程是并行且高效的。 总之,"socket多...

    python多线程非阻塞socket

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

    非阻塞模式socket程序

    回调函数在非阻塞Socket编程中起着关键作用。当接收到数据或发生特定事件(如连接、断开连接)时,程序会通过预先注册的回调函数通知应用层。这种方式使得处理网络事件更加灵活,应用可以根据自身需求定制事件处理...

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

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

    # 基于多线程的非阻塞Socket编程教程 ## 简介 基于多线程的非阻塞Socket编程是一种高效处理网络通信的技术,结合了多线程编程和非阻塞I/O。它用于构建高性能的网络服务器和客户端,可以同时处理多个连接而不使线程...

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

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

    Nio非阻塞socket通信demo

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

    socket 同步服务器存储

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

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

    通过阅读和分析这些代码,我们可以深入了解如何在C++中实现多线程、非阻塞的socket类,以及如何添加超时控制。 总的来说,C++封装类CWSocket的实现结合了多线程、非阻塞I/O和超时处理等关键技术,旨在提供一个高效...

    使用NIO实现非阻塞socket通信

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

    使用AIO实现非阻塞socket通信

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

    c++实现Socket服务器和客户端功能

    在这个项目中,我们将探讨如何使用C++在Visual Studio 2008环境下实现Socket服务器和客户端的基本功能。 首先,Socket在C++中主要是通过`&lt;winsock2.h&gt;`和`&lt;ws2tcpip.h&gt;`这两个库来使用的,它们提供了与操作系统底层...

Global site tag (gtag.js) - Google Analytics