Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python recv循环_Python_Sockets_Python 3.x - Fatal编程技术网

Python recv循环

Python recv循环,python,sockets,python-3.x,Python,Sockets,Python 3.x,我试图通过循环中的迭代显示通过套接字发送的数据。目前我使用的方式不是管理客户端。我应该怎么做来修复我的循环?多谢各位 服务器中的管理线程- def HandleAdmin(adminSocket,): global addressList (c,a) = adminSocket.accept() ts = ssl.wrap_socket(c, certfile="5cc515_server.crt", key

我试图通过循环中的迭代显示通过套接字发送的数据。目前我使用的方式不是管理客户端。我应该怎么做来修复我的循环?多谢各位

服务器中的管理线程-

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
管理客户端

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

第一个问题是您试图执行
!=Null
,这将引发一个
名称错误
,因为Null在python中无效,它是
。由于原始数据,您看不到该错误。您应该只考虑实际预期的错误

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

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

try:
    data = ts.recv(1000)
    while data:
        print(data.decode())
        data = ts.recv(1000)
except IOError as e:
    pass
finally:
    ts.close()
或者,如果您想要更具Python风格的解决方案,请使用带有空字符串的函数迭代器作为sentinel:

from functools import partial
for data in iter(partial(ts.recv, 1000), b''):
    print(data.decode())
“不起作用”不是描述性的。预期输出与实际输出是什么,包括发生异常时的完整回溯?