你能用python写出一个基于tcp协议的简易聊天机械人代码吗?如果可以能分为客户端和服务器吗?且支持多个客户端同时连接。
时间: 2023-12-22 22:04:59 浏览: 68
基于tcp的简单聊天室代码
当然可以!以下是基于TCP协议的简易聊天机器人的Python代码,分为客户端和服务器端,支持多个客户端同时连接。
服务器端代码:
```python
import socket
import threading
# 服务器IP和端口号
SERVER_HOST = '127.0.0.1'
SERVER_PORT = 12345
# 定义一个列表,用于存储所有客户端连接
clients = []
def handle_client(client_socket, client_address):
"""
处理客户端连接的函数
"""
print(f"[NEW CONNECTION] {client_address} connected.")
clients.append(client_socket) # 将客户端连接添加到列表中
while True:
try:
# 接收客户端发来的消息
message = client_socket.recv(1024).decode('utf-8')
if message:
print(f"[{client_address}] {message}")
broadcast(message, client_socket)
else:
# 如果客户端关闭了连接,就从列表中删除这个连接
clients.remove(client_socket)
print(f"[DISCONNECTED] {client_address} disconnected.")
break
except:
# 如果客户端异常断开连接,也从列表中删除这个连接
clients.remove(client_socket)
print(f"[DISCONNECTED] {client_address} disconnected.")
break
def broadcast(message, sender):
"""
将消息广播给所有客户端
"""
for client in clients:
if client != sender:
try:
client.send(message.encode('utf-8'))
except:
clients.remove(client)
def start_server():
"""
启动服务器
"""
# 创建一个TCP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定IP和端口号
server_socket.bind((SERVER_HOST, SERVER_PORT))
# 开始监听
server_socket.listen()
print(f"[LISTENING] Server is listening on {SERVER_HOST}:{SERVER_PORT}.")
while True:
# 接受客户端连接
client_socket, client_address = server_socket.accept()
# 创建一个线程处理客户端连接
client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
client_thread.start()
if __name__ == '__main__':
start_server()
```
客户端代码:
```python
import socket
import threading
# 服务器IP和端口号
SERVER_HOST = '127.0.0.1'
SERVER_PORT = 12345
# 用户名
USERNAME = input("Enter your username: ")
def receive():
"""
接收服务器消息的函数
"""
while True:
try:
# 接收服务器发来的消息
message = client_socket.recv(1024).decode('utf-8')
if message:
print(message)
except:
# 如果服务器异常断开连接,就退出程序
client_socket.close()
break
def send():
"""
发送消息给服务器的函数
"""
while True:
message = input('')
if message == 'quit':
# 如果用户输入quit,就关闭客户端连接并退出程序
client_socket.close()
break
else:
# 将消息发送给服务器
message = f"{USERNAME}: {message}"
client_socket.send(message.encode('utf-8'))
def start_client():
"""
启动客户端
"""
# 创建一个TCP套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
client_socket.connect((SERVER_HOST, SERVER_PORT))
# 发送用户名给服务器
client_socket.send(USERNAME.encode('utf-8'))
# 创建两个线程,一个用于接收服务器消息,一个用于发送消息给服务器
receive_thread = threading.Thread(target=receive)
receive_thread.start()
send_thread = threading.Thread(target=send)
send_thread.start()
if __name__ == '__main__':
start_client()
```
使用方法:
1. 运行服务器端代码。
2. 运行多个客户端代码,并输入不同的用户名。
3. 在任意一个客户端上输入消息,所有客户端都会收到同样的消息。
注:以上代码仅为示例代码,没有进行输入合法性检查等安全性措施,请勿直接用于生产环境。
阅读全文