使用.net standard實現(xiàn)不同內網端口的互通(類似花生殼)
應用場景
1.公司電腦與家中電腦的遠程控制,一般通過teamview、向日葵等軟件,端口互通后,可以使用電腦自帶的遠程桌面
2.家中電腦搭建SVN、git倉庫,在外網或者內網訪問,一般使用云服務器,端口互通后,可以部署在任意電腦
3.家中電腦搭建數(shù)據(jù)庫、web服務以及其他基于TCP協(xié)議的服務,端口互通后,可以部署在任意電腦
注意:并不是說就不需要購買云服務器了,而是運行的服務可以部署在任意電腦,云服務器仍是必須的,但是可以買最便宜的服務器以達到省錢的目的
?
技術原理
模式一? 服務器中轉:
場景:我們有電腦A和電腦B,他們在不同的局域網,現(xiàn)在我們需要在電腦A訪問電腦B的web服務(端口是80)
原理:我們通過監(jiān)聽電腦A的端口80,當此端口接收到http請求的時候,程序將通過一些操作,在電腦A、服務器以及電腦B中建立一條專用TCP鏈接,然后電腦A將80端口接收到的數(shù)據(jù)轉發(fā)到服務器中,然后服務器再把數(shù)據(jù)發(fā)送給電腦B的80端口,從而實現(xiàn)訪問電腦B的web服務的目的。
?
模式二 直接連接:
場景:我們有電腦A和電腦B,他們在不同的局域網,現(xiàn)在我們需要在電腦A訪問電腦B的web服務(端口是80)
原理:我們通過監(jiān)聽電腦A的端80,當此端口接收到http請求的時候,程序將通過一些操作,在電腦A與電腦B中建立一條直連的TCP連接,然后電腦A將80端口收到的數(shù)據(jù)直接發(fā)送到電腦B的80端口,從而實現(xiàn)訪問電腦B的web服務。
項目結構介紹
完整結構:

項目一共分為2種:
第一種:.net standard開發(fā)的核心庫,編譯后是dll,可以跨平臺但不能直接運行
第二種:另一種是.net core以及.net framework開發(fā)的啟動器,編譯后是各個平臺可以運行的程序。
將核心庫的dll,放入啟動器的指定目錄中,才能正常運行程序。
?
P2PSocket.Core項目

這個項目主要是一些基類的實現(xiàn),具體就不介紹了。
?
P2PSocket.Client項目

這是客戶端的核心庫?
Commands:用于處理來自服務端發(fā)送的消息
?ConfigIO:配置文件的讀取
?Receive:因為拆包是自己寫的,在基類,而由于一些特殊情況,會需要不同的拆包邏輯,繼承基類后的新類都在Receive目錄(名字錯了哈哈哈)
?Send:這個目錄主要存放的是發(fā)送到服務端的數(shù)據(jù)包封裝類
?
P2PSocket.Server

?這是服務端的核心庫,結構與客戶端一致
?
P2PSocket.StartUp項目

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

這是專門為windows開發(fā)的啟動器,主要是可以注冊為服務,從而達到開機自啟的目的。
剩下的項目可以忽略了。
項目源碼下載地址
https://github.com/bobowire/Wireboy.Socket.P2PSocket
最新程序下載地址
https://github.com/bobowire/Wireboy.Socket.P2PSocket/releases
結語
這個項目是2019年2月開始開發(fā)的,那時候因為teamview開始有商業(yè)模式限制,所以自己萌發(fā)了做一款端口互通的軟件,不僅可以幫助公司協(xié)助解決用戶問題,還能在公司遠程家里以及在家里加班???哈哈哈
最初的版本開發(fā)了差不多20多天,然后經過2次代碼重構,變成了現(xiàn)在這個樣子。代碼重構很痛苦,大家寫代碼需謹慎。當然,在我的計劃中,我又要開始第3次代碼重構了。
有了這個東西之后,我發(fā)現(xiàn)很多程序員需要的東西就不再那么糾結了,比如我想要個數(shù)據(jù)庫,想要個svn,想要個自己用的web網盤,不用去管云服務器的硬盤、cpu等限制了,還是很實用的。不過你可能需要一個大寬帶的云服務器了哈哈。
另外關于程序的性能,我用的阿里云服務器,程序滿載寬帶的話,cpu差不多是3.5%左右。另外有人給我這個程序測試了一下能夠連接的客戶端數(shù)量,說是500+的客戶端連接正常使用,他測不了更多了。
最后,github中的star大家可以點一下,如果你們fork了代碼,一定要隔一段時間同步一下主版本的代碼。github中的QQ群大家如果沒問題就不要加進去了,因為沒問題的人都會被清理出去。最后,歡迎大家提bug,不要提需求!!!
?
github首頁展示

?

