網絡結構圖以下:git
開題先放圖,一切全靠編哈哈。github
進入正題!windows
如圖所示,咱們須要一個公網服務器,利用公網服務器將內網的數據進行轉發,從而實現兩個內網服務器的通信。沒錯,這不是p2p,本來想作成p2p,由於有點難度,因此先弄一個tcp數據包轉發,後面再來打洞進行p2p鏈接。服務器
VS2017 + asp net core2.1 + .net framework 4.5網絡
1.被控客戶端啓動,發送被控端名稱,例如:Hometcp
2.服務器接收到被控端的數據,將Home記錄,並將Home綁定到當前Tcp鏈接函數
3.主控端啓動,發送要鏈接的「被控端服務」名稱,例如:Home.net
4.服務端接收到主控端的請求,查詢Home對應的Tcp鏈接線程
5.將從主控端來的數據轉發到被控端,將被控端來的數據轉發到主控端3d
放到github上了:https://github.com/bobowire/Wireboy.Socket.P2PService
解決辦法:在運行後,將全部的Console.WriteLine方法所有註釋掉了。
解決辦法:增長守護線程,在進行數據傳輸後,開啓守護線程,一旦數據傳輸發生超時,啓動新的tcp鏈接進行通信。爲何不用自帶的超時?嗯,那時候沒想到這個東西。
代碼很簡單,主要是用的TcpClient和TcpListener兩個類,利用Dictionary綁定Tcp鏈接與服務名稱,因此只容許一臺電腦鏈接被控端。如此一來,被控端的斷線重連對數據的轉發影響就不大了。
TcpListener類用於監聽本地端口。
TcpClient類用於轉發數據。
請查看項目MD文件:https://github.com/bobowire/Wireboy.Socket.P2PService