gpt4 book ai didi

python - 带有 Python : How to optimize my implementation? 的 TCP 服务器

转载 作者:可可西里 更新时间:2023-11-01 02:47:14 27 4
gpt4 key购买 nike

我想使用 Python 脚本实现 TCP 服务器。

服务器基本上应该完成以下任务:

它会被远程客户端循环轮询,然后读取其本地工作站上的某些数据并发送给客户端轮询。

可以假设如下:

  • 始终只有一个客户端连接到服务器(通过以太网)
  • 客户端和服务器运行在 Windows 平台上
  • 将使用Python 2.5.1来实现

目标:

  • 服务器在从客户端读取数据/向客户端写入数据时应尽可能高效
  • 服务器应尽可能减少对本地工作站的压力
  • 服务器不得造成系统不稳定

由于我对这个主题只有一点经验,我想在这里讨论如何优化我当前(非常简单)的代码以满足前面提到的要求。

到目前为止,我有以下内容:

import socket
import sys

port_number = 12345
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server_address = (socket.gethostname(), port_number)
sock.bind(server_address)

sock.listen(1)
while True:
connection, client_address = sock.accept()
try:
while True:
data = connection.recv(4096)
if data:
connection.sendall(getdesireddata(data))
else:
break
finally:
connection.close()

感谢您的所有回复。

最佳答案

首先,代码中存在一个小错误。这条线...

data = connection.recv(4096)

...将尝试从单个 TCP 数据包中读取最多 4k,但如果客户端发送的数据超过 4k,或者决定将数据分解为多个数据包,则您可能无法在一次调用中获取所有数据.

您通常会继续从套接字中读取数据,附加到缓冲区,直到您拥有协议(protocol)规范定义的完整消息,或者直到远程主机关闭其 TCP 连接的出站一半。

如果客户端崩溃并且没有正确关闭套接字,您还会遇到服务器卡住的问题。为避免这种情况,您需要查看非阻塞 IO,类似于...

connection.setblocking(0)
buffer = ''
while 1:
try:
data = connection.recv(4096)
if not data:
# Client has closed outbound connection
break
else:
# Append to buffer
buffer += data
except socket.error, e:
code = e.args[0]
if code == 11:
# Got EWOULDBLOCK/EAGAIN
time.sleep(0.1)
else:
# Got another error
raise
do_something_with(buffer)

...或者看看使用 Python select模块做同样的事情。

关于对性能的较少关注,我看不出您可以使用这么小的代码示例进行任何重大改进。

关于python - 带有 Python : How to optimize my implementation? 的 TCP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15987505/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com