歡迎使用CSDN markdown編輯器

2021-07-23 17:41:53 字數 2443 閱讀 9247

參考:

一直想用自己電腦搭建乙個伺服器,享受一下雲服務帶給人的快感。問題來了,小屌絲一枚,伺服器主機可以用台式電腦湊合一下,但是沒公網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頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...