知识大全 使用NIO实现非阻塞Socket通信(2)[1]

Posted

篇首语:学向勤中得,萤窗万卷书。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 使用NIO实现非阻塞Socket通信(2)[1]相关的知识,希望对你有一定的参考价值。

疯狂Java讲义:使用NIO实现非阻塞Socket通信(2)[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  经过上面步骤后 该ServerSocketChannel可以接受客户端的连接请求 但我们需要调用Selector的select()方法来监听所有Channel上的IO操作

  程序清单 codes/ / /NoBlock/NServer java

  public class NServer

  

  //用于检测所有Channel状态的Selector

  private Selector selector = null;

  //定义实现编码 解码的字符集对象

  private Charset charset = Charset forName( UTF )

  public void init()throws IOException

  

  selector = Selector open()

  //通过open方法来打开一个未绑定的ServerSocketChannel实例

  ServerSocketChannel server = ServerSocketChannel open()

  InetSocketAddress isa = new InetSocketAddress(

   )

  //将该ServerSocketChannel绑定到指定IP地址

  server socket() bind(isa)

  //设置ServerSocket以非阻塞方式工作

  server configureBlocking(false)

  //将server注册到指定Selector对象

  server register(selector SelectionKey OP_ACCEPT)

  while (selector select() > )

  

  //依次处理selector上的每个已选择的SelectionKey

  for (SelectionKey sk : selector selectedKeys())

  

  //从selector上的已选择Key集中删除正在处理的SelectionKey

  selector selectedKeys() remove(sk)                              //①

  //如果sk对应的通道包含客户端的连接请求

  if (sk isAcceptable())                                             //②

  

  //调用accept方法接受连接 产生服务器端对应的SocketChannel

  SocketChannel sc = server accept()

  //设置采用非阻塞模式

  sc configureBlocking(false)

  //将该SocketChannel也注册到selector

  sc register(selector SelectionKey OP_READ)

  //将sk对应的Channel设置成准备接受其他请求

  sk interestOps(SelectionKey OP_ACCEPT)

  

  //如果sk对应的通道有数据需要读取

  if (sk isReadable())                                               //③

  

  //获取该SelectionKey对应的Channel 该Channel中有可读的数据

  SocketChannel sc = (SocketChannel)sk channel()

  //定义准备执行读取数据的ByteBuffer

  ByteBuffer buff = ByteBuffer allocate( )

  String content = ;

  //开始读取数据

  try

  

  while(sc read(buff) > )

  

  buff flip()

  content += charset decode(buff)

  

  //打印从该sk对应的Channel里读取到的数据

  System out println( ===== + content)

  //将sk对应的Channel设置成准备下一次读取

  sk interestOps(SelectionKey OP_READ)

  

  //如果捕捉到该sk对应的Channel出现了异常 即表明该Channel

  //对应的Client出现了问题 所以从Selector中取消sk的注册

  catch (IOException ex)

  

  //从Selector中删除指定的SelectionKey

  sk cancel()

  if (sk channel() != null)

  

  sk channel() close()

  

  

  //如果content的长度大于 即聊天信息不为空

  if (content length() > )

  

  //遍历该selector里注册的所有SelectKey

  for (SelectionKey key : selector keys())

  

  //获取该key对应的Channel

  Channel targetChannel = key channel()

  //如果该channel是SocketChannel对象

  if (targetChannel instanceof SocketChannel)

  

  //将读到的内容写入该Channel中

  SocketChannel dest = (SocketChannel)targetChannel;

  dest write(charset encode(content))

  

  

  

  

  

  

  

  public static void main(String[] args)

  throws IOException

  

  new NServer() init()

  

  

  上面程序启动时即建立一个可监听连接请求的ServerSocketChannel 并将该Channel注册到指定Selector 接着程序直接采用循环不断监控Selector对象的select()方法返回值 当该返回值大于 时处理该Selector上所有被选择的SelectionKey

  开始处理指定SelectionKey之后立即从该Selector中的被选择的SelectionKey集合中删除该SelectionKey 如程序中①号代码所示

cha138/Article/program/Java/hx/201311/27261

相关参考

知识大全 使用NIO实现非阻塞Socket通信(1)

疯狂Java讲义:使用NIO实现非阻塞Socket通信(1)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看

知识大全 Java NIO(异步IO)Socket通信例子

JavaNIO(异步IO)Socket通信例子  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  /

知识大全 使用Socket进行通信[2]

疯狂Java讲义:使用Socket进行通信[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 使用Socket进行通信[1]

疯狂Java讲义:使用Socket进行通信[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 java nio 开发实例

  首先了解下所谓的javanio是个什么东西!  传统的并发型服务器设计是利用阻塞型网络I/O以多线程的模式来实现的然而由  于系统常常在进行网络读写时处于阻塞状态会大大影响系统的性能自Java开始

知识大全 一个最简单的Socket通信例子

一个最简单的Socket通信例子  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  所谓socket

知识大全 利用Delphi编写Socket通信程序

利用Delphi编写Socket通信程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!笔者在工作中

知识大全 Java的socket通信的demo

Java的socket通信的demo  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java代码

知识大全 运用异步输入输出流编写Socket进程通信

运用异步输入输出流编写Socket进程通信  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  杨健(

知识大全 C#和C++结构体Socket通信

C#和C++结构体Socket通信  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  最近在用C#做