我尝试使用套接字模块在我和朋友的计算机之间建立通信。我在我的计算机上运行服务器代码,并在他的计算机上运行客户端代码。这是代码:
服务器:
import socket
host = "XXX.XXX.XX.XXX" # IP of my computer
port = 2000
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host, port))
addrs = []
print("Server started")
while True:
data, addr = s.recvfrom(1024)
if not addr in addrs:
addrs.append(addr)
data = data.decode("utf-8")
print("Recieved: " + str(data))
print("Sending: " + data)
for add in addrs:
s.sendto(data.encode("utf-8"), add)
客户端:
import socket
import time
host = "XXX.XXX.XXX.XXX" # External IP of my router
port = 2001
server = (host, port)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setblocking(False)
while True:
message = "Test message"
time.sleep(1)
print("Sending: " + message)
s.sendto(message.encode("utf-8"), server)
try:
data, addr = s.recvfrom(1024)
except BlockingIOError:
pass
else:
data = data.decode("utf-8")
print("Recieved: " + str(data))
注意:客户端与服务器代码中的端口不同,以确保我的端口转发实际上正在执行某些操作。
我在路由器上设置了端口转发功能。当我在我的计算机上运行这两个脚本(或者甚至是连接到我的同一个WiFi的另一台计算机)时,一切正常,我知道端口转发正在做它的事情。但是,当我的朋友(连接到不同的WiFi )运行客户端代码时,它不起作用。没有错误,但他发送的数据既不是我的计算机也不是路由器的端口转发规则。
这个问题可能来自我的代码,还是因为我的路由器设置不正确而更有可能?
答案 0 :(得分:0)
好的我设置了HotSpot我的Android手机。在这种情况下,你的“路由器”,使用我的手机的IP地址。并且在计算机上试图运行客户端代码,它在客户端上发送测试消息:
发送:测试消息 发送:测试消息 发送:测试消息 发送:测试消息 ....
但我在您的服务器上没有收到任何信息,仍然说服务器已启动。
所以我在“客户端应用程序”上配置了你的主机变量,你的端口在服务器上的2000和客户端上的2001不一致:
host =“”#我的路由器的外部IP port = 2000 注意!!我离开主机空了
因为我认为由于某种原因服务器本地托管在PC上,所以您正在运行服务器。这样我也可以从运行服务器应用程序的同一台计算机本地连接:
host =“localhost”#我的路由器的外部IP
在您的客户端应用上。
这就是一切的样子。
服务器代码 在你的计算机上运行它。
import socket
host = "" # IP of my computer
port = 2000
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host, port))
addrs = []
print("Server started")
while True:
data, addr = s.recvfrom(1024)
if not addr in addrs:
addrs.append(addr)
data = data.decode("utf-8")
print("Recieved: " + str(data))
print("Sending: " + data)
for add in addrs:
s.sendto(data.encode("utf-8"), add)
取决于您运行serverApp的位置。使用运行服务器的计算机的IP。我还在学习,所以我不知道如何设置它来使用路由器的IP。
ClientApp代码 在您的朋友计算机上运行此操作或更多。或者甚至在Android上。
import socket
import time
host = "ip_of_the_computer_the_server_is_running_on" # connecting from another computer
#host = "localhost" # If you connecting locally
port = 2000
server = (host, port)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setblocking(False)
while True:
message = "Test message"
time.sleep(1)
print("Sending: " + message)
s.sendto(message.encode("utf-8"), server)
try:
data, addr = s.recvfrom(1024)
except BlockingIOError:
pass
else:
data = data.decode("utf-8")
print("Recieved: " + str(data))
并仅将您的路由器用于相同的AP连接。 用我的TOTO-LINK IT WORKS FINE进行测试。只要我不使用路由器的IP在客户端主机上。
客户端
答案 1 :(得分:0)
此代码实际上是100%正确,错误在我的端口转发中。