python窗口化聊天
时间: 2023-06-22 12:19:12 浏览: 52
要实现 Python 的窗口化聊天功能,可以使用 Tkinter GUI 工具包和 Socket 编程实现。下面是一个简单的示例代码,可以实现两个客户端之间的窗口化聊天:
1. 服务端代码:
```python
import socket
import threading
import tkinter as tk
# 创建 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名和端口号
host = socket.gethostname()
port = 12345
# 绑定端口号
server_socket.bind((host, port))
# 设置最大连接数,超过后排队
server_socket.listen(5)
# 创建窗口
window = tk.Tk()
window.title("Server")
# 创建消息列表
message_list = tk.Listbox(window, height=15, width=50)
message_list.pack(padx=10, pady=10)
# 创建消息输入框和发送按钮
input_frame = tk.Frame(window)
input_frame.pack(padx=10, pady=10)
input_field = tk.Entry(input_frame, width=40)
input_field.pack(side=tk.LEFT)
send_button = tk.Button(input_frame, text="发送")
# 定义向客户端发送消息的函数
def send_message():
message = input_field.get()
input_field.delete(0, tk.END)
message_list.insert(tk.END, f"Server: {message}")
for client_socket in client_sockets:
client_socket.send(message.encode())
# 绑定发送按钮的点击事件
send_button.config(command=send_message)
send_button.pack(side=tk.LEFT)
# 定义处理客户端连接的函数
def handle_client(client_socket, addr):
# 向客户端发送欢迎消息
message = "欢迎访问服务器!"
client_socket.send(message.encode())
while True:
# 接收客户端发送的消息
data = client_socket.recv(1024)
# 如果客户端发送了空消息,说明客户端已经关闭连接
if not data:
break
# 输出客户端发送的消息
message = f"客户端 {addr} 发送的消息:{data.decode()}"
message_list.insert(tk.END, message)
# 向其他客户端发送回复消息
for other_socket in client_sockets:
if other_socket != client_socket:
other_socket.send(message.encode())
# 关闭连接
client_socket.close()
message_list.insert(tk.END, f"客户端 {addr} 已经退出!")
# 定义客户端列表
client_sockets = []
while True:
# 等待客户端连接
client_socket, addr = server_socket.accept()
print(f"连接地址: {addr}")
# 添加客户端到客户端列表
client_sockets.append(client_socket)
# 创建一个新线程处理客户端连接
thread = threading.Thread(target=handle_client, args=(client_socket, addr))
thread.daemon = True
thread.start()
# 进入 Tkinter 主循环
window.mainloop()
```
2. 客户端代码:
```python
import socket
import threading
import tkinter as tk
# 创建 socket 对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名和端口号
host = socket.gethostname()
port = 12345
# 连接服务端
client_socket.connect((host, port))
# 创建窗口
window = tk.Tk()
window.title("Client")
# 创建消息列表
message_list = tk.Listbox(window, height=15, width=50)
message_list.pack(padx=10, pady=10)
# 创建消息输入框和发送按钮
input_frame = tk.Frame(window)
input_frame.pack(padx=10, pady=10)
input_field = tk.Entry(input_frame, width=40)
input_field.pack(side=tk.LEFT)
send_button = tk.Button(input_frame, text="发送")
# 定义向服务端发送消息的函数
def send_message():
message = input_field.get()
input_field.delete(0, tk.END)
message_list.insert(tk.END, f"Client: {message}")
client_socket.send(message.encode())
# 绑定发送按钮的点击事件
send_button.config(command=send_message)
send_button.pack(side=tk.LEFT)
# 定义接收服务端消息的函数
def recv_message():
while True:
# 接收服务端发送的消息
data = client_socket.recv(1024)
# 如果服务端发送了空消息,说明服务端已经关闭连接
if not data:
break
# 输出服务端发送的消息
message = data.decode()
message_list.insert(tk.END, message)
# 关闭连接
client_socket.close()
message_list.insert(tk.END, "与服务器的连接已经断开!")
# 创建一个新线程接收服务端消息
thread = threading.Thread(target=recv_message)
thread.daemon = True
thread.start()
# 进入 Tkinter 主循环
window.mainloop()
```
在客户端连接到服务端后,客户端可以在窗口中输入任意字符串作为消息,服务端和其他客户端会收到这条消息。如果客户端关闭窗口,就会关闭连接并退出程序。