網路結構圖如下: 開題先放圖,一切全靠編哈哈。 進入正題! 如圖所示,我們需要一個公網伺服器,利用公網伺服器將內網的數據進行轉發,從而實現兩個內網伺服器的通訊。沒錯,這不是p2p,原本想做成p2p,因為有點難度,所以先弄一個tcp數據包轉發,後面再來打洞進行p2p連接。 開發環境 VS2017 + ...
網路結構圖如下:
開題先放圖,一切全靠編哈哈。
進入正題!
如圖所示,我們需要一個公網伺服器,利用公網伺服器將內網的數據進行轉發,從而實現兩個內網伺服器的通訊。沒錯,這不是p2p,原本想做成p2p,因為有點難度,所以先弄一個tcp數據包轉發,後面再來打洞進行p2p連接。
開發環境
VS2017 + asp net core2.1 + .net framework 4.5
整個過程是如何實現的呢?
1.被控客戶端啟動,發送被控端名稱,例如:Home
2.伺服器接收到被控端的數據,將Home記錄,並將Home綁定到當前Tcp連接
3.主控端啟動,發送要連接的“被控端服務”名稱,例如:Home
4.服務端接收到主控端的請求,查詢Home對應的Tcp連接
5.將從主控端來的數據轉發到被控端,將被控端來的數據轉發到主控端
代碼在哪?
放到github上了:https://github.com/bobowire/Wireboy.Socket.P2PService
在實現的過程中遇到什麼問題了?
1.由於windows鎖屏後,Console.WriteLine方法會進行無限期等待,導致程式卡住不動。
解決辦法:在運行後,將所有的Console.WriteLine方法全部註釋掉了。
2.在連接一次之後,再次連接會因為接收函數的超時時間太長,導致後面連接失敗
解決辦法:增加守護線程,在進行數據傳輸後,開啟守護線程,一旦數據傳輸發生超時,啟動新的tcp連接進行通訊。為什麼不用自帶的超時?嗯,那時候沒想到這個東西。
講解一下代碼吧?
代碼很簡單,主要是用的TcpClient和TcpListener兩個類,利用Dictionary綁定Tcp連接與服務名稱,所以只允許一臺電腦連接被控端。如此一來,被控端的斷線重連對數據的轉發影響就不大了。
TcpListener類用於監聽本地埠。
TcpClient類用於轉發數據。
怎麼使用?
請查看項目MD文件:https://github.com/bobowire/Wireboy.Socket.P2PService
運行效果圖