使用.net standard實現不同內網埠的互通(類似花生殼)

吃西瓜的星星發表於2020-07-02

應用場景

1.公司電腦與家中電腦的遠端控制,一般通過teamview、向日葵等軟體,埠互通後,可以使用電腦自帶的遠端桌面

2.家中電腦搭建SVN、git倉庫,在外網或者內網訪問,一般使用雲伺服器,埠互通後,可以部署在任意電腦

3.家中電腦搭建資料庫web服務以及其他基於TCP協議的服務,埠互通後,可以部署在任意電腦

注意:並不是說就不需要購買雲伺服器了,而是執行的服務可以部署在任意電腦,雲伺服器仍是必須的,但是可以買最便宜的伺服器以達到省錢的目的

 

技術原理

模式一  伺服器中轉:

  場景:我們有電腦A和電腦B,他們在不同的區域網,現在我們需要在電腦A訪問電腦B的web服務(埠是80)

  原理:我們通過監聽電腦A的埠80,當此埠接收到http請求的時候,程式將通過一些操作,在電腦A、伺服器以及電腦B中建立一條專用TCP連結,然後電腦A將80埠接收到的資料轉發到伺服器中,然後伺服器再把資料傳送給電腦B的80埠,從而實現訪問電腦B的web服務的目的。

 

模式二 直接連線:

  場景:我們有電腦A和電腦B,他們在不同的區域網,現在我們需要在電腦A訪問電腦B的web服務(埠是80)

  原理:我們通過監聽電腦A的端80,當此埠接收到http請求的時候,程式將通過一些操作,在電腦A與電腦B中建立一條直連的TCP連線,然後電腦A將80埠收到的資料直接傳送到電腦B的80埠,從而實現訪問電腦B的web服務。

 

 

專案結構介紹

完整結構:

 

 

 

專案一共分為2種:

第一種:.net standard開發的核心庫,編譯後是dll,可以跨平臺但不能直接執行

第二種:另一種是.net core以及.net framework開發的啟動器,編譯後是各個平臺可以執行的程式。

將核心庫的dll,放入啟動器的指定目錄中,才能正常執行程式。

 

P2PSocket.Core專案

 

 

 

這個專案主要是一些基類的實現,具體就不介紹了。

 

P2PSocket.Client專案

 

 

這是客戶端的核心庫 

Commands:用於處理來自服務端傳送的訊息

 ConfigIO:配置檔案的讀取

 Receive:因為拆包是自己寫的,在基類,而由於一些特殊情況,會需要不同的拆包邏輯,繼承基類後的新類都在Receive目錄(名字錯了哈哈哈)

 Send:這個目錄主要存放的是傳送到服務端的資料包封裝類

 

P2PSocket.Server

 

 

 這是服務端的核心庫,結構與客戶端一致

 

P2PSocket.StartUp專案

 

這是一個.net core2.1專案,主要是通過反射啟動客戶端或者服務端,它可以跨平臺。

 

 

P2PSocket.StartUp_Windows專案

 

 

 

這是專門為windows開發的啟動器,主要是可以註冊為服務,從而達到開機自啟的目的。

 

剩下的專案可以忽略了。

 

專案原始碼下載地址

https://github.com/bobowire/Wireboy.Socket.P2PSocket

 

最新程式下載地址

https://github.com/bobowire/Wireboy.Socket.P2PSocket/releases

 

結語

這個專案是2019年2月開始開發的,那時候因為teamview開始有商業模式限制,所以自己萌發了做一款埠互通的軟體,不僅可以幫助公司協助解決使用者問題,還能在公司遠端家裡以及在家裡加班???哈哈哈

最初的版本開發了差不多20多天,然後經過2次程式碼重構,變成了現在這個樣子。程式碼重構很痛苦,大家寫程式碼需謹慎。當然,在我的計劃中,我又要開始第3次程式碼重構了。

有了這個東西之後,我發現很多程式設計師需要的東西就不再那麼糾結了,比如我想要個資料庫,想要個svn,想要個自己用的web網盤,不用去管雲伺服器的硬碟、cpu等限制了,還是很實用的。不過你可能需要一個大寬頻的雲伺服器了哈哈。

另外關於程式的效能,我用的阿里雲伺服器,程式滿載寬頻的話,cpu差不多是3.5%左右。另外有人給我這個程式測試了一下能夠連線的客戶端數量,說是500+的客戶端連線正常使用,他測不了更多了。

最後,github中的star大家可以點一下,如果你們fork了程式碼,一定要隔一段時間同步一下主版本的程式碼。github中的QQ群大家如果沒問題就不要加進去了,因為沒問題的人都會被清理出去。最後,歡迎大家提bug,不要提需求!!!

 

 

github首頁展示

 

相關文章