在服务器端使用了字典来储存连接信息和配对表。当两个人的配对表互相相同时配对成功,并通知连接成功。
视频功能只能运行在两台不同的电脑上,不然会出现视频端口被占用的问题!
接收文件、消息、视频内容均开了多线程,避免了干扰。
连接成功后,就将连接信息存入字典。
'''
连接成功后将连接信息添加到各个字典中
'''
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']