tcp和udp想必是通訊中用的最多的協議了,具體的協議規則就不介紹了,在此只是記錄一下在專案中遇到的一些問題,文字沒有怎麼組織,基本上是想到哪寫到哪,莫怪.......
tcp問題一:心跳包
因為tcp的長連線問題,需要保活連線,常規的做法就是傳送心跳包,通過往伺服器一端傳送一小段資料報,接收端可以不處理。考慮到這種需求,msocket.sendurgentdata(0xff);這個方法可能會很合適,因為接受端接受到這種訊息會自動忽略,不需要自己著手處理。在測試中,發現通過該方法由手機端傳送心跳到pc上,pc為xp系統tcp連線正常,不會斷線,而在win7系統時,tcp連線會在80s準時斷開,雖然有重連機制,但是頻繁的重連還是會影響效能。經過一段時間的排查,發現原因是在win7上,傳送sendurgentdata該資料最多只能傳送16次,而我的心跳包是5s傳送一次,正好是80s。在win7上傳送sendurgentdata資料16次會造成網路擁塞,造成連線中斷。
tcp問題二:訊息沾包
TCP之心跳包實現思路
說起網路應用程式設計,想到最多的就是聊天類的軟體。當然,在這類軟體中,一般都會有乙個使用者掉線檢測功能。今天我們就通過使用自定義的heartbeat方式來檢測使用者的掉線情況。心跳包實現思路 邏輯 客戶端每隔一段時間,傳送乙個心跳包 region 心跳timer計數事件 private void h...
長連線為何要傳送心跳包
回來之後我查詢資料後發現,android的推送在後台維持的服務都會傳送心跳包來維持長連線,當一台智慧型手機連上流動網路的時候,其實並沒有鏈結上internet,運營商分配給手機的ip其實只是乙個內網的ip,手機端要連上internet必須要通過運營商的閘道器進行ip轉換,這個閘道器稱為nat net...
TCP伺服器是否需要心跳包?
之前的測試都是,手動強制關閉客戶端程序,然後檢視伺服器的情況,結果往往是,伺服器收到了客戶端關閉的事件。其實,我一直忽略了乙個問題,我沒有拔掉網線來測試!上面的手動關閉客戶端程序,事實上並不能測試出想要的結果,因為程序是在應用層的,所以,這種測試方法不能保證網路驅動層也不傳送資料報文給伺服器。經過測...