根据提示写出一份代码:一、使用socket实现聊天室 1、功能需求: 本设计主要实现一个局域网聊天工具的设计。设计主要分为两部分,客户端部分和服务器部分,可以是终端字符界面,客户端登陆到服务器聊天后,可以在聊天室内与其他用户交流(这个聊天室中的任何一个用户输入一段字符后,室内的其他用户都可以看到这句话)。 (1)客户端输入服务器 IP 和端口号 (2)服务器成功启动 (3)每个客户端可以找到服务器,并可以与服务器进行连接; (4)客户端与服务器可以实现通讯 (5) 支持用户管理,用户名/密码注册和登录; (6) 实现图形界面,要求程序具备简单的菜单功能,根据用户的输入,执行相应的操作,在菜单界面,必须显示程序的名称、版本信息,开发者的名字、班级、学号等信息。
时间: 2023-06-16 22:06:42 浏览: 38
以下是使用Python语言和socket实现一个简单的聊天室的代码:
服务器端代码:
```python
import socket
import threading
# 服务器地址和端口
SERVER_IP = '127.0.0.1'
SERVER_PORT = 9999
# 存储客户端的连接
clients = []
def handle_client(client_socket):
"""
处理每个客户端的连接
"""
while True:
try:
# 接收客户端的消息
data = client_socket.recv(1024).decode('utf-8')
if data:
print(f'Received message: {data}')
# 将消息转发给其他客户端
for c in clients:
if c != client_socket:
c.sendall(data.encode('utf-8'))
else:
# 客户端断开连接
print(f'Client {client_socket.getpeername()} disconnected')
clients.remove(client_socket)
client_socket.close()
break
except Exception as e:
print(f'Error occurred: {e}')
clients.remove(client_socket)
client_socket.close()
break
def start_server():
"""
启动服务器
"""
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:
# 绑定服务器地址和端口
server_socket.bind((SERVER_IP, SERVER_PORT))
# 开始监听
server_socket.listen()
print(f'Server started on {SERVER_IP}:{SERVER_PORT}')
while True:
# 接受客户端连接
client_socket, client_address = server_socket.accept()
print(f'New client connected: {client_address}')
# 将客户端连接存储起来
clients.append(client_socket)
# 启动线程处理客户端连接
threading.Thread(target=handle_client, args=(client_socket,)).start()
if __name__ == '__main__':
start_server()
```
客户端代码:
```python
import socket
import threading
# 服务器地址和端口
SERVER_IP = '127.0.0.1'
SERVER_PORT = 9999
# 客户端用户名
username = None
def handle_server(s):
"""
处理服务器发送的消息
"""
while True:
try:
# 接收服务器的消息
data = s.recv(1024).decode('utf-8')
if data:
print(data)
except Exception as e:
print(f'Error occurred: {e}')
s.close()
break
def send_message(s):
"""
发送消息给服务器
"""
while True:
try:
# 获取用户输入
message = input()
if message:
# 发送消息给服务器
s.sendall(f'{username}: {message}'.encode('utf-8'))
except Exception as e:
print(f'Error occurred: {e}')
s.close()
break
def register(s):
"""
用户注册
"""
global username
while True:
# 获取用户名和密码
username = input('Enter your username: ')
password = input('Enter your password: ')
# 发送注册请求给服务器
s.sendall(f'REGISTER {username} {password}'.encode('utf-8'))
# 接收服务器响应
response = s.recv(1024).decode('utf-8')
if response == 'OK':
print('Registration successful')
break
else:
print('Registration failed')
def login(s):
"""
用户登录
"""
global username
while True:
# 获取用户名和密码
username = input('Enter your username: ')
password = input('Enter your password: ')
# 发送登录请求给服务器
s.sendall(f'LOGIN {username} {password}'.encode('utf-8'))
# 接收服务器响应
response = s.recv(1024).decode('utf-8')
if response == 'OK':
print('Login successful')
break
else:
print('Login failed')
def start_client():
"""
启动客户端
"""
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
# 连接服务器
s.connect((SERVER_IP, SERVER_PORT))
# 用户注册或登录
while True:
choice = input('Enter "r" to register or "l" to login: ')
if choice == 'r':
register(s)
break
elif choice == 'l':
login(s)
break
else:
print('Invalid choice')
# 启动线程处理服务器发送的消息
threading.Thread(target=handle_server, args=(s,)).start()
# 启动线程发送消息给服务器
threading.Thread(target=send_message, args=(s,)).start()
if __name__ == '__main__':
start_client()
```
注:该代码只是一个简单的示例,没有进行用户名和密码的加密处理,实际应用中需要进行加密处理。