请帮我设计一个基于C/S模式的聊天室的项目,给出各项目名称和各部分代码
时间: 2024-03-05 21:51:47 浏览: 25
好的,以下是一个基于C/S模式的聊天室项目的基本组成部分:
1. 服务器端:
- 项目名称:ChatServer
- 代码实现:
```python
import socket
import threading
class ChatServer:
def __init__(self, host, port):
self.host = host
self.port = port
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.clients = []
def start(self):
self.server.bind((self.host, self.port))
self.server.listen(5)
print("Chat server started on {}:{}".format(self.host, self.port))
while True:
conn, addr = self.server.accept()
client = Client(conn, addr, self)
client.start()
self.clients.append(client)
def broadcast(self, message, sender):
for client in self.clients:
if client != sender:
client.send(message)
class Client(threading.Thread):
def __init__(self, conn, addr, server):
threading.Thread.__init__(self)
self.conn = conn
self.addr = addr
self.server = server
def run(self):
while True:
try:
message = self.conn.recv(1024)
if message:
self.server.broadcast("{} says: {}".format(self.addr, message.decode("utf-8")), self)
else:
self.conn.close()
self.server.clients.remove(self)
return
except:
continue
def send(self, message):
self.conn.send(message.encode("utf-8"))
if __name__ == "__main__":
server = ChatServer("localhost", 5000)
server.start()
```
2. 客户端:
- 项目名称:ChatClient
- 代码实现:
```python
import socket
import threading
import tkinter
class ChatClient:
def __init__(self, host, port):
self.host = host
self.port = port
self.username = ""
self.gui = ChatGUI(self)
self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def connect(self):
self.client.connect((self.host, self.port))
self.gui.mainloop()
def send(self, message):
self.client.send("{}: {}".format(self.username, message).encode("utf-8"))
def receive(self, message):
self.gui.display_message(message.decode("utf-8"))
def set_username(self, username):
self.username = username
class ChatGUI(tkinter.Tk):
def __init__(self, client):
tkinter.Tk.__init__(self)
self.client = client
self.title("Chat Client")
self.geometry("400x300")
self.create_widgets()
def create_widgets(self):
self.message_text = tkinter.Text(self, state="disabled")
self.message_text.pack(fill="both", expand=True)
self.input_text = tkinter.Entry(self)
self.input_text.pack(side="left", fill="x", expand=True)
self.send_button = tkinter.Button(self, text="Send", command=self.send_message)
self.send_button.pack(side="right")
self.username_dialog()
def send_message(self):
message = self.input_text.get()
if message:
self.client.send(message)
self.input_text.delete(0, tkinter.END)
def display_message(self, message):
self.message_text.configure(state="normal")
self.message_text.insert(tkinter.END, message + "\n")
self.message_text.configure(state="disabled")
def username_dialog(self):
self.username_window = tkinter.Toplevel(self)
self.username_window.geometry("200x100")
self.username_label = tkinter.Label(self.username_window, text="Enter username:")
self.username_label.pack()
self.username_entry = tkinter.Entry(self.username_window)
self.username_entry.pack()
self.username_button = tkinter.Button(self.username_window, text="OK", command=self.set_username)
self.username_button.pack()
def set_username(self):
username = self.username_entry.get()
if username:
self.client.set_username(username)
self.username_window.destroy()
if __name__ == "__main__":
client = ChatClient("localhost", 5000)
client.connect()
```
这里提供的代码仅为基本实现,您可以根据实际需求进行修改和完善。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)