【发布时间】:2018-05-26 21:06:09
【问题描述】:
我正在尝试使用 socket 模块在我和我朋友的计算机之间建立通信。我在我的电脑上运行服务器代码,他在他的电脑上运行客户端代码。代码如下:
服务器:
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)运行客户端代码时,它不起作用。没有抛出错误,但他发送的数据我的计算机和路由器的端口转发规则都没有收到。
这个问题可能源于我的代码,还是更有可能是因为我的路由器没有正确设置?
【问题讨论】:
-
也许尝试通过使用
socket.SOCK_STREAM而不是socket.SOCK_DGRAM来使用TCP套接字 -
或者在没有一秒超时的情况下对其进行测试,但在打印之前检查
data != b''并注释掉print('Sending ...'),这样你就不会收到很多空消息