国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - JAVA-NIO之Socket/ServerSocket Channel(詳解)

JAVA-NIO之Socket/ServerSocket Channel(詳解)

2020-11-15 20:16Java教程網 Java教程

下面小編就為大家帶來一篇JAVA-NIO之Socket/ServerSocket Channel(詳解)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、ServerSocketChannel

Java NIO中的 ServerSocketChannel 是一個可以監聽新進來的TCP連接的通道, 就像標準IO中的ServerSocket一樣。ServerSocketChannel類在 java.nio.channels包中。

打開 ServerSocketChannel

通過調用 ServerSocketChannel.open() 方法來打開ServerSocketChannel.

關閉 ServerSocketChannel

通過調用ServerSocketChannel.close() 方法來關閉ServerSocketChannel.

監聽新進來的連接

通過 ServerSocketChannel.accept() 方法監聽新進來的連接。當 accept()方法返回的時候,它返回一個包含新進來的連接的 SocketChannel。因此, accept()方法會一直阻塞到有新連接到達。

通常不會僅僅只監聽一個連接,在while循環中調用 accept()方法.

當然,也可以在while循環中使用除了true以外的其它退出準則。

非阻塞模式

ServerSocketChannel可以設置成非阻塞模式。在非阻塞模式下,accept() 方法會立刻返回,如果還沒有新進來的連接,返回的將是null。 因此,需要檢查返回的SocketChannel是否是null.如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
   * socket server channel
   */
  @Test
  public void text2() throws IOException {
    ServerSocketChannel channel = ServerSocketChannel.open();  //新建channel
    channel.socket().bind(new InetSocketAddress(9999));   //監聽端口
    channel.configureBlocking(true);               //設置阻塞
 
    while (true) {
      SocketChannel accept = channel.accept();          //設置為阻塞,則此方法阻塞,直到有連接
      //如果設置為非阻塞,需要在這里判斷 accept == null?
      ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
      accept.read(byteBuffer);
      byteBuffer.flip();                  //反轉
      while (byteBuffer.hasRemaining()) {          //判斷
        System.err.println((char)byteBuffer.get());    //輸出
      }
    }
  }

二、SocketChannel

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

打開一個SocketChannel并連接到互聯網上的某臺服務器。

一個新連接到達ServerSocketChannel時,會創建一個SocketChannel。

打開 SocketChannel

下面是SocketChannel的打開方式:

關閉 SocketChannel

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

從 SocketChannel 讀取數據

要從SocketChannel中讀取數據,調用一個read()的方法之一。

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

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

寫入 SocketChannel

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

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

非阻塞模式

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

connect()

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

write()

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

read()

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

非阻塞模式與選擇器

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
   * socket channel
   */
  @Test
  public void test3() throws IOException {
    SocketChannel channel = SocketChannel.open();                //新建服務端
    channel.connect(new InetSocketAddress("127.0.0.1",9999));  //連接服務端地址
    ByteBuffer byteBuffer = ByteBuffer.allocate(1024); //緩沖區
    byteBuffer.put("123".getBytes());
    byteBuffer.flip();                 //反轉
    while (byteBuffer.hasRemaining()) {         //判斷
      channel.write(byteBuffer);
    }
  }

以上這篇JAVA-NIO之Socket/ServerSocket Channel(詳解)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 大片免费播放在线观看视频 | 久久免费黄色网址 | 黄色在线免费看 | 久久午夜影院 | 在线视频中文字幕 | 欧洲免费视频 | 精品成人av一区二区在线播放 | 99视频在线 | 中文字幕在线一区二区三区 | 成年女人免费v片 | 在线观看特色大片免费网站 | 国产色网| 欧美在线观看免费观看视频 | 高清视频一区二区三区 | 狠狠爱网站 | 国产精品香蕉 | 一区二区日韩 | 久久精品六 | 亚洲一区二区福利 | 亚洲国产精品视频 | 人人射在线视频 | 91精品秘密在线观看 | 精品一区二区三区中文字幕老牛 | 拍真实国产伦偷精品 | 色婷婷精品久久二区二区蜜臂av | 日本精品一区 | 久久国产综合 | 亚洲精品成人 | 久久精品亚洲精品 | 一区二区三区精品视频 | 高清国产一区二区三区四区五区 | 国产小视频在线播放 | 日本激情视频一区二区三区 | 久久精品无码一区二区三区 | 人成免费在线视频 | 26uuu国产电影一区二区 | 午夜区 | 91伊人 | 免费一看一级毛片 | 亚洲在线播放 | 欧美黄网站 |