天天看點

python的socket通信中,如何設定可以讓兩台主機通過外網通路?

要讓兩台主機通過外網進行Socket通信,需要在網絡設定和代碼實作兩個方面進行相應的配置。下面是具體的步驟:

确認網絡環境:首先要確定兩台主機都能夠通過外網通路。可以通過ping指令或者telnet指令來測試兩台主機之間是否可以互相通路。

确定外網IP位址:為了使兩台主機能夠互相通路,需要知道它們在外網中的IP位址。可以通過百度、谷歌等搜尋引擎搜尋"我的IP",擷取本機在外網中的IP位址。對于伺服器端,如果它有一個域名,可以通過ping指令擷取到域名解析出來的IP位址。

端口映射:如果兩台主機在同一内網中,需要将本地端口映射到公網IP上,使得外網可以通路到内網主機的服務。可以在路由器中進行端口映射設定,将路由器的公網IP位址和端口映射到内網中的某台主機的IP位址和端口。

編寫Python Socket程式:編寫伺服器端和用戶端程式,使用公網IP位址和端口号進行連接配接。在代碼中需要使用socket.bind()函數綁定伺服器的IP位址和端口号,以及使用socket.connect()函數連接配接用戶端的IP位址和端口号。

以下是一個簡單的Python Socket程式示例:

伺服器端代碼:

 import socket

HOST = '0.0.0.0' # 監聽所有位址

PORT = 8888

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((HOST, PORT))

s.listen(1)

conn, addr = s.accept()

print('Connected by', addr)

while True:

    data = conn.recv(1024)

    if not data:

        break

    conn.sendall(data)

conn.close()

用戶端代碼:

import socket

HOST = '伺服器公網IP位址'

PORT = 8888

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((HOST, PORT))

s.sendall(b'Hello, world')

data = s.recv(1024)

s.close()

print('Received', repr(data))