首页 > 解决方案 > 如何使用 python 套接字模块向远程计算机发送消息?

问题描述

我正在尝试将消息从一台计算机发送到另一台未连接到另一台计算机本地网络的计算机。我做了端口转发(端口 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()

标签: pythonpython-sockets

解决方案


据我了解,您的目标是从远程计算机连接到服务器并将消息从服​​务器发送到客户端。因此,它所需要的只是客户端连接到服务器的面向外部的 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 防火墙/路由器后面的服务器时,除了端口转发外,客户端还应定向到路由器的 IP 地址。就客户端而言,路由器的IP地址就是服务器。路由器只是根据端口转发规则转发流量。


推荐阅读