写一个可以用于聊天的基于python的socket通信,可以多线程处理,有记录日志,有成熟的登录系统
时间: 2023-05-30 11:02:24 浏览: 53
这是一份基于Python的socket通信代码,可以用于聊天,并支持多线程处理、记录日志和成熟的登录系统。以下是代码:
```
import socket
import threading
import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(message)s')
class ClientHandler(threading.Thread):
def __init__(self, client_socket, client_address):
threading.Thread.__init__(self)
self.client_socket = client_socket
self.client_address = client_address
self.username = None
def run(self):
logging.debug(f"Connection from {self.client_address} has been established.")
self.login()
self.chat()
self.client_socket.close()
logging.debug(f"Connection from {self.client_address} has been closed.")
def login(self):
while True:
self.client_socket.send(bytes("Please enter your username: ", "utf-8"))
self.username = self.client_socket.recv(1024).decode("utf-8").strip()
if self.username:
logging.debug(f"{self.client_address} has logged in as {self.username}.")
self.client_socket.send(bytes(f"Welcome, {self.username}!", "utf-8"))
break
else:
self.client_socket.send(bytes("Invalid username, please try again.", "utf-8"))
def chat(self):
while True:
try:
message = self.client_socket.recv(1024).decode("utf-8").strip()
except:
break
if message == "/quit":
break
logging.debug(f"{self.username}: {message}")
for handler in handlers:
if handler != self:
try:
handler.client_socket.send(bytes(f"{self.username}: {message}", "utf-8"))
except:
handlers.remove(handler)
logging.debug(f"{self.client_address} has left the chat.")
if __name__ == "__main__":
handlers = []
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8080))
server_socket.listen(5)
logging.debug("Server is listening on port 8080.")
while True:
client_socket, client_address = server_socket.accept()
handler = ClientHandler(client_socket, client_address)
handler.start()
handlers.append(handler)
```
在这份代码中,我们定义了一个`ClientHandler`类,它继承自Python的`threading.Thread`类,因此可以用于多线程处理。每当有一个新的客户端连接时,我们会创建一个`ClientHandler`对象,并将其加入到`handlers`数组中。
在`ClientHandler`类中,我们定义了`login`和`chat`方法,用于处理登录和聊天的逻辑。在登录过程中,我们要求用户输入用户名,并将其存储到`ClientHandler`对象的`username`属性中。在聊天过程中,我们通过`handler.client_socket.send()`方法将消息发送给其他客户端。
在主程序中,我们创建了一个`server_socket`对象,并在端口8080上进行监听。每当有新的客户端连接时,我们创建一个`ClientHandler`对象,并将其加入到`handlers`数组中。
在这份代码中,我们还使用了Python的`logging`模块来记录日志。我们可以通过设置`logging.basicConfig()`的参数来控制日志的级别和格式。在这份代码中,我们将日志级别设置为DEBUG,并用时间戳和消息文本来格式化日志信息。
这份代码还包括一个成熟的登录系统。在登录过程中,我们要求用户输入用户名,并将其存储到`ClientHandler`对象的`username`属性中。如果用户名无效,我们会提示用户重新输入。如果用户名有效,我们会向客户端发送欢迎消息,并将其加入到聊天室中。
总之,这是一份基于Python的socket通信代码,可以用于聊天,并支持多线程处理、记录日志和成熟的登录系统。