使用python开发多人一对一聊天系统(文字聊天,视频通讯,文件传输)

该博客介绍了如何使用Python开发一个支持文字聊天、视频通讯和文件传输的一对一聊天系统。服务器端利用字典管理连接信息和配对,确保双方匹配成功。值得注意的是,视频功能需要在不同设备上运行,以防端口冲突。为了防止干扰,接收文件、消息和视频内容的过程都在多线程中进行。连接成功后,相关信息会被存储到服务器的字典中。

在服务器端使用了字典来储存连接信息配对表。当两个人的配对表互相相同时配对成功,并通知连接成功。
视频功能只能运行在两台不同的电脑上,不然会出现视频端口被占用的问题!
接收文件、消息、视频内容均开了多线程,避免了干扰。


连接成功后,就将连接信息存入字典。

	
		'''
        连接成功后将连接信息添加到各个字典中
        '''
        self.selfID = selfID
        self.SessionManege.messageConnTable[selfID] = self.messageConn
        self.SessionManege.fileConnTable[selfID] = self.fileConn
        self.SessionManege.videoConnTable[selfID] = self.videoConn
        self.SessionManege.pairTable[selfID] = targetID

cv2获取的图片使用下面代码转二进制流,不能 "tobytes()" 直接转二进制流,不然无法编码。
                byte_stream = cv2.imencode('.jpg', img)[1]

使用

                img =  cv2.imdecode(np.fromstring(byte_stream,np.uint8),cv2.IMREAD_COLOR) 

再解码

直接上代码。
服务器端

import socket
import os
import hashlib
import threading,time
import json

class SessionManege(threading.Thread):
    messageConnTable = {
   
   }
    fileConnTable = {
   
   }
    videoConnTable = {
   
   }
    pairTable = {
   
   }
    
    def newSession(self, messageConn, fileConn,videoConn):
        chat_Session = MessageSession(messageConn, fileConn,videoConn,self)
        chat_Session.start()


    def close_messageConn(self,userID):
        self.messageConnTable.pop(userID)
        self.fileConnTable.pop(userID)
        self.videoConnTable.pop(userID)
        self.pairTable.pop(userID)
        print(userID,"连接关闭")
    
class MessageSession(threading.Thread):

    def __init__(self, messageConn, fileConn, videoConn, SessionManege):
        super(MessageSession, self).__init__()
        self.messageConn = messageConn
        self.fileConn = fileConn
        self.videoConn = videoConn
        self.SessionManege = SessionManege

    def pairTest(self,selfID,targetID):
        if selfID in self.SessionManege.messageConnTable:
            self.messageConn.send(json.dumps({
   
   
                        'type': 'systemMassage',
                        'info': "用户名重复!"
                    }).encode("utf-8"))
            return
        '''
        连接成功后将连接信息添加到各个字典中
        '''
        self.selfID = selfID
        self.SessionManege.messageConnTable[selfID] = self.messageConn
        self.SessionManege.fileConnTable[selfID] = self.fileConn
        self.SessionManege.videoConnTable[selfID] = self.videoConn
        self.SessionManege.pairTable[selfID] = targetID
        '''
        返回信息
        '''
        if(self.SessionManege.messageConnTable.get(targetID)):
            self.targetmessageConn = self.SessionManege.messageConnTable.get(targetID)
            self.messageConn.send(json.dumps({
   
   
                        'type': 'pairTestResult',
                        'success': True,
                    }).encode("utf-8"))
            self.targetmessageConn.send(json.dumps({
   
   
                        'type': 'pairTestResult',
                        'success': True,
                    }).encode("utf-8"))
            return True
        else :
            self.messageConn.send(json.dumps({
   
   
                        'type': 'pairTestResult',
                        'success': False,
                    }).encode("utf-8"))
            return False

    def msgHandle(self,msg):
        data = json.loads(msg)
        if data['type'] == "Message":  #连接成功后从messageConnTable中获取targetID的messageConn        
            targetmessageConn = self.SessionManege.messageConnTable.get(data['targetID'])
            targetmessageConn.send(json.dumps({
   
   
                        'type': 'Message',
                        'content': data['content'],
                    }).encode("utf-8") )

        if data['type'] == "FileTransfer": #文件传输
            targetmessageConn = self.SessionManege.messageConnTable.get(data['targetID'])
            targetmessageConn.send(json.dumps({
   
   
                        'type': 'FileTransfer',
                    }).encode("utf-8") )
            fileTransfer = FileTransfer(data['selfID'],data['targetID'],self.SessionManege)
            fileTransfer.start()

        if data['type'] == "videoChat": #视频聊天
            targetmessageConn = self.SessionManege.messageConnTable.get(data['targetID'])
            targetmessageConn.send(json.dumps({
   
   
                        'type': 'videoChat',
                    }).encode("utf-8") )
            videoTransfer = VideoTransfer(data['selfID'],data['targetID'],self.SessionManege
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值