Python Socket 立即关闭

时间:2021-04-24 01:47:10

标签: python python-3.x sockets server client-server

我正在尝试将客户端-服务器程序作为消息服务器类型的东西。当我运行程序时,它会立即关闭连接而无需等待和监听。它打印“成功绑定”和“侦听 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()

0 个答案:

没有答案
相关问题