这里我很难在初始化实例时初始化套接字,并且我用它来循环传输数据。
class Server2:
host = "localhost"
port = 44444
s = ""
sock = ""
addr = ""
def __init__(self,voitingSistem,voitingInterfece,voiting,sql):
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.s.bind((self.host, self.port))
self.s.listen(5)
self.sock, self.addr =self.s.accept()
self.client = WorkWithClient()
self.voitingSistem = voitingSistem()
self.voitingInterfece = voitingInterfece()
self.voiting = Voiting("d")
super().__init__()
def mainLoop(self):
while True:
buf = self.sock.recv(1024) # receive and decode a command
print("getting command: "+(buf.decode('utf8')))
ansver = self.client.AcceptCommand(buf.decode('utf8')) # act upon the command
if buf.decode('utf8') == "exit":
self.sock.send("bye")
break
elif buf:
self.sock.send(buf)
print(buf.decode('utf8'))
self.sock.close()
错误:
尝试对非套接字的对象执行操作
答案 0 :(得分:1)
以下条件始终为真,除非buf
等于exit
,否则将始终执行代码:
elif buf:
self.sock.send(buf)
print(buf.decode('utf8'))
self.sock.close()
在代码的前面部分,您可以通过调用buf
获取self.sock.recv(1024)
。对于阻塞模式下的普通套接字,它将返回至少一个字节。在任何情况下,buf
都不会为空。程序执行将被阻止,直到某些数据到达。如果发生了一些非常糟糕的事情,例如断开连接,您将收到异常通知,而不是通过接收空缓冲区。
基本上,在收到第一块数据后,您将关闭与客户端的连接。我相信你的意思是self.sock.close()
部分== 'exit'
。