国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

JavaI/OAPI之性能分析(下)

2019-11-18 11:13:19
字體:
來源:轉載
供稿:網友

  四、注冊與處理過程詳解
  接下來我們要分析Connection的register()方法。前面我們總是說用Selector注冊的連接,其實這是一種簡化的說法。實際上,用Selector注冊的是一個java.nio.channels.SocketChannel對象,但只針對特定的I/O操作。注冊之后,有一個java.nio.channels.SelectionKey被返回。這個選擇鍵可以通過attach()方法關聯到任意對象。為了通過鍵獲得連接,這里把Connection對象關聯到鍵。這樣,我們就可以從Selector間接地獲得一個Connection。
  
  public void register(Selector selector)
  throws IOException {
  key = socketChannel.register(selector, SelectionKey.OP_READ);
  key.attach(this);
  }
  回過頭來看ConnectionSelector。select()方法的返回值表示有多少連接已經做好了I/O操作的預備。假如返回值是0,則返回;否則,調用selectedKeys()獲得鍵的集合(Set),從這些鍵獲得以前關聯的Connection對象,然后調用其readRequest()或writeResponse()方法,具體調用哪一個方法由連接被注冊為讀取操作還是寫入操作決定。
  
  現在再來看Connection類。Connection類代表著連接,處理所有協議有關的細節。在構造函數中,通過參數傳入的SocketChannel被設置成非阻塞模式,這對于服務器來說是很重要的。另外,構造函數還設置了一些默認值,分配了緩沖區requestLineBuffer。由于分配直接緩沖區代價稍高,且這里的每一個連接都用一個新的緩沖區,因此這里使用java.nio.ByteBuffer.allocate()而不是ByteBuffer.allocateDirect()。假如重用緩沖區,直接緩沖區可能具有更高的效率。
  
  public Connection(SocketChannel socketChannel)
  throws IOException {
  this.socketChannel = socketChannel;
  ...
  socketChannel.configureBlocking(false);
  requestLineBuffer = ByteBuffer.allocate(512);
  ...
  }
  
  完成所有初始化工作且SocketChannel做好了讀取預備之后,ConnectionSelector調用了readRequest()方法,利用socketChannel.read(requestLineBuffer)方法把所有可用的數據讀入緩沖區。假如不能讀取完整的行,則返回發出調用的ConnectionSelector,答應另一個連接進入處理過程;反之,假如成功地讀取了整個行,接下來應該做的是象在Httpd中一樣解析請求。假如當前的請求合法,程序為請求目標文件創建一個java.nio.Channels.FileChannel,并調用PRepareForResponse()方法。
  
  private void prepareForResponse() throws IOException {
  StringBuffer responseLine = new StringBuffer(128);
  ...
  responseLineBuffer = ByteBuffer.wrap(
  responseLine.toString().getBytes("ASCII")
  );
  key.interestOps(SelectionKey.OP_WRITE);
  key.selector().wakeup();
  }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 赤峰市| 渝北区| 景东| 株洲县| 钦州市| 绥德县| 长垣县| 大庆市| 望奎县| 乐昌市| 新疆| 洮南市| 金阳县| 奎屯市| 容城县| 永春县| 翁牛特旗| 新田县| 汪清县| 肃宁县| 屏东市| 双流县| 望江县| 石林| 镇雄县| 海城市| 耒阳市| 海口市| 湖南省| 丁青县| 平定县| 顺平县| 襄汾县| 五原县| 淮北市| 伊春市| 自贡市| 自贡市| 遂宁市| 屯留县| 阿坝|