socket server 和 client 通信流程圖:
服務端代碼:
用戶端代碼:發資訊
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>