如何使用 python 套接字模块向远程计算机发送消息?

How to send messages to a remote computer using python socket module?

我正在尝试将消息从一台计算机发送到另一台未连接到另一台计算机本地网络的计算机。 我进行了端口转发(端口 8080,TCP),但未能成功连接远程计算机并发送消息。 当我尝试连接时,它只是卡在连接方法(客户端)上。

我还需要说明一下,我愿意更改路由器设置中的任何内容。

客户端代码(远程电脑):

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("%My public IP address%", 8080))
msg = s.recv(1024)
msg = msg.decode("utf-8")
print(msg)

服务器代码:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("192.168.0.2", 8080))
s.listen(5)

while True:
   clientsocket, address = s.accept()
   print(f"Connection from {address} has been established.")
   clientsocket.send(bytes("Hey there!!", "utf-8"))
   clientsocket.close()

据我了解,您的目标是从远程计算机连接到服务器并从服务器向客户端发送消息。因此,它所需要的只是客户端连接到服务器的面向外部的 IP 地址。完成后,路由器会根据端口转发规则转发流量。

服务器:

import socket

def Main():
    host = '10.0.0.140'
    port = 42424
    s = socket.socket()
    s.bind((host, port))

    s.listen(1)
    c, addr = s.accept()
    while True:
        data = c.recv(1024)
        if not data:
            break
        data = str(data).upper()
        c.send(data)
    c.close()
if __name__ == '__main__':
    Main()

客户:

import socket

def Main():
    host = '10.0.0.140' #The host on your client needs to be the external-facing IP address of your router. Obtain it from here https://www.whatismyip.com/
    port = 42424 
    s = socket.socket()
    s.connect((host,port))
    message = raw_input("->") 
    while message != 'q':
        s.send(message)
        data = s.recv(1024)
        message = raw_input("->")
    s.close()

if __name__ == '__main__':
    Main()

另请注意,当连接到 NAT firewall/router 后面的服务器时,除了端口转发外,客户端还应定向到路由器的 IP 地址。对于客户端来说,路由器的IP地址就是服务器。路由器只是根据端口转发规则转发流量。