Java網路程式設計之SocketChannel和ServerSocketChannel

我會努力變強的發表於2020-12-16

SocketChannel

  1. SocketChannel是java nio 提供的用於連線兩臺計算機進行通訊的套接字通道,把Channel去掉就剩下Socket,可見與Socket有著相似的功能。
  2. SocketChannel可以實現非阻塞的功能,包括連線非阻塞,IO非阻塞。
  3. SocketChannel與Selector多路複用器配合還可以實現基於select或者epoll的多路複用機制的網路IO模型。
  4. SocketChannel安全地給多個執行緒併發使用,但是多個執行緒使用該SocketChannel是互斥的。同一時間只能給一個執行緒使用。
  5. SocketChannel支援OP_READ、OP_WRITE、OP_CONNECT事件。

常見API

獲取API
//開啟並返回一個SocketChannel,但是此時通道還連線。
public static SocketChannel open()

//開啟並返回一個SocketChannel ,並且進行將其連線到遠端地址。
public static SocketChannel open(SocketAddress remote)

讀寫API

//往套接字通道寫資料ByteBuffer,用於傳輸到遠端地址計算機上。
public abstract int write(ByteBuffer src)

//往套接字通道寫資料ByteBuffer,用於傳輸到遠端地址計算機上。
/**
*往套接字通道寫資料,用於傳輸到遠端地址計算機上。
*srcs  :ByteBuffer陣列,會對裡面的ByteBuffer成員順序進行讀取寫入。
*offset :讀取ByteBuffer陣列的起始下標。
* length:讀取ByteBuffer陣列的元素個數。
* 與FileChannel該方法一樣,詳情可以參考博主另一篇FileChannel詳解文章。
*/
public abstract long write(ByteBuffer[] srcs, int offset, int length)

/**
*往套接字通道寫資料,用於傳輸到遠端地址計算機上。
*srcs  :ByteBuffer陣列,會對裡面的ByteBuffer成員順序進行讀取寫入。
*/
 public final long write(ByteBuffer[] srcs)

/**
* 讀取遠端套接字通道傳輸過來的資料。
*/
public abstract int read(ByteBuffer dst)

/**
* 讀取遠端套接字通道傳輸過來的資料。
* 與FileChannel該方法一樣,詳情可以參考博主另一篇FileChannel詳解文章。
*/
public abstract long read(ByteBuffer[] dsts, int offset, int length)

/**
* 讀取遠端套接字通道傳輸過來的資料。
* 與FileChannel該方法一樣,詳情可以參考博主另一篇FileChannel詳解文章。
*/
 public final long read(ByteBuffer[] dsts)


其他API

//連線到遠端地址
public abstract boolean connect(SocketAddress remote)

//將此套接字通道繫結到本地套接字地址上
public abstract SocketChannel bind(SocketAddress local)

//返回此套接字通道繫結的本地套接字地址
public abstract SocketAddress getLocalAddress()

//返回此套接字是否已經連線上了遠端套接字
public abstract boolean isConnected();

//返回此套接字是否正在連線遠端套接字。
public abstract boolean isConnectionPending();

//關閉套接字通道。
public final void close()

//返回此套接字連線到的遠端套接字的地址。返回null表示未連線到遠端套接字地址。
public abstract SocketAddress getRemoteAddress()

//SocketChannel支援非阻塞模式,但是預設是會阻塞的,如果要實現非阻塞,
//就要呼叫該方法configureBlocking(false),預設是true阻塞。
public final SelectableChannel configureBlocking(boolean block)

//返回該通道連線是否已經被關閉,返回true表示處於開啟狀態。
public final boolean isOpen()


//把當前channel註冊到Selector上。
//sel 要註冊到的selector,ops 事件型別、att共享屬性。
public final SelectionKey register(Selector sel, int ops,
                                      Object att)
ServerSocketChannel

ServerSocketChannel的作用是在服務端複製監聽來自客戶端的Socket連線,類似於ServerSocket,只是他支援非阻塞和能配合SelectorSocket實現高效能的網路IO程式。

ServerSocketChannel只支援OP_ACCEPT事件。
API:

//得到一個ServerSocketChannel通道
public static ServerSocketChannel open()

//設定伺服器地址
public final ServerSocketChannel bind(SocketAddress local)

//設定伺服器地址,並且知道backlog,為連線等待佇列大小,滿了就直接拒絕連線。
public abstract ServerSocketChannel bind(SocketAddress local, int backlog)

//監聽客戶端連線,阻塞方法。
public abstract SocketChannel accept() throws IOException;


相關文章