找回密码
 中文实名注册
查看: 89|回复: 1

聊天室

[复制链接]

709

主题

1103

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
21270
发表于 2025-2-16 16:38:05 | 显示全部楼层 |阅读模式
[Python] 纯文本查看 复制代码
import socket
import threading
import tkinter as tk
from tkinter import simpledialog, messagebox
# 单独导入 scrolledtext 模块
from tkinter import scrolledtext

# 全局变量
client = None
nickname = None

# 接收服务器消息


def receive():
    while True:
        try:
            # 接收服务器消息
            message = client.recv(1024).decode('utf-8')
            if message == 'NICK':
                client.send(nickname.encode('utf-8'))
            else:
                chat_box.insert(tk.END, message + '\n')
        except:
            # 发生错误,关闭连接
            messagebox.showerror("错误", "与服务器的连接已断开!")
            client.close()
            break

# 发送消息到服务器


def send_message(event=None):
    message = input_box.get()
    input_box.delete(0, tk.END)
    if message:
        client.send(f'{nickname}: {message}'.encode('utf-8'))

# 连接到服务器


def connect():
    global client, nickname
    server_ip = ip_entry.get()
    if not server_ip:
        messagebox.showerror("错误", "请输入服务器IP地址!")
        return

    try:
        nickname = simpledialog.askstring("昵称", "请输入你的昵称:")
        if nickname:
            client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            client.connect((server_ip, 58588))

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

            connect_button.config(state=tk.DISABLED)
            ip_entry.config(state=tk.DISABLED)
    except:
        messagebox.showerror("错误", "无法连接到服务器!")


# 创建主窗口
root = tk.Tk()
root.title("客户端")

# 创建服务器IP输入框
ip_label = tk.Label(root, text="服务器IP:")
ip_label.pack(pady=5)
ip_entry = tk.Entry(root)
ip_entry.pack(pady=5)

# 创建连接按钮
connect_button = tk.Button(root, text="连接", command=connect)
connect_button.pack(pady=10)

# 创建滚动文本框
chat_box = scrolledtext.ScrolledText(root, width=40, height=20)
chat_box.pack(padx=10, pady=10)

# 创建输入框
input_box = tk.Entry(root, width=30)
input_box.pack(pady=10)
input_box.bind("<Return>", send_message)

# 创建发送按钮
send_button = tk.Button(root, text="发送", command=send_message)
send_button.pack(pady=10)

# 运行主循环
root.mainloop()
回复

使用道具 举报

709

主题

1103

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
21270
 楼主| 发表于 2025-2-16 16:49:47 | 显示全部楼层
[Python] 纯文本查看 复制代码
import socket
import threading
import tkinter as tk
from tkinter import scrolledtext

# 服务器配置
HOST = '192.168.3.3'
PORT = 58588

# 创建服务器套接字
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((HOST, PORT))
server.listen()

# 存储客户端连接和昵称
clients = []
nicknames = []

# 广播消息给所有客户端


def broadcast(message):
    for client in clients:
        client.send(message)

# 处理客户端连接


def handle(client):
    while True:
        try:
            # 接收客户端消息
            message = client.recv(1024)
            broadcast(message)
        except:
            # 客户端断开连接
            index = clients.index(client)
            clients.remove(client)
            client.close()
            nickname = nicknames[index]
            nicknames.remove(nickname)
            broadcast(f'{nickname} 已离开聊天室!'.encode('utf-8'))
            break

# 接收客户端连接


def receive():
    while True:
        client, address = server.accept()
        print(f'连接地址: {str(address)}')

        # 接收客户端昵称
        client.send('NICK'.encode('utf-8'))
        nickname = client.recv(1024).decode('utf-8')
        nicknames.append(nickname)
        clients.append(client)

        print(f'客户端昵称: {nickname}')
        broadcast(f'{nickname} 已加入聊天室!'.encode('utf-8'))
        client.send('已连接到服务器!'.encode('utf-8'))

        # 为每个客户端创建一个线程
        thread = threading.Thread(target=handle, args=(client,))
        thread.start()


# 创建主窗口
root = tk.Tk()
root.title("服务器")

# 创建滚动文本框
chat_box = scrolledtext.ScrolledText(root, width=40, height=20)
chat_box.pack(padx=10, pady=10)

# 启动接收线程
receive_thread = threading.Thread(target=receive)
receive_thread.start()

# 运行主循环
root.mainloop()
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 中文实名注册

本版积分规则

小黑屋|东台市机器人学会 ( 苏ICP备2021035350号-1;苏ICP备2021035350号-2;苏ICP备2021035350号-3 )

GMT+8, 2025-3-14 22:56 , Processed in 0.039988 second(s), 28 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表