【问题标题】:Python socket chat server only listens to one clientPython socket 聊天服务器只监听一个客户端
【发布时间】:2021-01-20 22:20:42
【问题描述】:

您好,我正在使用 python 和套接字开发一个自制的聊天服务器。我试图在没有教程的情况下完成整个事情,但我已经坚持了大约 4 天,并决定寻求一些帮助。

我已经走得够远了,服务器可以让客户端连接到它,它可以在那里存储数据,接收和发送消息,我的问题是,在连接两个客户端并发送大约 4 条消息后,服务器停止接收来自两个客户之一。但是不能再发送消息的客户端仍然可以看到来自其他客户端的传入消息

这是我的服务器的代码

import socket
import threading


HEADER = 100
PORT = 1234
SERVER = socket.gethostbyname(socket.gethostname())
ADDR = (SERVER, PORT)
FORMAT = "utf-8"
DISCONNECT_MESSAGE = "DISCONNECT"

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(ADDR)

#list of all connected clients
cl = []

#is run when i new client connects
def handle_client(conn, addr):
    print(f"[NEW CONNECTION] {addr} connected.")
    
    connected = True
    
    while connected:

            msg = conn.recv(2048).decode(FORMAT)

            if msg == DISCONNECT_MESSAGE:
                 connected = False

            for i in range(threading.activeCount() - 1):
                                    
                print("          ")

                conn = cl[i]
                    
                print("          ")

                conn.send(msg.encode(FORMAT))
                
    conn.close()
        

#scans for new clients    
def start():
    server.listen(5)
    print(f"[LISTENING] Server is listening on {SERVER}")
    
    while True:
        conn, addr = server.accept()
        client_con = threading.Thread(target=handle_client, args=(conn, addr))
        client_con.start()
        print(f"[ACTIVE CONNECTIONS] {threading.activeCount() - 1}")     
        print("   ")
        #adds new client to clients list
        cl.append(conn)
        
        
print("[STARTING] server is starting...")
start()

这是我的客户的代码

import socket
import threading


HEADER = 100
PORT = 1234
FORMAT = "utf-8"
DISCONNECT_MESSAGE = "DISCONNECT"
SERVER =  socket.gethostbyname(socket.gethostname())
ADDR = (SERVER,PORT) 
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(ADDR)


#get users name that is show befor message's
def get_info():
    
    name = input("whats your name: ")
    NAME = name
    NAME = NAME + "-"
    

    
    return NAME

#sends messags's to server
def send_msg():
    
    NAME = get_info()

    while True:
        
        print("    ")
        msg = input("type your message: ")
        print("    ")
        
        msg = NAME + " " + msg
        
        message = msg.encode(FORMAT)

        client.send(message)
        
#recives messages from server 
def recs():
    while True:
        print("  ")
        
        msg_rcv = client.recv(5000)
        print(msg_rcv.decode(FORMAT))
        
        print("  ")
          

send = threading.Thread(target=send_msg)
rec = threading.Thread(target=recs)

rec.start()
send.start()

感谢您的阅读,任何帮助都非常感谢,祝您有美好的一天!

【问题讨论】:

    标签: python sockets chat


    【解决方案1】:

    事实证明,在制作流程图以帮助我可视化可能发生问题的位置后,我终于找到了我的问题。

    问题出在我的服务器上,与这段代码中的 con 变量有关

                msg = conn.recv(2048).decode(FORMAT)
              
    
                if msg == DISCONNECT_MESSAGE:
                     connected = False
    
                for i in range(threading.activeCount() - 1):
                                        
                    print("          ")
    
                    conn = cl[i]
                        
                    print("          ")
                    
                    conns.sendall(msg.encode(FORMAT))
    
    

    我只需要使用不同的 var 来发送消息,所以这里是工作服务器代码

    import socket
    import threading
    
    
    HEADER = 100
    PORT = 1234
    SERVER = socket.gethostbyname(socket.gethostname())
    ADDR = (SERVER, PORT)
    FORMAT = "utf-8"
    DISCONNECT_MESSAGE = "DISCONNECT"
    
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(ADDR)
    
    #list of all connected clients
    cl = []
    
    #is run when i new client connects
    def handle_client(conn, addr):
        print(f"[NEW CONNECTION] {addr} connected.")
        
        connected = True
        
        while connected:
                
                msg = conn.recv(2048).decode(FORMAT)
                print(f"[MSG IS]--> {msg}") 
    
                if msg == DISCONNECT_MESSAGE:
                     connected = False
    
                for i in range(threading.activeCount() - 1):
                                        
                    print("          ")
    
                    conns = cl[i]
                        
                    print("          ")
                    
                    conns.sendall(msg.encode(FORMAT))
                    
        #conn.close()
            
    
    #scans for new clients    
    def start():
        server.listen(5)
        print(f"[LISTENING] Server is listening on {SERVER}")
        
        while True:
            conn, addr = server.accept()
            client_con = threading.Thread(target=handle_client, args=(conn, addr))
            client_con.start()
            print(f"[ACTIVE CONNECTIONS] {threading.activeCount() - 1}")     
            print("   ")
            #adds new client to clients list
            cl.append(conn)
            
            
    print("[STARTING] server is starting...")
    start()
    
    
    #we need to find a way to send a message from a client to all other clients!
    
    

    我所要做的就是将其中一个 conn 更改为 conns,这样它就不会混淆了!

    【讨论】:

      猜你喜欢
      • 2015-06-27
      • 2014-04-18
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多