<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      一、SocketChannel
      Java NIO中的SocketChannel是一個連接到TCP網絡套接字的通道。可以通過以下2種方式創建SocketChannel:

      打開一個SocketChannel并連接到互聯網上的某臺服務器。
      一個新連接到達ServerSocketChannel時,會創建一個SocketChannel。

      打開 SocketChannel
      下面是SocketChannel的打開方式:

      SocketChannel socketChannel = SocketChannel.open();
      socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80));

      關閉 SocketChannel

      當用完SocketChannel之后調用SocketChannel.close()關閉SocketChannel:

      socketChannel.close();

      從 SocketChannel 讀取數據

      要從SocketChannel中讀取數據,調用一個read()的方法之一。以下是例子:

      ByteBuffer buf = ByteBuffer.allocate(48);
      int bytesRead = socketChannel.read(buf);

      首先,分配一個Buffer。從SocketChannel讀取到的數據將會放到這個Buffer中。

      然后,調用SocketChannel.read()。該方法將數據從SocketChannel 讀到Buffer中。read()方法返回的int值表示讀了多少字節進Buffer里。如果返回的是-1,表示已經讀到了流的末尾(連接關閉了)。

      寫入 SocketChannel
      寫數據到SocketChannel用的是SocketChannel.write()方法,該方法以一個Buffer作為參數。示例如下:

      String newData = "New String to write to file..." + System.currentTimeMillis();
      ByteBuffer buf = ByteBuffer.allocate(48);
      buf.clear();
      buf.put(newData.getBytes());
      buf.flip();
      while(buf.hasRemaining()) {
      channel.write(buf);
      }

      注意SocketChannel.write()方法的調用是在一個while循環中的。Write()方法無法保證能寫多少字節到SocketChannel。所以,我們重復調用write()直到Buffer沒有要寫的字節為止。

      非阻塞模式
      可以設置 SocketChannel 為非阻塞模式(non-blocking mode).設置之后,就可以在異步模式下調用connect(), read() 和write()了。

      connect()
      如果SocketChannel在非阻塞模式下,此時調用connect(),該方法可能在連接建立之前就返回了。為了確定連接是否建立,可以調用finishConnect()的方法。像這樣:

      socketChannel.configureBlocking(false);
      socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80));
      
      while(! socketChannel.finishConnect() ){
      //wait, or do something else...
      }

      write()

      非阻塞模式下,write()方法在尚未寫出任何內容時可能就返回了。所以需要在循環中調用write()。前面已經有例子了,這里就不贅述了。

      read()
      非阻塞模式下,read()方法在尚未讀取到任何數據時可能就返回了。所以需要關注它的int返回值,它會告訴你讀取了多少字節。

      非阻塞模式與選擇器
      非阻塞模式與選擇器搭配會工作的更好,通過將一或多個SocketChannel注冊到Selector,可以詢問選擇器哪個通道已經準備好了讀取,寫入等

      二、Java NIO DatagramChannel
      Java NIO中的DatagramChannel是一個能收發UDP包的通道。因為UDP是無連接的網絡協議,所以不能像其它通道那樣讀取和寫入。它發送和接收的是數據包。

      打開 DatagramChannel
      下面是 DatagramChannel 的打開方式:

      DatagramChannel channel = DatagramChannel.open();
      channel.socket().bind(new InetSocketAddress(9999));

      這個例子打開的 DatagramChannel可以在UDP端口9999上接收數據包。

      接收數據
      通過receive()方法從DatagramChannel接收數據,如:

      ByteBuffer buf = ByteBuffer.allocate(48);
      buf.clear();
      channel.receive(buf);

      receive()方法會將接收到的數據包內容復制到指定的Buffer. 如果Buffer容不下收到的數據,多出的數據將被丟棄。

      發送數據
      通過send()方法從DatagramChannel發送數據,如:

      String newData = "New String to write to file..." + System.currentTimeMillis();
      ByteBuffer buf = ByteBuffer.allocate(48);
      buf.clear();
      buf.put(newData.getBytes());
      buf.flip();
      int bytesSent = channel.send(buf, new InetSocketAddress("jenkov.com", 80));

      這個例子發送一串字符到”jenkov.com”服務器的UDP端口80。 因為服務端并沒有監控這個端口,所以什么也不會發生。也不會通知你發出的數據包是否已收到,因為UDP在數據傳送方面沒有任何保證。

      連接到特定的地址
      可以將DatagramChannel“連接”到網絡中的特定地址的。由于UDP是無連接的,連接到特定地址并不會像TCP通道那樣創建一個真正的連接。而是鎖住DatagramChannel ,讓其只能從特定地址收發數據。

      這里有個例子:

      channel.connect(new InetSocketAddress("jenkov.com", 80));

      當連接后,也可以使用read()和write()方法,就像在用傳統的通道一樣。只是在數據傳送方面沒有任何保證。這里有幾個例子:

      int bytesRead = channel.read(buf);
      int bytesWritten = channel.write(but);

      三、Pipe

      Java NIO 管道是2個線程之間的單向數據連接。Pipe有一個source通道和一個sink通道。數據會被寫到sink通道,從source通道讀取。

      這里是Pipe原理的圖示:

       


      創建管道
      通過Pipe.open()方法打開管道。例如:

      Pipe pipe = Pipe.open();

      向管道寫數據

      要向管道寫數據,需要訪問sink通道。像這樣:

      Pipe.SinkChannel sinkChannel = pipe.sink();

      通過調用SinkChannel的write()方法,將數據寫入SinkChannel,像這樣:

      String newData = "New String to write to file..." + System.currentTimeMillis();
      ByteBuffer buf = ByteBuffer.allocate(48);
      buf.clear();
      buf.put(newData.getBytes());
      
      buf.flip();
      
      while(buf.hasRemaining()) {
      sinkChannel.write(buf);
      }

      從管道讀取數據

      從讀取管道的數據,需要訪問source通道,像這樣:

      Pipe.SourceChannel sourceChannel = pipe.source();

      調用source通道的read()方法來讀取數據,像這樣:

      ByteBuffer buf = ByteBuffer.allocate(48);
      int bytesRead = sourceChannel.read(buf);

      read()方法返回的int值會告訴我們多少字節被讀進了緩沖區。

      posted on 2019-05-21 17:10  友帥老師  閱讀(465)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 男女猛烈激情xx00免费视频| 亚洲人成亚洲人成在线观看| 色欲AV无码一区二区人妻| 国模一区二区三区私拍视频| 国产一区日韩二区三区| 中卫市| 亚洲天堂男人的天堂在线| 强奷漂亮人妻系列老师| 白嫩少妇激情无码| 少妇又爽又刺激视频| 久久综合97丁香色香蕉| 精品国产精品午夜福利| 亚洲自拍偷拍一区二区三区| 91久久偷偷做嫩草影院免费看| 久久99日韩国产精品久久99| 伊人色综合一区二区三区| 右玉县| 白城市| 欧产日产国产精品精品| 四虎成人精品永久网站| 中文字幕成人精品久久不卡| 视频一区二区不中文字幕| 国产真实伦在线观看视频 | 亚洲一二区在线视频播放| 樱花草视频www日本韩国| 国偷自产一区二区三区在线视频| 亚洲av成人网人人蜜臀| 国产99在线 | 免费| 色欲AV无码一区二区人妻| 国产欧美日韩另类在线专区 | 自拍日韩亚洲一区在线| 国精偷拍一区二区三区| 精品人妻人人做人人爽夜夜爽| 偷窥少妇久久久久久久久| 成人午夜在线观看刺激| 欧美老熟妇喷水| 综合人妻久久一区二区精品| 熟妇人妻无码中文字幕老熟妇 | 国精品91人妻无码一区二区三区 | 国产精品久久亚洲不卡| 国产毛片三区二区一区|