首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python recv循环

Python recv循环
EN

Stack Overflow用户
提问于 2015-12-02 01:12:30
回答 1查看 4K关注 0票数 0

我正在尝试显示通过循环迭代通过套接字发送数据。我目前使用的方式在Admin客户端上不起作用。我应该怎么做才能修复我的循环?谢谢

服务器中的管理线程-

代码语言:javascript
复制
def HandleAdmin(adminSocket,):
    global addressList

    (c,a) = adminSocket.accept() 

    ts = ssl.wrap_socket(c, certfile="5cc515_server.crt",
                             keyfile="5cc515_server.key",
                             server_side=True,
                             cert_reqs=ssl.CERT_REQUIRED,
                             ca_certs="5cc515-root-ca.cer")

    if ts.recv(80).decode() == 'Hello\r\n':

        ts.send('Admin-Greetings\r\n'.encode()) 

    if ts.recv(80).decode() == 'Who\r\n':
         for i in addressList:
            ts.send(i.encode())
    ts.close()
    return

管理客户端

代码语言:javascript
复制
import ssl
import socket

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

ts = ssl.wrap_socket(s, certfile="100298750.crt",
                        keyfile="100298750.key",
                        ca_certs="5cc515-root-ca.cer")

ts.connect(('127.0.0.1', 4001))

ts.send("Hello\r\n".encode())

if ts.recv(80).decode() == "Admin-Greetings\r\n":

    print("The players currently online are:\n")
    ts.send("Who\r\n".encode())

    loop = True
    try:
        while(loop == True): 
            if (ts.recv(1000) != Null):
                print(ts.recv(1000).decode())
            else:
                loop = False
                ts.close() 
    except:
        pass
EN

回答 1

Stack Overflow用户

发布于 2015-12-02 01:34:36

第一个问题是您尝试执行!= Null,这将引发一个NameError,因为空在python中是无效的,它是None。您看不到这个错误,因为原始的except。您应该只排除您实际预期的错误。

除此之外,当没有数据或连接关闭时,recv不会返回None,它会返回一个空字符串。

然后在您的循环中调用recv两次,在比较之后丢弃第一次调用的结果。编写循环的更好方法是:

代码语言:javascript
复制
try:
    data = ts.recv(1000)
    while data:
        print(data.decode())
        data = ts.recv(1000)
except IOError as e:
    pass
finally:
    ts.close()

或者,如果您想要更具pythonic风格的解决方案,请使用函数迭代器,并将空字符串用作标记:

代码语言:javascript
复制
from functools import partial
for data in iter(partial(ts.recv, 1000), b''):
    print(data.decode())
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34026077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档