python - 如何使用 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()
解决方案
据我了解,您的目标是从远程计算机连接到服务器并将消息从服务器发送到客户端。因此,它所需要的只是客户端连接到服务器的面向外部的 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地址就是服务器。路由器只是根据端口转发规则转发流量。
推荐阅读
- android - 使用 Signature Android glide 查找缓存的图像
- powershell - 如何检查 Vcenter 上的 NTP 设置
- c++ - 好友功能仍然无法访问私人会员
- java - 在java中传递后代而不是接口
- javascript - 如何使用 jquery 从 ajax 结果(json 对象)访问数据
- ios - 在 UICollectionView 中滚动后,标题视图没有重新排列
- javascript - 获取 HTML 表格中多个元素的 Id 和 Value
- python-3.x - Python列表拆分并仅拉取某些项目以创建新列表
- python - 在列表中查找重复项并在每个字符后添加连续的字母字符
- time-series - 橙色的时间序列预测