基于socket的网络聊天室完整代码
时间: 2023-09-16 08:06:38 浏览: 36
以下是基于socket的网络聊天室的完整代码,包括服务器端和客户端:
服务器端代码:
```python
import socket
import threading
# 创建一个socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名和端口号
host = socket.gethostname()
port = 9999
# 绑定端口号
server_socket.bind((host, port))
# 设置最大连接数,超过后排队
server_socket.listen(5)
# 存储所有客户端socket连接
client_sockets = []
# 存储所有客户端名称
client_names = []
def broadcast(msg, sender):
"""
广播消息给所有客户端
"""
for client in client_sockets:
if client != sender:
try:
client.send(msg.encode())
except:
# 如果发送失败,则说明该客户端已经断开连接,需要将其从列表中移除
index = client_sockets.index(client)
client_sockets.remove(client)
client.close()
name = client_names[index]
client_names.remove(name)
print(f"Disconnected from {name}")
broadcast(f"{name} has left the chat room.", server_socket)
def handle_client(client_socket):
"""
处理每个客户端的连接
"""
while True:
try:
msg = client_socket.recv(1024).decode()
broadcast(msg, client_socket)
except:
# 如果接收失败,则说明该客户端已经断开连接,需要将其从列表中移除
index = client_sockets.index(client_socket)
client_sockets.remove(client_socket)
client_socket.close()
name = client_names[index]
client_names.remove(name)
print(f"Disconnected from {name}")
broadcast(f"{name} has left the chat room.", server_socket)
break
while True:
# 等待客户端连接
client_socket, client_address = server_socket.accept()
print(f"Connected from {client_address}")
client_socket.send("Enter your name:".encode())
# 接收客户端名称
name = client_socket.recv(1024).decode()
client_names.append(name)
client_sockets.append(client_socket)
print(f"Client name is {name}")
broadcast(f"{name} has joined the chat room.", server_socket)
client_socket.send("Welcome to the chat room. Type 'exit' to leave.".encode())
# 创建一个新线程,处理该客户端的连接
client_thread = threading.Thread(target=handle_client, args=(client_socket,))
client_thread.start()
```
客户端代码:
```python
import socket
import threading
# 创建一个socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名和端口号
host = socket.gethostname()
port = 9999
# 连接服务器
client_socket.connect((host, port))
# 接收服务器发送的欢迎消息
msg = client_socket.recv(1024).decode()
print(msg)
# 输入客户端名称
name = input()
client_socket.send(name.encode())
# 接收服务器发送的欢迎消息
msg = client_socket.recv(1024).decode()
print(msg)
def receive():
"""
接收服务器发送的消息
"""
while True:
try:
msg = client_socket.recv(1024).decode()
print(msg)
except:
# 如果接收失败,则说明服务器断开了连接,需要退出程序
client_socket.close()
print("Disconnected from the server.")
break
def send():
"""
发送消息给服务器
"""
while True:
msg = input()
client_socket.send(msg.encode())
if msg == "exit":
client_socket.close()
break
# 创建两个线程,分别处理接收和发送
receive_thread = threading.Thread(target=receive)
receive_thread.start()
send_thread = threading.Thread(target=send)
send_thread.start()
```
使用方法:
1. 运行服务器端代码
2. 运行多个客户端代码,输入不同的名称
3. 在客户端之间互相发送消息,所有客户端都可以看到消息
4. 输入"exit"退出聊天室