繁体   English   中英

Python套接字未处理所有命令

[英]Python socket not processing all commands

我一直在致力于实现UDP套接字程序(基本上是服务器/客户端类型的想法)。 我遇到了一个问题,当服务器从客户端收到一条消息时,将代码跟随到一个点,然后又停止,然后下次服务器再次从客户端收到另一条消息时,它将完成对上一个命令的处理请求,然后再次停止并重复。 这可能没有意义,但我将尝试用代码进行解释。

def receive():
    conn_list = connections()
    routes = []
    sender = -1
    read, write, errors= select.select(conn_list,[],[])
    data = None
    for sock in read:
        data, addr = sock.recvfrom(1024)
        print(data.decode('utf-8'))
        print("hello")

def run():
    filename = input("fielname? ")
    route_table = create_table(filename)
    while True:
        receive()

该消息是"2. 2. 5. 15000. [4, 2]. [6, 1]" (例如),因此每次命中服务器时控制台中的预期结果将是:

    2. 2. 5. 15000. [4, 2]. [6, 1]
    hello

但是,第一次运行时,我得到:

    2. 2. 5. 15000. [4, 2]. [6, 1]

然后第二次,我得到:

    hello
    2. 2. 5. 15000. [4, 2]. [6, 1]

因此,两次击中服务器后的整个控制台如下所示:

    2. 2. 5. 15000. [4, 2]. [6, 1]
    hello
    2. 2. 5. 15000. [4, 2]. [6, 1]

如果有人有任何想法,请先感谢您的帮助!

由于存在许多不一致之处,因此很难判断此代码​​段中发生了什么,但是在诸如read之类的Python命令中,recv被阻塞,直到(在您的情况下)读取1024个字节或关闭套接字为止。 阻塞很可能是导致您所看到的行为的原因。

我怀疑您不想在每次发送后关闭套接字。

在这种情况下,我建议您尝试以下操作:

  • 在发送时冲洗套接字,以确保没有缓冲

     fd.flush() 
  • 使用'readline'代替读取-如果数据流中有'换行' 如果在发送中知道确切的数据大小,则这应该是非阻塞的,请使用小于1024的read / recv值...

     data = fd.readline() data = sock.recvfrom(10) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM