websocker 聊天
1 前端 vue
mounted:function(){
if("WebSocket" in window){
console.log("支持");
//生成websocket链接
var ws = new WebSocket("ws://192.168.1.58:8000/user/websocketlink/?jwt="+this.uid);
//发送链接请求
ws.onopen = function(){
ws.send("test0000");
}
//发送消息
ws.onmessage = function(evt){
//将获取信息打印
var received_msg = evt.data;
alert(received_msg);
// this.$message.info(received_msg)
}
//捕获断开链接
ws.onclose = function(){
console.log("链接已经关闭");
}
}
}
测试 后端
#websocket接口
#客户端列表
clients = {}
@accept_websocket
def websocketlink(request):
if request.is_websocket():
userid = str(uuid.uuid1())
while True:
message = request.websocket.wait()
if not message:
break
else:
print('websocket链接成功'+str(message))
clients[userid] = request.websocket
#推送消息
def sendmessage(request):
#获取消息
msg = request.GET.get("msg")
for client in clients:
clients[client].send(msg.encode('utf-8'))
return HttpResponse({'message':"ok"})
后端 连接
from dwebsocket.decorators import accept_websocket
import uuid
clients={}
@accept_websocket
def websocketlink(request):
if request.is_websocket():
# user_id=str(uuid.uuid1())
jwt=request.GET.get('jwt')
uid=jwt_end(jwt)
while True:
message=request.websocket.wait()
if not message:
break
else :
print('websocket连接ok'+str(message))
clients[uid]=request.websocket
print(clients)
推送消息
def sendmessage(request):
msg =request.GET.get("msg")
jwt = request.GET.get("jwt")
send_uid=jwt_end(jwt)
user=User.objects.filter(id=send_uid).first() # 获取发送人名称
uid=int(request.GET.get('uid'))
# 建立连接可能是双向的
char=Chat.objects.filter(user_id_a=send_uid,user_id_b=uid).first()
char1=Chat.objects.filter(user_id_a=uid,user_id_b=send_uid).first()
if char:
print('zoule1')
Message.objects.create(message=user.username+': '+msg, char_id= char.id)
elif char1:
print('zoule2')
Message.objects.create(message=user.username+': '+msg, char_id= char1.id)
elif not (char and char1):
print('走了3')
chat=Chat(user_id_a=send_uid,user_id_b=uid)
chat.save()
Message.objects.create(message=user.username+': '+msg, char_id=chat.id)
# for client in clients:
try:
clients[uid].send(msg.encode('utf-8'))
except Exception as e:
# message_table.insert({'uid': uid,'send_uid':send_uid,'message':msg})
print('发送失败')
print(e)
return HttpResponse(json.dumps({'msg':'发送失败'},ensure_ascii=False))
# message_table.insert({'uid': uid, 'send_uid': send_uid, 'message': msg})
return HttpResponse(json.dumps({'message':"ok"},ensure_ascii=False))
消息表关联
class Chat(models.Model):
id=models.AutoField(primary_key=True)
user_id_a=models.IntegerField()
user_id_b=models.IntegerField()
class Meta:
db_table='chat'
class Message(models.Model):
id = models.AutoField(primary_key=True)
message = models.CharField(max_length=255)
char_id=models.IntegerField()
class Meta:
db_table = "message"
展示 接口
class Get_message(APIView):
def get(self,request):
jwt=request.GET.get('jwt')
send_uid=jwt_end(jwt)
uid=int(request.GET.get('uid'))
list_msg=[]
char=Chat.objects.filter(user_id_a=send_uid,user_id_b=int(uid)).first()
char1=Chat.objects.filter(user_id_a=int(uid),user_id_b=send_uid).first()
if not (char or char1):
return Response({'msg':'没有建立连接'})
if char1:
message=Message.objects.filter(char_id=char1.id)
ser=MessageSerializers(message,many=True)
return Response(ser.data)
if char:
message = Message.objects.filter(char_id=char.id)
ser = MessageSerializers(message, many=True)
return Response(ser.data)

浙公网安备 33010602011771号