当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:15:00  来源:本站整理

利用异步输入输出流编写Socket进程通信[Java编程]

赞助商链接



  本文“利用异步输入输出流编写Socket进程通信[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

同步?异步输入输出机制的引入

在Merlin之前,编写Socket程序是比 较烦琐的工作.因为输入输出都必须同步.这样,关于多客户端客户/服务器情势, 不得不利用多线程.即为每个衔接的客户都分配一个线程来处理输入输出.由此而 带来的问题是不可思议的.程序员不得不为了避免死锁,线程安全等问题,举行大 量的编码和测试.很多人都在抱怨为什么不在Java中引入异步输入输出机制.对比 官方的注释是,任何一种利用程序接口的引入,都必须兼容任何操作平台.因为 Java是跨平台的.而当时支持异步输入输出机制的操作平台明显不大概是全部.自 Java 2 Platform今后,别离出J2SE,J2ME,J2EE三种差别范例的利用程序接口,以 适应差别的利用开辟.Java尺度的制订者们意识到了这个问题,并且支持异步输入 输出机制的操作平台在当今操作平台中处于主流地位.于是,Jdk(J2SE) 的第五次 公布中引入了异步输入输出机制.

从前的Socket进程通信程序计划中,一 般客户端和服务器端程序计划以下:

服务器端:

  //服务器 端监听线程
  while (true) {
         .............
        Socket clientSocket;
         clientSocket = socket.accept(); //获得客户恳求Socket,假如没 有//客户恳求衔接,线程在此处阻塞
        //用获得的Socket 构造输入输出流
        PrintStream os = new PrintStream (new
        BufferedOutputStream (clientSocket.getOutputStream(),
        1024), false);
        BufferedReader is = new BufferedReader (new
        InputStreamReader (clientSocket.getInputStream()));
        //成立客户会话 线程,举行输入输出掌握,为同步机制
        new ClientSession();
        .......
         }

客户端:

 ............
  clientSocket = new Socket(HOSTNAME, LISTENPORT);//衔接服务器套接字
  //用获得的 Socket构造输入输出流
  PrintStream os = new PrintStream(new
        BufferedOutputStream(clientSocket.getOutputStream (),
        1024), false);
         BufferedReader is = new BufferedReader(new
         InputStreamReader(clientSocket.getInputStream()));
  //举行输入 输出掌握
  .......

以上代码段只是用同步机制编写 Socket进程通信的一个框架,实际上要考虑的问题要复杂的多(有爱好的读者可 以参考我的一篇文章《Internet 及时通信系统计划与实现》).将这样一个框 架列出来,只是为了与用异步机制实现的Socket进程通信举行对比.下面将介绍 利用异步机制的程序计划.

用异步输入输出流编写Socket进程通信程序

在Merlin中加入了用于实现异步输入输出机制的利用程序接口包: java.nio(新的输入输出包,定义了很多基本范例缓冲(Buffer)), java.nio.channels(通道及挑选器等,用于异步输入输出),java.nio.charset (字符的编码解码).通道(Channel)首先在挑选器(Selector)中注册自己感兴 趣的事件,当呼应的事件发生时,挑选器便通过挑选键(SelectionKey)告诉已注 册的通道.然后通道将需求处理的信息,通过缓冲(Buffer)打包,编码/解码, 完成输入输出掌握.

通道介绍:

这里主要介绍 ServerSocketChannel和 SocketChannel.它们都是可挑选的(selectable)通道, 辨别可以工作在同步和异步两种方法下(注意,这里的可挑选不是指可以挑选两 种工作方法,而是指可以有挑选的注册自己感爱好的事件).可以用 channel.configureBlocking(Boolean )来设置其工作方法.与从前版本的API相 对比,ServerSocketChannel就相当于ServerSocket(ServerSocketChannel封装 了ServerSocket),而SocketChannel就相当于Socket(SocketChannel封装了 Socket).当通道工作在同步方法时,编程办法与从前的基本类似,这里主要介 绍异步工作方法.

所谓异步输入输出机制,是指在举行输入输出处理时 ,没必要等到输入输出处理完毕才返回.所以异步的同义语是非阻塞(None Blocking).在服务器端,ServerSocketChannel通过静态函数open()返回一个 实例serverChl.然后该通道调用serverChl.socket().bind()绑定到服务器某端 口,并调用register(Selector sel, SelectionKey.OP_ACCEPT)注册 OP_ACCEPT事件到一个挑选器中(ServerSocketChannel只可以注册OP_ACCEPT事 件).当有客户恳求衔接时,挑选器就会告诉该通道有客户衔接恳求,便可以进 行呼应的输入输出掌握了;在客户端,clientChl实例注册自己感爱好的事件后 (可以是OP_CONNECT,OP_READ,OP_WRITE的组合),调用clientChl.connect (InetSocketAddress )衔接服务器然后举行呼应处理.注意,这里的衔接是异步 的,即会当即返回而持续履行背面的代码.


  以上是“利用异步输入输出流编写Socket进程通信[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 利用异步输入输出流编写Socket进程通信
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .