这个代码是开发聊天软件使用,大家可参照代码使用。
注:
这个代码仅供参考,大家可以参照我的代码来修改
废话少说,上代码:
# ----数据协议相关配置----
# ----数据协议相关配置----
from threading import Thread
from typing import Any
import self as self
REQUEST_LOGIN = '0001' # 登陆请求
REQUEST_CHAT = '0002' # 聊天请求
RESPONSE_LOGIN_RESULT = '1001' # 登陆结果响应
RESPONSE_CHAT = '1002' # 聊天响应
DELIMITER = '|' # 自定义协议数据分割符
SERVER_IP = '127.0.0.1' # 服务器地址
SERVER_PORT = 8090 # 服务器端口
# ----数据库相关配置---- #具体参数自己设置
DB_HOST = '127.0.0.1' # 这里是你数据库IP地址
DB_PORT = 3306 # 这里是你数据库端口
DB_NAME = 'py_chat' # 这里是你数据库名
DB_USER = 'root' # 这里是你数据库登陆账号
DB_PASSWD = '123456' # 这里是你数据库密码
CHARSET = 'utf-8'
# ----数据协议相关配置----
REQUEST_LOGIN = '0001' # 登陆请求
REQUEST_CHAT = '0002' # 聊天请求
RESPONSE_LOGIN_RESULT = '1001' # 登陆结果响应
RESPONSE_CHAT = '1002' # 聊天响应
DELIMITER = '|' # 自定义协议数据分割符
SERVER_IP = '127.0.0.1' # 服务器地址
SERVER_PORT: int = 8090 # 服务器端口
class ResponseProtocol(object):
@staticmethod
def response_chat(nickname, messages, DELIMITER=None, RESPONSE_CHAT=None):
"""
拼接聊天相应,数据格式为:“相应协议编号|聊天发送者昵称|聊天信息”
:param RESPONSE_CHAT:
:param DELIMITER:
:param nickname: 聊天内容发送者昵称
:param messages: 聊天内容
:return: 聊天相应协议格式字符串
"""
return DELIMITER.join([RESPONSE_CHAT, nickname, messages])
'import *'
class Server(object):
"""自定义套接字,负责初始化服务器套接字需要的相关参数"""
def __init__(self):
# 初始化套结字
# 创建请求的ID和方法关联字典
self.server_socket = None
self.requset_handle_function = {
}
self.register(REQUEST_LOGIN, self.request_login_handle)
self.register(REQUEST_CHAT, self.request_chat_handle)
# 创建保存当前登录用户字典
self.clients = ()
'''注册消息类型和处理函数到字典'''
def register(self, requeset_id, handle_function):
self.requset_handle_function[requeset_id] = handle_function
'''启动程序'''
def startup(self):
"""启动器"""
while True:
print('正在等待客户端连接')
soc, addr = self.server_socket.accept()
# print ('获取到客户端连接')
client_soc = SocketWrapper(soc)
# 启动线程处理该用户请求
Thread(target=lambda: self.request_handle(client_soc)).start()
'''处理客户端数据'''
def request_handle(self, client_soc):
while True:
# 接收客户端数据
recv_data = client_soc.recv_data()
if not recv_data:
# 没有接收到数据客户端应该已经关闭
self.remve_offline_user(client_soc)
client_soc.close()
break
'''解析数据'''
parse_data = self.parse_request_text(recv_data)
'''分析请求类型,并依据请求类型调用相应的分类处理'''
'''
# 获得使用的方法名 方法名 = 字典[value] 注: 如 字典[key]可以互相找到字典[value]
# 此处 字典[key]=0001 对应得字典[value] = REQUEST_LOGIN
#例子:
parse_data = '0001|XXX|XXX'
parse_data['requset_id'] = ‘0001’
requset_handle_function['0001'] = self.request_login_handle
handle_funtion = self.request_login_handle
'''
handle_funtion = self.requset_handle_function.get(parse_data['requset_id'])
if handle_funtion:
# 按照方法名调用方法
handle_funtion(client_soc, parse_data)
else:
# 如果传输内容不匹配,返回错误请求
self.request_err_handle(client_soc)
'''用户离线操作'''
def remve_offline_user(self, client_soc):
for username, info in self.clients.items():
if info['sock'] == client_soc:
print(self.clients[username]['nickname'] + '已经离开')
del self.clients[username]
break
'''解析客户端发送来的数据'''
'''解析数据内容'''
def parse_request_text(self, recv_data):
'''
登录信息
登录信息:0001|username|password
聊天信息:0002|username|messages
错误信息:err
'''
print('解析客户端数据:' + recv_data)
requset_list = recv_data.split(DELIMITER)
requset_data = {
}
requset_data['requset_id'] = requset_list[0]
if requset_data['requset_id'] == REQUEST_LOGIN:
requset_data['username'] = requset_list[1]
requset_data['password'] = requset_list[2]
elif requset_data['requset_id'] == REQUEST_CHAT:
requset_data['username'] = requset_list[1]
requset_data['messages'] = requset_list[2]
return requset_data
'''登录处理'''
def request_login_handle(self, client_sock