我有以下问题:我目前正在我的程序中开发一个功能,您可以在其中运行您的计算机上的服务器套接字,以便客户端可以连接以进行简单的聊天。您只需输入所需的端口,然后单击开关将其打开,如下所示:
服务器脚本在单独的线程上运行良好,但我不知道如何在关闭开关时再次停止服务器。
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()