Python语言基于Socket实现聊天室(包含登录、注册功能)

本文介绍了一个使用Python的Twisted框架构建服务端、Socket实现客户端连接、tkinter设计用户界面以及MySQL处理登录注册逻辑的聊天室项目。详细讲解了服务端和客户端的事件驱动实现、逻辑处理以及界面布局。
摘要由CSDN通过智能技术生成

一、聊天室的整体架构

1.twisted:实现服务端,以及事件驱动
  • Twisted是用Python实现的基于事件驱动的网络引擎框架。
2.socket:实现客户端,以及事件驱动
3.tkinter:实现客户端界面
4.MySQL:用户信息存储,以及登录、注册逻辑处理

二、聊天室的具体实现

1.服务端实现事件驱动
#--coding:utf-8--
# @Time    : 2020/11/30/030 23:04
# @Author  : panyuangao
# @File    : server.py
# @PROJECT : chatRoom

from twisted.internet.protocol import Factory
from twisted.protocols.basic import LineReceiver  # 事件处理器
from twisted.internet import reactor
from model import login_model,register_model,chat_model
import json

class Chat(LineReceiver):
    def __init__(self, users):
        self.users = users

    def connectionLost(self, reason):#断开连接时候自动触发,从users字典去掉连接对象
        if self in self.users.keys():
            # print("%s断开连接" %self.users[self])
            del self.users[self]

    def dataReceived(self, data):  # 对返回内容开始做处理,只要收到客户端消息,自动触发此方法
        data = data.decode('utf-8')
        data_dict = json.loads(data)
        #根据type字段的值,进入对应的逻辑
        if data_dict["type"] == "login":
            login_model.login(self,data_dict)
        elif data_dict["type"] == "register":
            register_model.register(self,data_dict)
        elif data_dict["type"] == "chat":
            chat_model.chat(self,data_dict)

class ChatFactory(Factory):#实现了一个工厂类,只会实例化一次
    def __init__(self):
        self.users = {
   }  # 昵称映射到聊天实例,key-->登录成功的连接对象 value:昵称

    def buildProtocol(self, addr):#此方法必须要实现
        print(addr)
        return Chat(self.users)#返回一个处理具体业务请求的对象,参数传递了字典:存所有登录成功的连接对象

if __name__ == '__main__':#设定监听端口和对象
    reactor.listenTCP(1200, ChatFactory())#使用Tcp协议,实例化ChatFactory
    print ("开始进入监听状态...")
    reactor.run()#开始监听
2.服务端的逻辑处理
  • 登录逻辑
#--coding:utf-8--
# @Time    : 2020/12/28/028 23:07
# @Author  : panyuangao
# @File    : login_model.py
# @PROJECT : chatRoom
from db import user_db
import json

def login(self,data_dict):#登录逻辑
    account = data_dict["account"].strip()
    password = data_dict["password"].strip()
    data = {
   }
    if account and password: #账号密码均不为空,才进入登录验证逻辑
        code,msg,nickname = login_check(account, password)
    elif not account:
        code = "700001"
        msg = "登录账号不能为空"
    elif not password:
        code = "700002"
        msg = "登录密码不能为空"

    if code == "000000": # code为000000时,表示登录成功,将连接对象以及昵称,加到users里,便于后续遍历发送消息
        self.users[self] = nickname
        data["nickname"] = nickname
    data["type"] = "login"
    data["code"] = code
    data["msg"] = msg
    data = json.dumps(data)
    self.sendLine(data.encode("utf-8"))

def login_check(account, password): #登录校验
    userInfo = user_db.checkUser(account) #通过账号查询数据库,获取账号、密码、昵称
    if len(userInfo) == 0: #未查询出数据,表示该账号未注册
        data = ("700003", "账号【%s】未注册,请注册后再登录!" % account, None)
    elif password != userInfo[0][1]: #查询出的密码与接收到的不致,表示密码不正确
        data = ("700004", "密码错误,请重新输入", None)
    else:
        nickname = userInfo[0][2] #登录成功,获取昵称
        data = ("000000", "账号【%s】登录成功" % account, nickname)
    return data
  • 注册逻辑
#--coding:utf-8--
# @Time    : 2020/12/28/028 23:10
# @Author  : panyuangao
# @File    : register_model.py
# @PROJECT : chatRoom
from db import user_db
import json

def register(self, data_dict):  # 注册逻辑
    account = data_dict["account"].strip()
    password = data_dict["password"].strip()
    nickname 
  • 17
    点赞
  • 153
    收藏
    觉得还不错? 一键收藏
  • 30
    评论
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值