我尝试通过循环迭代显示通过套接字发送的数据。我现在拥有它的方式是不在Admin客户端上工作。我该怎么做才能修复我的循环?谢谢
服务器中的管理员线程 -
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
答案 0 :(得分:2)
第一个问题是你尝试!= Null
,这会引发NameError
,因为Null在python中无效,它是None
。由于raw除外,你没有看到那个错误。除了您实际期望的错误之外,您应该只是。
除此之外,当没有数据或连接关闭时,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()
或者,如果你想要一个更加pythonic的解决方案,使用一个函数迭代器,空字符串作为sentinel:
from functools import partial
for data in iter(partial(ts.recv, 1000), b''):
print(data.decode())