激情久久久_欧美视频区_成人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(詳解)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 一级片九九 | 国色天香综合网 | 又黄又爽又色无遮挡免费 | 久久国产精品网 | 亚洲电影在线播放 | 精品成人国产在线观看男人呻吟 | 久久免费视频8 | 精精国产xxxx视频在线播放7 | 成人永久视频 | 久久久日韩av免费观看下载 | 2021国产精品 | 国产毛片视频 | 日韩大片在线永久观看视频网站免费 | freexxxx性女hd性吃奶 | 精品成人av一区二区三区 | 国产亚洲精品久久久久婷婷瑜伽 | 依依成人综合 | www.91操| 欧美国产精品久久 | 成人午夜视频免费在线观看 | 99久久一区二区 | 国产激情网 | 亚洲午夜不卡 | 国产91九色 | 免费人成在线播放 | 国产精品91在线 | 全黄性性激高免费视频 | 日韩毛片在线看 | 石原莉奈日韩一区二区三区 | 老a影视网站在线观看免费 欧美日韩成人一区二区 | 国产亚洲精品久久午夜玫瑰园 | 精品中文一区 | 国产三级精品最新在线 | 精品久久久久久久久久中出 | 免费视频aaa | 91 在线视频观看 | 日本高清黄色片 | 一级电影免费在线观看 | 一本视频在线观看 | 欧美高清另类自拍视频在线看 | 久久久精品视频在线观看 |