我正在尝试将客户端-服务器程序作为消息服务器类型的东西。当我运行程序时,它会立即关闭连接而无需等待和监听。它打印“成功绑定”和“侦听 127.0.0.1 上的连接:4545”但随后立即关闭,我不确定问题是什么或连接关闭的原因。
import socket, select, time, sys, threading
class Server:
def __init__(self, addr, port):
while True:
try:
self.port = port
self.addr = addr
self.header_length = 10
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.bind((addr, port))
self.sockets_list = [socket]
self.clients = {}
print('Successfully bound connection!')
break
except:
print('Error binding, retrying....'), time.sleep(5)
def recvMsg(self, client_socket):
try:
message_header = client_socket.recv(self.header_length)
if not len(message_header):
return False
message_length = int(message_header.decode('utf-8').strip())
return {'header': message_header, 'data': client_socket.recv(message_length)}
except:
return False
def newSocketConnection(self):
read_sockets, _, exception_sockets = select.select(self.sockets_list, [], self.sockets_list)
for notified_socket in read_sockets:
if notified_socket == self.socket:
client_socket, client_address = self.socket.accept()
user = server.recvMsg(client_socket)
if user is False:
continue
self.sockets_list.append(client_socket)
self.clients[client_socket] = user
print(f'Accepted new connection from {client_address}:{self.port}, Username: {user["data"].decode("utf-8")}')
else:
message = server.recvMsg(notified_socket)
if message is False:
print(f"Closed connection from: {self.clients[notified_socket]['data'].decode('utf-8')}")
self.sockets_list.remove(notified_socket)
del self.clients[notified_socket]
continue
user = self.clients[notified_socket]
print(f'Recieved message from {user["data"].decode("utf-8")}: {message["data"].decode("utf-8")}')
for client_socket in self.clients:
if client_socket != notified_socket:
client_socket.send(user['header'] + user['data'] + message['header'] + message['data'])
for notified_socket in exception_sockets:
self.sockets_list.remove(notified_socket)
del self.clients[notified_socket]
def listen(self):
self.socket.listen()
print(f'Listening for connections on {self.addr}: {self.port}')
while True:
server.newSocketConnection()
#client, addr = self.socket.accept()
#client.settimeout(60)
#threading.Thread(target = self.newSocketConnection,args = (client,addr)).start()
def close(self):
self.socket.close()
def commands(self):
while True:
command = input()
if command.lower() in ['exit', 'end', 'quit', 'q']:
print('Closing session.....')
server.close(), sys.exit()
server = Server('127.0.0.1', 4545)
try:
server.listen()
except:
server.close()