zoukankan      html  css  js  c++  java
  • 网络编程.iocp

    1、(20191212)查到的一些资料:java从 JDK7开始 引入AOI(即 NIO2)。然后 实现 IOCP使用的是 AsynchronousChannelGroup、AsynchronousServerSocketChannel相关的内容。

      ZC:据说 AsynchronousChannelGroup 在Windows下使用的是 IOCP,在 Linux下使用的还是 NIO那一套 只是在NIO上又套了一层 假装AIO。

      ZC:查到 Netty至今使用的 还是 NIO(具体原因,几点我记住的是:A、异步IO和Netty原本的架构不配套 改成AIO那一套的话 会4不像;B、不注重Windows上的使用;... ...)

     1.1、测试了一下,貌似 JDK 8u202 上的也是阉割版的IOCP?

      PS:<<Windows网络与通信程序设计>>上C++版的IOCP 可以投递多个accept操作,然后 一个socket可以投递多个接收操作(查官网 WSARecv 做重叠IO操作 貌似就可以对同一个socket投递多个接收缓冲)

      用 java的AsynchronousChannelGroup 简单测试了一下,accept操作 只能投递一个,接收操作 也只能投递一个...

       具体报错 如下:

        (1)投递 2次 accpt操作,会报错:java.nio.channels.AcceptPendingException

          在 "AcceptPendingException (Java Platform SE 8 ).html(https://docs.oracle.com/javase/8/docs/api/index.html)"中搜索 "AcceptPendingException",会看到 这样的讲解:“Unchecked exception thrown when an attempt is made to initiate an accept operation on a channel and a previous accept operation has not completed.”

        (2)投递 2次 接收(read)操作,会报错:java.nio.channels.ReadPendingException

          在 "ReadPendingException (Java Platform SE 8 ).html(https://docs.oracle.com/javase/8/docs/api/java/nio/channels/ReadPendingException.html?is-external=true)"中可以看待这样的讲解:“Unchecked exception thrown when an attempt is made to read from an asynchronous socket channel and a previous read has not completed.”

       这样可以看出,8u202版的 网络异步IO,只支持1次 投递操作... 后面的收费版 JDK有修改吗?

       ZC:只能投递 1次,这样的AIO 与NIO相比 性能能比NIO快?能快多少?

       ZC:但是,这样避免了一个坏处:同一个socket上投递多个接收缓冲区的话,由于缓冲区使用顺序的不同 可能会造成接收到的数据是乱序的。(我查MS的WSARecv,上面说 投递缓冲区的顺序就是驱动中使用[填充]缓冲区的顺序,建议不要多线程同时投递同一个socket的多个接收缓冲区  导致不可预知的缓冲区顺序 [个人理解是 ∵线程调度 顺序无法预测/确定],要在一个线程中投递同一个socket的多个接收缓冲区。然后对投递的缓冲区进行编号 就可以得到正确的接收顺序。[没有测试是否使用线程同步 就可以在多线程中投递同一个socket的多个接收操作了...?]) 1个socket上只能投递一个相同类型的异步操作的话 就不会有这个问题了...

    2、

    3、

    4、

    5、

  • 相关阅读:
    爬取校园新闻首页的新闻的详情,使用正则表达式,函数抽离
    网络爬虫基础练习
    Mysql 使用 select into outfile
    Mysql 使用CMD 登陆
    使用Clean() 去掉由函数自动生成的字符串中的双引号
    Get Resultset from Oracle Stored procedure
    获取引用某个主键的所有外键的表
    Entity Framework 丢失数据链接的绑定,在已绑好的EDMX中提示“Choose Your Data Connection”
    添加MySql Metat Database 信息
    at System.Data.EntityClient.EntityConnection.GetFactory(String providerString)
  • 原文地址:https://www.cnblogs.com/javaskill/p/12030117.html
Copyright © 2011-2022 走看看