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)

  

原文地址:https://www.cnblogs.com/zhangshijiezsj/p/14180702.html