【发布时间】:2020-05-05 09:37:47
【问题描述】:
我编写了一个通过套接字发送一些数字的小程序。我在我的电脑上运行客户端程序,在虚拟机上运行服务器程序(托管在谷歌云平台上)。我正在使用的代码:
client.py:
import socket
from time import time
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("xx.xxx.xxx.xxx", 5555))
for i in "1234567890":
print(f"Sending {i} at time {time()}")
client.sendall(i.encode())
data = client.recv(64)
print(f"Received {data.decode()} at time {time()}")
server.py:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("0.0.0.0", 5555))
s.listen(2)
print("Server listening")
conn, addr = s.accept()
print("Connected to:", addr)
while True:
data = conn.recv(2048).decode()
if(not data):
print("Server closing")
break
conn.sendall(data.encode())
client.py 的输出显示,将数据发送到服务器,然后接收并解码的往返过程大约需要 0.2 秒。这对我来说似乎相当高,套接字不应该运行得更快吗?从this 帖子看来,java 中的 tcp 套接字可以在 2 微秒 内完成往返,这比我的 0.2 秒快很多。在套接字方面,我是新手,所以我对任何事情都不太确定。如果有人可以为我提供一些见解,或者就如何使套接字更快地运行提出建议(如果可能的话,也许是不同的模块或套接字类型?),那就太好了。
我开始使用套接字是因为我想根据某人给我的教程制作一个基本的多人游戏(他的套接字似乎运行得非常快),但是在运行这段代码之后,数据传输所需的时间客户端之间似乎会导致游戏无法玩,或者至少严重缓慢并且根本不好玩。我确实看到了一些关于使用 UDP 而不是 TCP 的信息,但是在尝试了某人的 UDP 示例后,我发现它的运行速度同样慢。
注意:
- 服务器代码在 linux 机器上
- 客户端代码在 Windows 机器上
- 我的网速还不错,所以我认为这不是主要问题
- 我尝试使用
socket.TCP_NODELAY,但没有效果
只是一些别人可能会觉得有用的额外信息
【问题讨论】:
-
你有没有试过摆脱
print这里的电话?默认情况下写入标准输出很慢,cf stackoverflow.com/questions/3857052/… -
有几件事,首先摆脱
print语句,这些语句会使您的代码滞后,其次考虑使用 asyncio 或 gevent,因为套接字是 IO 绑定的,应该会大大加快它们的速度