當前位置:首頁 » 編程語言 » javasocket非同步

javasocket非同步

發布時間: 2023-05-23 06:51:44

java Socket開發 關於報文傳遞和接收

看 Oracle 官方教程,同步式的 Socket 就是傳統的一問一答方式,它就是你需要的。

客戶端先 socket.getOutputStream().write(...); 之後到 socket.getInputStream().read(byte[]) 在循環中讀取直到 read 方法返回 -1 或你期望的位元組數已經全部收到了就停下來,如果不嘗試停下來,後面的 read 將會阻塞等待。


http://docs.oracle.com/javase/tutorial/networking/sockets/index.html


基於性能改進,一般我們需要使用 NIO 非同步的 socket,只需要一個線程負責通信,每個線程都有自己的出站消息隊列和入站消息隊列,以線程為 key 區分開,通信線程只負責把各自的消息從出站隊列中發送去並把收到的消息放入入站隊列中,應用程序線程就去各自的消息隊列中取消息就可以了。因為每個應用線程有各自的消息隊列,我們把消息放入出站隊列之後就到入站隊列上用同步鎖等待的方法阻塞到有消息回答時為止。


關於 NIO non-blocking 非阻塞式 socket,下面有一個 NBTimeServer 例子,它講的是服務端。客戶端與此類似,

http://docs.oracle.com/javase/7/docs/technotes/guides/io/example/index.html


NIO 通信線程樣例。

publicvoidrun()
{
inttip=0;
try
{
selector=Selector.open();
SelectionKeyk=channel.register(selector,getInterestOptions());
k.attach(thread);//把當前線程綁定到附件中。

this.running=true;
statusChanged(Status.CONNECTED);
while(this.isRunning())
{
//select()isablockingoperation.
inteventCount=selector.select();
debug("[MC.Debug]PollingTCPevents..."+eventCount);
if(eventCount>0&&channel.isOpen()&&this.isRunning())
{
Setkeys=selector.selectedKeys();
for(Iteratoriter=keys.iterator();iter.hasNext();iter.remove())
{
SelectionKeykey=(SelectionKey)iter.next();
Threadthread=(Thread)key.attachment();

if(!key.isValid())
{//channelisclosing.
break;
}
process(key);//處理讀取消息並把消息放入thread對應的隊列。//寫出消息類似的,不過在register時需要注冊寫出允許的事件,

}
}
}
}

Ⅱ java中Socket的心跳包設置問題

使用一個線程進行監控,如果空閑一定時間就發送一個心跳包。對於非同步Socket可以一個線程監控多個連接。

熱點內容
php支付寶sdk 發布:2025-05-19 22:01:06 瀏覽:601
雲掃墓源碼 發布:2025-05-19 22:00:32 瀏覽:592
executeupdatesql 發布:2025-05-19 21:58:36 瀏覽:216
中國電信如何轉人工密碼是多少 發布:2025-05-19 21:44:54 瀏覽:209
求階乘的c語言 發布:2025-05-19 21:15:20 瀏覽:965
話嘮安卓哪裡下載 發布:2025-05-19 20:27:04 瀏覽:166
瘋狂android講義光碟 發布:2025-05-19 20:12:31 瀏覽:153
安卓手機怎麼下載圈點 發布:2025-05-19 20:08:11 瀏覽:473
文件夾粉碎不了 發布:2025-05-19 20:05:41 瀏覽:249
安卓怎麼把軟體放進全局 發布:2025-05-19 20:03:55 瀏覽:689