【问题标题】:Asynchronous receiving TCP packets in python在python中异步接收TCP数据包
【发布时间】:2017-01-27 09:17:28
【问题描述】:

我有一个即时通讯应用,客户端是用 python 编写的。

连接到服务器的代码:

def connect(self, host, port, name):
    host = str(host)
    port = int(port)
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host, port))
    s.send('CONNECT:' + name)
    print s.recv(1024)

    return s

那么 s 将被存储在一个 self.socket 中。

这是从服务器接收 tcp 数据包并将其打印到命令行的函数。

def chat(self):
    while True:
        data = self.socket.recv(4096)
        if not data:
            pass
        else:
            print data

所以在我看来,它应该接收服务器发送并打印出来的所有内容,但它并没有发生。有谁知道如何将它变为现实?

【问题讨论】:

  • 当你尝试跑步时到底发生了什么?
  • 它有效,我可以向服务器发送消息,服务器接收它,但我无法在客户端接收消息。顺便说一句,它适用于 telnet 客户端。
  • 在没有数据之前: print 'Error' 它开始无限打印它
  • 我确实为 TCP 聊天编写了一个脚本,在我的脚本中,发送和接收是同时进行的,就像 socket.sendsocket.recv 的循环一样,它工作得很好。尝试这样做。
  • 尝试编辑while循环并在recv之前添加send

标签: python sockets tcp


【解决方案1】:

select 函数有一种方法可以监视多个流,列出您需要处理的所有流并为其使用 select 函数,对于用户输入使用 sys.stdin 和所有套接字您希望与之聊天的人。
检查这个:https://docs.python.org/2/library/select.html
但是进行异步聊天的最佳方式仍然是使用udp,它会工作得很好

【讨论】:

  • 谢谢你的朋友,但问题在于我的服务器是如何工作的。服务器不仅像我一样收到一条消息,而且还收到一条带有命令的消息,例如 SAY 或 QUIT。我所做的只是将此命令添加到我发送的 TCP 数据包中,它现在可以正常工作。作为异步,我不确定我是否正确使用了这个词,但它可以工作并且没关系,再次感谢您。
  • 虽然 OP 选择接受它,但这个答案充其量只是误导。 TCP 中没有要求双向数据流。 TCP 完全有能力只让一方发送数据。套接字不“期望返回消息”。使用 TCP 进行单向数据传输是有原因的。 UDP 并非总是正确的解决方案。
  • 你说得对,tcp可以单向传输。对不起这个错误。其实我之前也遇到过同样的问题,这个方法很快就解决了,所以贴出来了。
猜你喜欢
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 2012-09-27
  • 2010-12-10
相关资源
最近更新 更多