使用开关停止在 python 中的专用线程上运行的函数

时间:2021-04-08 11:44:29

标签: python multithreading tkinter server switch-statement

我有以下问题:我目前正在我的程序中开发一个功能,您可以在其中运行您的计算机上的服务器套接字,以便客户端可以连接以进行简单的聊天。您只需输入所需的端口,然后单击开关将其打开,如下所示:

enter image description here

服务器脚本在单独的线程上运行良好,但我不知道如何在关闭开关时再次停止服务器。

的服务器和交换机代码

import socket
import threading
from tkinter import *


def server_func(port):
    host = ""

    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind((host, int(port)))
    server.listen()

    client_list = []
    user_names = []

    def send_message(message):
        for client in client_list:
            client.send(message)

    def handle_messages(client):
        while True:
            try:
                message = client.recv(1024)
                send_message(message)
            except:
                index = client_list.index(client)
                client_list.remove(client)
                client.close()
                user_name = user_names[index]
                send_message("{} left!".format(user_name).encode("ascii"))
                user_names.remove(user_name)
                break

    def receive_messages():
        while True:
            client, address = server.accept()
            print("Connected with {}".format(str(address)))

            client.send("NICK".encode("ascii"))
            user_name = client.recv(1024).decode("ascii")
            user_names.append(user_name)
            client_list.append(client)

            print("Username is {}.".format(user_name))
            send_message("{} joined.".format(user_name).encode("ascii"))
            client.send("Connected to server.".encode("ascii"))

            thread = threading.Thread(target=handle_messages, args= (client,))
            thread.start()

    receive_messages()


serv_window = Tk()
serv_window.resizable(0, 0)
serv_window.title("MyApp")

blank_net_font = Label(serv_window, text="MyApp", font="Arial 14 bold", width=30, 
pady=4, bg="grey")
blank_net_font.grid(row=0, column=0)

network_font = Label(serv_window, text="Network", font="Arial 12 bold", bg="light 
grey", width=36, pady=4)
network_font.grid(row=1, column=0)

network_window = LabelFrame(serv_window)
network_window.grid(row=2, column=0)

global is_on
is_on = True

server_label = Label(network_window, text="Server is OFF", font="Arial 12 bold", 
width=11)
server_label.grid(row=0, column=0)


def server_switch():
    global is_on
    server_thread = threading.Thread(target=server_func, args=(port_entry.get(),))
    if is_on:
        on_button.configure(image=on)
        server_label.configure(text="Server is ON")
        is_on = False
        server_thread.start()
    else:
        on_button.configure(image=off)
        server_label.configure(text="Server is OFF")
        is_on = True


port_label = Label(network_window, text="PORT", font="Arial 12 bold")
port_label.grid(row=2, column=0)

port_entry = Entry(network_window, font="Arial 12", width=6, bg="light grey")
port_entry.grid(row=3, column=0)

on = PhotoImage(file="on_switch.gif", master=serv_window)
off = PhotoImage(file="off_switch.gif", master=serv_window)

on_button = Button(network_window, image=off, bd=0, command=server_switch)
on_button.grid(row=1, column=0)

serv_window.mainloop()

客户端代码

import socket
import threading

user_name = input("Choose your username: ")

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("server_ip", port))


def receive():
    while True:
        try:
            message = client.recv(1024).decode("ascii")
            if message == "NICK":
                client.send(user_name.encode("ascii"))
            else:
                print(message)
        except:
            print("An error occurred")
            client.close()
            break


def write():
    while True:
        message = "{}: {}".format(user_name, input(""))
        client.send(message.encode("ascii"))


receive_thread = threading.Thread(target=receive)
receive_thread.start()

write_thread = threading.Thread(target=write)
write_thread.start()  

关闭开关的图像 enter image description here

开关图像 enter image description here

0 个答案:

没有答案
相关问题