【发布时间】: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()
感谢您的阅读,任何帮助都非常感谢,祝您有美好的一天!
【问题讨论】: