【软件开发之聊天软件】

这篇博客介绍了使用Python开发聊天软件的过程,提供了优化后的代码,并鼓励读者根据代码进行修改。文章声明基础代码为借鉴并已进行改进,原创归属可联系作者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个代码是开发聊天软件使用,大家可参照代码使用。
注:

这个代码仅供参考,大家可以参照我的代码来修改

废话少说,上代码:

# ----数据协议相关配置----
# ----数据协议相关配置----
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值