简易多人聊天程序客户端(cli01)通过TCP(或UDP)连接到聊天服务器(serv)进行聊天。1. 基本功能:客户1发送数据到服务器,服务器转发到客户2;连接信息需要放到配置文件init.txt 中(例如:127.0.0.1|8080),通过读取配置文件,客户端连接服务器端。 2. 外加功能:多人聊天的功能,能显示谁在什么时间说了什么话。服务器端可以显示当前在线人数。
时间: 2024-03-26 12:36:21 浏览: 78
好的,这是一个比较简单的多人聊天程序,以下是大致的实现思路:
1. 客户端(cli01)通过读取配置文件(init.txt)获取服务器地址和端口,并建立TCP连接;
2. 客户端进入聊天室后,可以发送消息到服务器端;
3. 服务器端接收到客户端的消息后,将其转发给所有其他在线客户端;
4. 服务器端需要记录每条消息的发送者、发送时间和内容,并可以在客户端列表中显示当前在线人数;
5. 客户端需要显示所有收到的消息和当前在线人数。
下面是一个简单的 Python 实现代码,仅供参考:
服务器端代码:
```python
import socket
import threading
import time
# 存放所有在线客户端的信息
clients = []
# 处理客户端消息的线程函数
def handle_client(client_socket, addr):
while True:
try:
# 接收客户端消息
data = client_socket.recv(1024)
if not data:
print('Client disconnected:', addr)
clients.remove(client_socket)
break
else:
# 记录发送时间和发送者
timestamp = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
message = '[{}][{}]: {}'.format(timestamp, addr, data.decode())
print(message)
# 转发消息给其他客户端
for c in clients:
if c != client_socket:
c.sendall(message.encode())
except:
clients.remove(client_socket)
break
# 启动服务器
def start_server(host, port):
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((host, port))
server_socket.listen(5)
print('Server started on {}:{}'.format(host, port))
while True:
client_socket, addr = server_socket.accept()
print('Client connected:', addr)
# 将客户端加入在线列表
clients.append(client_socket)
# 处理客户端消息的线程
t = threading.Thread(target=handle_client, args=(client_socket, addr))
t.start()
if __name__ == '__main__':
# 从配置文件中读取服务器地址和端口
with open('init.txt', 'r') as f:
host, port = f.readline().strip().split('|')
port = int(port)
start_server(host, port)
```
客户端代码:
```python
import socket
import threading
import time
# 处理接收消息的线程函数
def receive_msg(client_socket):
while True:
try:
data = client_socket.recv(1024)
if not data:
break
else:
print(data.decode())
except:
break
# 启动客户端
def start_client(host, port):
# 连接服务器
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((host, port))
# 启动接收消息的线程
t = threading.Thread(target=receive_msg, args=(client_socket,))
t.start()
# 发送消息
while True:
msg = input('>')
if not msg:
break
# 发送消息给服务器
client_socket.sendall(msg.encode())
client_socket.close()
if __name__ == '__main__':
# 从配置文件中读取服务器地址和端口
with open('init.txt', 'r') as f:
host, port = f.readline().strip().split('|')
port = int(port)
start_client(host, port)
```
需要注意的是,以上代码仅为示例代码,实际上还有很多细节需要处理,例如客户端与服务器端的异常处理、消息的格式化等等。
阅读全文