當前位置:首頁 » 編程語言 » 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可以一個線程監控多個連接。

熱點內容
管理雲伺服器 發布:2024-05-04 21:36:31 瀏覽:551
給linux虛擬機傳文件 發布:2024-05-04 21:36:28 瀏覽:312
加密手機在哪裡 發布:2024-05-04 21:18:59 瀏覽:190
掃雷電腦配置低怎麼辦 發布:2024-05-04 21:07:37 瀏覽:821
微雲緩存文件在哪裡 發布:2024-05-04 20:53:07 瀏覽:509
咸陽市移動dns伺服器地址 發布:2024-05-04 20:39:19 瀏覽:442
小車哪個配置好 發布:2024-05-04 20:38:38 瀏覽:797
周長的演算法 發布:2024-05-04 20:37:46 瀏覽:371
保衛蘿卜2安卓版什麼時候更新 發布:2024-05-04 20:08:48 瀏覽:203
建工黨建宣傳片腳本 發布:2024-05-04 20:07:31 瀏覽:219