參考:
一直想用自己電腦搭建乙個伺服器,享受一下雲服務帶給人的快感。問題來了,小屌絲一枚,伺服器主機可以用台式電腦湊合一下,但是沒公網ip啊。伺服器在內網,這個時候還是得用內網穿透。
無法迴避的問題,既然要穿透,伺服器又在內網,必然借助第三方公網ip(別提花生殼了,及其不穩定,而且應該還沒有linux客戶端,受制於人的感覺,相當難受) 在**店買了乙個最低配的vps,用來當中轉站(別問買了vps為什麼不直接來用,便宜的坑爹貨,配置太低,tomcat要啟動3分鐘。。。)。好了,開始!
中轉站實現方式:中轉站用多執行緒伺服器模型(中轉站本質也是乙個伺服器)。接收來自的客戶端或者伺服器請求。1.當伺服器連線時,儲存伺服器的資訊(包括ip和埠),然後就這樣了,tcp長連線,不斷開(以下**用了一些簡單的自定義協議,所以,**僅供參考)2.當客戶端連線時,中轉站直接將訊息**給伺服器,因為中轉站已經在第1步和服務端保持了連線,直接用和服務通訊的socket,就可以send過去了
3.當伺服器接收到訊息時,伺服器處理後,然後同乙個socket傳送給中轉站,中轉站收到訊息後,原封不動的轉給客戶端。
以上,2和3 就完成了一次客戶端 –>中轉站–>伺服器–>中轉站–>客戶端的完整請求和答覆。
思路是非常簡單的,python**實現也相當的簡單:
import socketserver
import threading
sock_map_address={}
class
threadedtcpserver
(socketserver.threadingmixin, socketserver.tcpserver):
pass
class
threadedtcprequesthandler
(socketserver.baserequesthandler):
defhandle
(self):
while
true:
data = str(self.request.recv(1024), 'utf_8')
cur_thread = threading.current_thread()
print(self.client_address,data)
if (data == "server_login"):#伺服器註冊自己的資訊
global sock_map_address
sock_map_address["server"] = self.request #將伺服器已建立連線sock插入字典
self.request.send(bytes("login true","utf_8"))
else :
str_array = data.split("+")
if (str_array[0] == "to_client"): #如果是來自伺服器的訊息
key = "{}+{}".format(str_array[1],str_array[2]) #根據key取客戶端的sock和位址
sock = sock_map_address[key]
sock.send(bytes(str_array[3],"utf_8")) #將訊息傳送到客戶端
else : #來自客戶端的訊息
key = "{}+{}".format(self.client_address[0],self.client_address[1])
sock_map_address[key] = self.request #將客戶端已經建立連線的sock插入字典
sock = sock_map_address["server"] #獲取伺服器的sock
to_server_data = "to_server+{}+{}".format(key, data)
sock.send(bytes(to_server_data,"utf_8"))
if __name__ == "__main__":
host, port = "103.*.*.*", 9999
server = threadedtcpserver((host, port), threadedtcprequesthandler)
ip, port = server.server_address
server_thread = threading.thread(target=server.serve_forever)
# exit the server thread when the main thread terminates
server_thread.daemon = true
server_thread.start()
server_thread.join()import socketserver
以上,就是可以實現內網穿透功能。 歡迎使用CSDN markdow
本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...
歡迎毛毛與妞妞使用CSDN markdown編輯器
建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...
歡迎使用CSDN markdow1n編輯器
本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...