終於放假結束了,又回到學校了
之前一直在做WinForm表單 現在終於完善了,然後是準備做互連網上的應用,經過長久的探索和學習查閱資料,心裡終於有了大致的輪廓 ,明白了大致原理
這裡以一個類似於QQ的即時通訊軟體為例
網上有很多的聊天程式源碼可以下載,包括實現了檔案傳輸和視頻語音的仿QQ系列原始碼,但是基本上有一個共同的特點,只適用於區域網路 服務端也較少使用非同步方式處理
但是在實際的網路環境中 很多的電腦通過內網的網關上網,網關具有一個公網的IP地址
在互連網中兩台電腦通訊必然情況複雜
以即時通訊為例可以這樣做 軟體分為用戶端和伺服器端 其實是一個混合型的P2P架構
服務端位於一台具有公網IP地址的電腦中(伺服器)
用戶端位於其它電腦,包括內網中和公網中的電腦
如果所有的資訊都通過伺服器中轉 則不能實現P2P,伺服器的壓力也非常大。對於用戶端和服務端的通訊 由於服務端位於公網上,只要串連是從用戶端請求的 則可以無視NAT,雙方之間的通訊不會受到網路環境的限制,無論用戶端位於內網還是公網都一樣。
但是如果兩個用戶端之間要傳輸語音 視頻 檔案 這種大量的資訊,如果都通過服務者中轉勢必伺服器難以承受,最佳方式是通過點對點連接
以下是即時通訊幾個主要模組:
1.文字訊息 指令傳輸
2.視頻語言傳輸
3.檔案傳輸
顯然 視頻語音檔案應該通過P2P方式傳輸比較好 文字訊息通過伺服器中轉,方便伺服器記錄聊天資訊
這裡關鍵問題就到了P2P了
假設有用戶端A 和用戶端B ,如果建立AB直接的串連?有一下幾種情況
1, AB都位於公網上 雙方監聽 任意一方發送的資料或串連請求都能準確到達,可以確保AB直接的點對點資料輸出
2, AB其中一台位於公網 一台位於內網 由於在內網中的電腦只要知道另外一台計算的IP地址 從內網中發出請求也能穿透NAT實現點對點通訊
3, AB位於不同的內網中 如果是UDP協議則通過UDP打洞的方式來確保P2P通訊 如果是TCP打洞,由於各種複雜的NAT裝置,如各種型號的路由器,讓AB實現P2P串連的成功率並不高
可以看出實現P2P的關鍵在於第3點
文字訊息通過伺服器中轉,所有不涉及P2P。 視頻語音可採用UDP打洞實現點對點的傳輸 ,UDP雖然是不可靠的傳輸 在傳輸過程中即使發生了丟包,誤碼或者錯誤等 也只是少部分,這裡我們不用管那些錯誤的 視頻和語音即使發生了少部分的丟失或者錯誤,總體上講依然是流程的。
所以對於互連網上的即時通訊(包括遠程視頻會議等)在查閱相關不少資料後,針對即時通訊的主要模組,個人覺得應當設定以下策略:
1.文字訊息傳輸 包括使用者登入 狀態修改 表情傳遞這些都以文字(指令)的形式通過中央伺服器轉寄
2.視頻語言傳輸 採用UDP協議,以點對點的方式傳輸 必要時需要通過UDP打洞的方式穿透NAT裝置(如路由器)
3.檔案傳輸 對於檔案不能要確保完整地傳輸,採用TCP協議 如果兩台機器位於不同的內網之中,伺服器協助TCP打洞 如果AB直接建立TCP串連成功,則直接傳輸 如果無法建立TCP串連則通過伺服器中轉。
這樣的策略 可以適應複雜網路環境中的即時通訊,對於一個分布式系統來說 這樣的策略應該是普遍適用的
想.NET平台下 雖然主要有Remoting和Socket兩種主要技術來進行網路編程 不過也可以看書Remoting還是有很多的不足 沒有Socket靈活,兩者都有不同的優勢,應該根據不同的需求情況下選擇使用不同的技術 甚至兩者混合使用。