Java網路程式設計之SocketChannel和ServerSocketChannel
SocketChannel
- SocketChannel是java nio 提供的用於連線兩臺計算機進行通訊的套接字通道,把Channel去掉就剩下Socket,可見與Socket有著相似的功能。
- SocketChannel可以實現非阻塞的功能,包括連線非阻塞,IO非阻塞。
- SocketChannel與Selector多路複用器配合還可以實現基於select或者epoll的多路複用機制的網路IO模型。
- SocketChannel安全地給多個執行緒併發使用,但是多個執行緒使用該SocketChannel是互斥的。同一時間只能給一個執行緒使用。
- 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;
相關文章
- Java 網路程式設計(TCP程式設計 和 UDP程式設計)Java程式設計TCPUDP
- Java NIO SocketChannelJava
- Java網路程式設計之UDPJava程式設計UDP
- python網路-Socket之TCP程式設計(26)PythonTCP程式設計
- Java網路程式設計和NIO詳解3:IO模型與Java網路程式設計模型Java程式設計模型
- Java中神經網路Triton GPU程式設計Java神經網路GPU程式設計
- 好程式設計師Java學習路線之集程式設計師Java
- Java 非同步程式設計之:notify 和 wait 用法Java非同步程式設計AI
- JAVA網路程式設計(2)TCP程式設計Java程式設計TCP
- Java 網路程式設計Java程式設計
- JAVA網路程式設計Java程式設計
- 好程式設計師Java學習路線之Java中的物件流和序列化程式設計師Java物件
- 好程式設計師Java學習路線之SpringMVC之基本配置程式設計師JavaSpringMVC
- 好程式設計師Java教程分享Java之設計模式程式設計師Java設計模式
- Java 網路程式設計 —— 非阻塞式程式設計Java程式設計
- 《Java 物聯網、人工智慧 和區塊鏈程式設計實戰》之“Java 簡介”Java人工智慧區塊鏈程式設計
- JAVA學習線路:day14-網路程式設計Java程式設計
- 網路通訊程式設計程式設計
- py網路工具程式設計程式設計
- 程式設計和網路程式設計入門程式設計
- Matlab程式設計之——卷積神經網路CNN程式碼解析Matlab程式設計卷積神經網路CNN
- java 網路程式設計01Java程式設計
- Java--網路程式設計Java程式設計
- 好程式設計師Java學習路線之springboot和ssm開發的區別程式設計師JavaSpring BootSSM
- python 網路篇(網路程式設計)Python程式設計
- Java網路程式設計和NIO詳解9:基於NIO的網路程式設計框架NettyJava程式設計框架Netty
- 網路程式設計之socket程式設計
- Java併發程式設計之Java CAS操作Java程式設計
- Java 高效程式設計之 Builder 模式Java程式設計UI模式
- Java併發程式設計之synchronizedJava程式設計synchronized
- Java-GUI 程式設計之 SwingJavaGUI程式設計
- 好程式設計師Java學習路線之Spring框架之動態代理程式設計師JavaSpring框架
- Java實驗——基於GUI的網路通訊程式設計JavaGUI程式設計
- Java實驗六: Java流式程式設計與網路程式設計(頭歌)Java程式設計
- 好程式設計師Java學習路線之MySQL的執行計劃程式設計師JavaMySql
- Java程式設計師成長路徑Java程式設計師
- 好程式設計師Java學習路線分享MyBatis之Spring整合程式設計師JavaMyBatisSpring
- 好程式設計師Java學習路線分享MyBatis之基本使用程式設計師JavaMyBatis