写一个可以用于聊天的基于python的socket通信,可以多线程处理,有记录日志,与成熟的登录系统
时间: 2023-05-30 14:02:23 浏览: 53
的聊天室程序。
以下是一个基本的聊天室程序,包含了多线程处理和记录日志的功能,但没有成熟的登录系统。需要注意的是,在实际使用中,需要在服务器端进行更加严格的身份验证和安全措施。
Server端代码:
```python
import socket
import threading
import logging
logging.basicConfig(level=logging.DEBUG, format='[%(levelname)s] %(asctime)s %(message)s')
class ChatServer:
def __init__(self, host, port):
self.host = host
self.port = port
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server_socket.bind((self.host, self.port))
self.server_socket.listen(5)
self.clients = []
logging.info(f'Server started on {self.host}:{self.port}')
def broadcast(self, message, sender):
for client in self.clients:
if client != sender:
client.send(message)
def handle_client(self, client_socket, client_address):
logging.info(f'New connection from {client_address}')
self.clients.append(client_socket)
while True:
try:
message = client_socket.recv(1024)
if message:
logging.info(f'Received message: {message.decode()}')
self.broadcast(message, client_socket)
else:
logging.info(f'{client_address} disconnected')
client_socket.close()
self.clients.remove(client_socket)
break
except Exception as e:
logging.warning(f'Error: {str(e)}')
client_socket.close()
self.clients.remove(client_socket)
break
def start(self):
while True:
client_socket, client_address = self.server_socket.accept()
client_thread = threading.Thread(target=self.handle_client, args=(client_socket, client_address))
client_thread.daemon = True
client_thread.start()
if __name__ == '__main__':
chat_server = ChatServer('localhost', 8000)
chat_server.start()
```
Client端代码:
```python
import socket
import threading
class ChatClient:
def __init__(self, host, port):
self.host = host
self.port = port
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client_socket.connect((self.host, self.port))
def send_message(self):
while True:
message = input()
self.client_socket.send(message.encode())
def receive_message(self):
while True:
message = self.client_socket.recv(1024)
print(message.decode())
def start(self):
send_thread = threading.Thread(target=self.send_message)
send_thread.daemon = True
send_thread.start()
receive_thread = threading.Thread(target=self.receive_message)
receive_thread.daemon = True
receive_thread.start()
send_thread.join()
receive_thread.join()
if __name__ == '__main__':
chat_client = ChatClient('localhost', 8000)
chat_client.start()
```
在控制台运行Server端代码,然后打开多个控制台运行Client端代码,就可以进行聊天了。聊天记录可以在Server端的日志中查看。