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

标签 python tcp network-programming ethernet

我想使用 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/

相关文章:

php - 各种 Python/PHP Web 框架的相对优势是什么(特别是对于我的项目)?

java - 同步游戏(MMORPG)客户端和服务器之间的时间/事件?

python - python 中的 "reduce"函数在 "namedtuple"上不起作用?

java - 带有 JNLP 小程序的 Plone CMS

c - TCP 客户端-服务器 "bad address"错误(在 C 中)

linux - 使用 setsockopt() 修改 TCP 中的内核结构?

java - Android 编码 : ViewRootImpl$CalledFromWrongThreadException. [菜鸟]

python - 关于一个简单的 python wsgi 服务器(wsgiref.simple_server)的困惑

delphi - 网络基础设施发现

python - 在python中使用装饰器进行错误处理