Reputation: 41
Here I am confused to initialize the socket when the instance is initialized, and I use it to transfer data through it in a loop.
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()
Error:
An attempt was made to perform an operation on an object that is not a socket
Upvotes: 0
Views: 420
Reputation: 3215
The following condition is always true and the code will always be executed unless buf
is equal to exit
:
elif buf:
self.sock.send(buf)
print(buf.decode('utf8'))
self.sock.close()
Earlier in the code you obtain buf
by calling self.sock.recv(1024)
. For a usual socket in blocking mode it will return at least one byte. There are no circumstances under which buf
will be empty. Program execution will be simply blocked until some data arrives. If something really bad happens, like disconnect, you'll be notified by an exception, not by receiving an empty buffer.
So essentially you close a connection to a client after the first chunk of data is received. I believe you meant to have self.sock.close()
in == 'exit'
section.
Upvotes: 1