`
whao189
  • 浏览: 123215 次
  • 性别: 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);
            }
        }
      }
  }
}

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

相关推荐

    完成端口(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 多...

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

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

    MFC网络编程之自制浏览器

    网络编程,当然要用到Windows Socket(套接字)技术。Socket相关的操作由一系列...因此,建议初学者学习编网络通信程序时,暂且不要用MFC提供的类,而先用Winsock2 API,这样有助于对异步、非阻塞Socket编程机制的理解。

    高性能IO模型浅析

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

    服务器概要设计说明.docx

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

    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,配置为 ...

    Java网络编程(第三版)中文版.part11.rar

    第十二章 非阻塞I/O 391 一个示例客户端 392 一个示例服务器 396 缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的...

    Java网络编程(第三版)高清中文版.part01.rar

    第十二章 非阻塞I/O 391 一个示例客户端 392 一个示例服务器 396 缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的...

    Java网络编程(第三版)中文版.part06.rar

    第十二章 非阻塞I/O 391 一个示例客户端 392 一个示例服务器 396 缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的...

    Java网络编程(第三版)中文版.part07.rar

    第十二章 非阻塞I/O 391 一个示例客户端 392 一个示例服务器 396 缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的...

    Java网络编程(第三版)中文版.part09.rar

    第十二章 非阻塞I/O 391 一个示例客户端 392 一个示例服务器 396 缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的...

    Java网络编程(第三版)中文版.part01.rar

    第十二章 非阻塞I/O 391 一个示例客户端 392 一个示例服务器 396 缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的...

    Java网络编程(第三版)中文版.part03.rar

    第十二章 非阻塞I/O 391 一个示例客户端 392 一个示例服务器 396 缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的...

    Java网络编程(第三版)中文版.part04.rar

    第十二章 非阻塞I/O 391 一个示例客户端 392 一个示例服务器 396 缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的...

    Java网络编程(第三版)中文版.part02.rar

    第十二章 非阻塞I/O 391 一个示例客户端 392 一个示例服务器 396 缓冲区 402 通道 421 就绪选择 427 第十三章 UDP数据报和Socket 431 UDP协议 431 DatagramPacket类 433 DatagramSocket类 442 一些有用的...

Global site tag (gtag.js) - Google Analytics