天天看點

Java Socket和ServerSocket程式設計 NIO

socket server 和 client 通信流程圖:

Java Socket和ServerSocket程式設計 NIO

服務端代碼:

用戶端代碼:發資訊

socket通道

java nio中的socketchannel是一個連接配接到tcp網絡套接字的通道。可以通過以下2種方式建立socketchannel:

打開一個socketchannel并連接配接到網際網路上的某台伺服器。

一個新連接配接到達serversocketchannel時,會建立一個socketchannel。

非阻塞模式

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

connect()

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

write()

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

read()

非阻塞模式下,read()方法在尚未讀取到任何資料時可能就傳回了。是以需要關注它的int傳回值,它會告訴你讀取了多少位元組。

非阻塞模式與選擇器

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

serversocket 通道

java nio中的 serversocketchannel 是一個可以監聽新進來的tcp連接配接的通道,就像标準io中的serversocket一樣。serversocketchannel類在 java.nio.channels包中。

serversocketchannel可以設定成非阻塞模式。在非阻塞模式下,accept() 方法會立刻傳回,如果還沒有新進來的連接配接,傳回的将是null。 是以,需要檢查傳回的socketchannel是否是null。如:

scoket保持心跳長連接配接代碼見附件!

參考文章:

<a href="http://shihuan830619.iteye.com/blog/2041774" target="_blank">http://shihuan830619.iteye.com/blog/2041774</a>

java nio系列教程

<a href="http://www.iteye.com/magazines/132-java-nio" target="_blank">http://www.iteye.com/magazines/132-java-nio</a>