python 聊天套接字的多线程问题

问题描述 投票:0回答:0

嘿,我正在尝试用 python 创建聊天,除了我的目标是同时启动我的图形界面和我的功能

chat_page
,还有我的功能允许读取我在服务器上的数据
reicive_message
,我尝试使用线程,但出现错误
 File "e:\NSI\pychat\tkclient.py", line 27, in <lambda> btn_connect = Button(home_fen,text="Connecter",width=15, command= lambda: connected(nom_input.get())).place_configure(x=125,y=250) File "e:\NSI\pychat\tkclient.py", line 51, in connected client_socket.connect((host, port)) OSError: [WinError 10056] A connection request has been made on an already connected socket
.

pouvez vous m'aider ? si vous avez d'autre idée que thread, par example avec after n'hesité pas

import socket
from tkinter import *
from outiltkinter import outilcanvas
from message import chat_message
import time
import threading


host = "127.0.0.1"
port = 9001
home_fen = ""
name = "clem"
nb_message = 0
def home_fen1():
    global home_fen,name
    home_fen = Tk()
    nom = StringVar()
    home_fen.title("PyChat")
    home_fen.geometry("400x400")        
    test = Canvas(home_fen, width=400, height=400, background="white", highlightthickness=0)
    test.place(x=0, y=0)
    label = Label(home_fen, text="Bienvenue sur PyChat",font=("calibre",24)).place(x=50,y=50)
    Label(home_fen, text="Veuillez rentré votre nom ! ",font=("calibre",10)).place(x=110,y=126)
    nom_input = Entry(home_fen,textvariable=nom,font=("calibre",10),bg="red")
    nom_input.place(x=110,y=175)
    o = outilcanvas(home_fen,test)
    btn_connect = Button(home_fen,text="Connecter",width=15, command= lambda: connected(nom_input.get())).place_configure(x=125,y=250)

    home_fen.mainloop()
def receive_messages(client_socket, frame):
    global nb_message, name
    donnees_recues = client_socket.recv(1024).decode()
    for i in range(len(donnees_recues)):
        if donnees_recues[i] == "@":
            user = donnees_recues[i+1:]
            break
    if donnees_recues and user != name:
       chat_message(donnees_recues, frame)  


def connected(name):
    global client_socket
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        # connexion au serveur
        client_socket.connect((host, port))
        print('Connexion au serveur réussie !')
        launch_chat()
    except Exception as e:
        print(f'Erreur de connexion au serveur: {e}')
        client_socket.connect((host, port))
    print("fin")
    
def launch_chat():
    global client_socket
    thread2 = threading.Thread(target=receive_messages, args=(client_socket, chat_box))
    thread2.start()
    chat_page(client_socket,name)

def chat_page(client_socket,name):
    home_fen.destroy()
    chat_fen = Tk()
    chat_fen.title("PyChat")
    chat_fen.geometry("1300x700")
    message = StringVar()        
    test = Canvas(chat_fen, width=1500, height=800, background="white", highlightthickness=0)
    title = Label(chat_fen, text="PyChat",font=("calibre",40,"bold"))
    title.place(x=10,y=10)
    test.place(x=0, y=0)
    
    chat_box = Frame(chat_fen, bg='ivory')
    chat_box.place(x=310,y=110,width=950,height=500)
    chat_entry = Entry(chat_fen,textvariable=message,font=("calibre",10),bg="red")
    chat_entry.place(x=310,y=610,width=800,height=50)

    
    btn_send = Button(chat_fen,text="Envoyer !", command= lambda: send_message(client_socket, name,chat_entry.get(),chat_box))
    btn_send.place(x=1110,y=610,width=150,height=50)
    o = outilcanvas(chat_fen,test)
    

    chat_fen.mainloop()



def send_message(client_socket, name,message,frame):
    global nb_message
    fmessage = f"{message} #{nb_message} @{name}"
    client_socket.send(fmessage.encode("utf-8"))
    donnees_recues = client_socket.recv(1024).decode()
    if donnees_recues:
        nb_message = nb_message +1 
    chat_message(fmessage,frame)

home_fen1()
python sockets tkinter chat python-multithreading
© www.soinside.com 2019 - 2024. All rights reserved.