【问题标题】:How to send messages to a remote computer using python socket module?如何使用 python 套接字模块向远程计算机发送消息?
【发布时间】:2020-07-08 19:05:04
【问题描述】:

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

【问题讨论】:

  • 您的服务器是直接连接到互联网,还是通过防火墙、路由器等?
  • 看看我的回答,如果它解决了您的问题,请告诉我?

标签: python python-sockets


【解决方案1】:

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

【讨论】:

  • 嘿@AzyCrw4282 我使用了你的代码,它帮助了我,我想通了,现在它可以工作了!非常感谢,你帮了我很多。我很感激
猜你喜欢
  • 2015-05-17
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多