【Socket】关于socket长连接的心跳包
TCP的socket本身就是長連接的,那么為什么還要心跳包呢??
在smack里有個30s發送一個空消息的線程,同樣關于心跳包(keepalive)
據網絡搜索到的資料解釋如下
以前開發手機游戲時,索愛有一款手機有強制要求,客戶端如果超過三分鐘無消息發向網絡服務端,則會在客戶端自動地強制把socket關斷。因為socket長連接相對于手機這樣資源少的設備來說是寶貴的資源。? (這個強制是指客戶端系統自動關的,不是我們代碼close的)?
以下是Smack里發送心跳包的代碼:PacketWrite.java
void startKeepAliveProcess() { int keepAliveInterval = SmackConfiguration.getKeepAliveInterval(); if (keepAliveInterval > 0) { KeepAliveTask task = new KeepAliveTask(keepAliveInterval); this.keepAliveThread = new Thread(task); task.setThread(this.keepAliveThread); this.keepAliveThread.setDaemon(true); this.keepAliveThread.setName("Smack Keep Alive (" + this.connection.connectionCounterValue + ")"); this.keepAliveThread.start(); } } private class KeepAliveTask implements Runnable { private int delay; private Thread thread; public KeepAliveTask(int paramInt) { this.delay = paramInt; } protected void setThread(Thread thread) { this.thread = thread; } public void run() { try { Thread.sleep(15000L); } catch (InterruptedException localInterruptedException) { } while ((!(PacketWriter.this.done)) && (PacketWriter.this.keepAliveThread == this.thread)) { synchronized (PacketWriter.this.writer) { if (System.currentTimeMillis() - PacketWriter.this.lastActive >= this.delay) { try { PacketWriter.this.writer.write(" "); PacketWriter.this.writer.flush(); } catch (Exception localException) { } } } try { Thread.sleep(this.delay); } catch (InterruptedException localInterruptedException1) { } } } } View Code? 另外記一個CSDN上早些年的問題:
我還是很有發言權的呀,我畢業設計就是寫的這個(不過當時用的是vc寫的,帶文件傳輸的)@hl_ghost
我來說下我的思路吧:
1.如何知道誰在線?
??????Server維護一個list就ok了(存所有人的ip,名字,在線等)
2.如何讓服務器隨時能找到你?
???前提:內網機器如果不主動向外發起連接,外網機沒法直連內網的,這也是內網機安全的原因之一吧,又因為路由器會把這個關系記錄下來,但是過一段時間這個記錄可能會丟失?,所有每一個客戶端 ? ?每隔一定時間就會向服務器發送消息,以保證服務器可以隨時找到你,這東西被稱為心跳包。
3.如何跨內網直連
???Nat打洞(難):
???我簡單說下原理,有兩個客戶端A,B?,當然必須有Server啦(他可以隨時連接A,B)
???當A想連B時,A就回從Server那要B的ip,然后與B建立連接(第一次不能成功的,因為看紅字)。
???這時A告訴Server,我找不到B,你替我告訴他一聲,我想與它連接,服務器就告訴B,你給A下一個請帖(B發請求向A)!?
???這時A再向B發起連接就可以成功了(以后就不用server幫忙了)。
4.如何保證數據的可靠性(難)
???滑動窗口協議,這個一句話兩句說不清楚啦,自己google下。
5是否在線。
?????我的設計是每隔40秒客戶端把Server中存自己的信息中的在線改為真,而服務器每過45秒就檢查這個在線變量是否為真,真的話把他改成假,如果假的話就說明這個人在45秒沒有向Server報到=>他網絡出現異常了,掉線了,向其它人發這個人的掉線通知。(這么設計原因在于當用戶網斷了沒有發下線通知,我們也能知道他不在線了)
6文件傳輸(難)
???把文件讀到buf里,然后每次發1024b(當收到接收方確認后再發下一個1024b)。
?
參考文章
http://www.cppblog.com/tx7do/archive/2009/11/09/100513.html
http://bbs.csdn.net/topics/270063434
?
轉載于:https://www.cnblogs.com/lcw/p/3565459.html
總結
以上是生活随笔為你收集整理的【Socket】关于socket长连接的心跳包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 注意Entity中的Uptate
- 下一篇: BZOJ2081 [Poi2010]Be