作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想使用 Python 脚本实现 TCP 服务器。
服务器基本上应该完成以下任务:
它会被远程客户端循环轮询,然后读取其本地工作站上的某些数据并发送给客户端轮询。
可以假设如下:
目标:
由于我对这个主题只有一点经验,我想在这里讨论如何优化我当前(非常简单)的代码以满足前面提到的要求。
到目前为止,我有以下内容:
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/
我是一名优秀的程序员,十分优秀!