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

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

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


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

	
		'''
        连接成功后将连接信息添加到各个字典中
        '''
        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']
  • 16
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 31
    评论
### 回答1: 实现一个 Python 多人聊天室可以分为以下步骤: 1. 创建一个服务器,监听客户端连接请求。 2. 当客户端连接到服务器时,服务器将客户端的连接请求接受,并记录客户端的套接字。 3. 服务器将客户端的消息转发给所有其他客户端,实现多人聊天的功能。 4. 如果某个客户端断开连接,服务器应该将该客户端的套接字从客户端列表中删除,并通知其他客户端。 以下是一个简单的 Python 多人聊天室的代码示例: ```python import socket import threading # 创建服务器套接字 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 绑定服务器套接字 server_socket.bind(('0.0.0.0', 9999)) # 监听客户端连接请求 server_socket.listen() # 客户端列表 clients = [] def handle_client(client_socket, addr): while True: try: # 接收客户端消息 msg = client_socket.recv(1024).decode() if not msg: break # 转发消息给其他客户端 for c in clients: if c != client_socket: c.send(f'{addr}: {msg}'.encode()) except: break # 关闭客户端连接 client_socket.close() clients.remove(client_socket) print(f'{addr} disconnected') while True: # 接受客户端连接 client_socket, addr = server_socket.accept() # 添加客户端到列表 clients.append(client_socket) # 启动客户端线程 client_thread = threading.Thread(target=handle_client, args=(client_socket, addr)) client_thread.start() # 输出客户端连接信息 print(f'{addr} connected') ``` 在这个例子中,我们使用Python 的 socket 模块来创建服务器套接字和客户端套接字,使用 threading 模块来实现多线程处理客户端连接。当客户端连接到服务器时,我们将客户端的套接字添加到客户端列表中,并启动一个新的线程来处理客户端的消息。当客户端发送消息时,服务器将消息转发给所有其他客户端。如果客户端断开连接,服务器将关闭客户端套接字,并从客户端列表中删除该套接字。 ### 回答2: Python多人聊天室是一个基于Python语言开发的应用程序,可以支持多个用户同时进行实时聊天和互动。 在实现Python多人聊天室的过程中,可以使用Socket编程来建立客户端与服务器之间的连接。通过创建一个服务器端和多个客户端,在服务器端建立一个监听套接字,接收客户端的连接请求,并为每个连接创建一个线程或进程来处理客户端的请求。 服务器端可以使用Python的socket模块来进行创建和管理套接字。服务器端需要监听某个IP地址和端口,接受来自客户端的连接请求。一旦建立连接,服务器端就可以接收到客户端发送的消息,并将其广播给其他客户端。 客户端可以使用Python的socket模块来创建套接字并连接到服务器。客户端可以通过输入消息并发送给服务器端,同时接收其他客户端发送过来的消息并显示在界面上。 为了实现多人聊天功能,可以使用线程或进程来处理多个客户端的连接和消息传递。每个客户端连接到服务器后,服务器端需要为该客户端创建一个线程或进程,用于接收该客户端的消息并将其广播给其他客户端。 在实现过程中,还可以使用其他第三方库来增强多人聊天室的功能和用户体验,例如使用Tkinter模块来构建GUI界面,使用pickle模块来对消息进行序列化和反序列化。 总的来说,Python多人聊天室可以通过Socket编程来实现客户端与服务器之间的连接和消息传递,通过线程或进程来处理多个客户端的连接和消息传输。这样就能够实现多个用户同时进行实时聊天和互动的功能。 ### 回答3: Python多人聊天室是一个支持多用户同时在线聊天的程序。它使用Python编程语言编写,可以在多个终端上同时运行。 这个聊天室的实现主要依赖于Python的socket库和多线程编程。它通过创建一个服务器端和多个客户端来实现用户之间的实时通信。 在服务器端,我们首先创建一个socket对象,并通过bind()函数将其绑定到一个特定的IP地址和端口号上。然后,通过listen()函数开始监听客户端的连接请求。 一旦有客户端尝试连接,我们通过accept()函数接受连接请求,并在新创建的线程中为该客户端提供服务。每个客户端连接都会创建一个新的线程,这样可以确保服务器可以同时处理多个客户端的请求。 在客户端,我们也先创建一个socket对象,并通过connect()函数连接到服务器端的IP地址和端口号上。然后,通过不断地接收和发送消息,实现与其他用户的实时聊天。 为了实现多人聊天功能,我们可以使用一些数据结构来保存在线用户的信息,比如使用一个字典来保存每个用户的用户名和对应的socket对象。 在服务器端,我们可以通过广播的方式将一条消息发送给所有的在线用户。通过使用线程锁来保证多个线程同时对这个字典进行读写的安全性。 综上所述,Python多人聊天室可以为多个用户提供实时的聊天功能。它使用Python的socket库和多线程编程来实现用户间的通信,并通过广播方式将消息发送给所有在线用户。通过合理地使用数据结构和线程锁,我们可以确保多人聊天室的安全和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值