java websocket一对一_WebSocket(3)---实现一对一聊天功能

实现一对一聊天功能

功能介绍:实现A和B单独聊天功能,即A发消息给B只能B接收,同样B向A发消息只能A接收。

本篇博客是在上一遍基础上搭建,上一篇博客地址:【WebSocket】---实现游戏公告功能。底部有源码。

先看演示效果:

5a692ec6be12d957f60f97fb9eabe8b7.gif

一、案例解析

1、PTPContoller

/*** 功能描述:简单版单人聊天

* 这里没有用到@SendTo("/topic/game_chat")来指定订阅地址,而是通过SimpMessagingTemplate来指定*/@Controllerpublic classPTPContoller {

@AutowiredprivateWebSocketService ws;

@MessageMapping("/ptp/single/chat")public voidsingleChat(InMessage message) {

ws.sendChatMessage(message);

}

}

这里和前面的公告消息,最大的区别就是接口上没有通过@SendTo("/topic/game_chat")来发送消息。

(1)@SendTo和SimpMessagingTemplate区别

spring websocket基于注解的@SendTo和@SendToUser虽然方便,但是有局限性,例如我这样子的需求,我想手动的把消息推送给某个人,或者特定一组人,怎么办,

@SendTo只能推送给所有人(它是一个具体地址,一点都不灵活),@SendToUser只能推送给请求消息的那个人,这时,我们可以利用SimpMessagingTemplate这个类

SimpMessagingTemplate有俩个推送的方法

convertAndSend(destination, payload); //将消息广播到特定订阅路径中,类似@SendTo

convertAndSendToUser(user, destination, payload);//将消息推送到固定的用户订阅路径中,类似@SendToUser

2、WebSocketService

importcom.jincou.websocket.model.InMessage;importcom.jincou.websocket.model.OutMessage;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.messaging.simp.SimpMessagingTemplate;importorg.springframework.stereotype.Service;/*** 功能描述:简单消息模板,用来推送消息*/@Servicepublic classWebSocketService {

@AutowiredprivateSimpMessagingTemplate template;/*** 简单点对点聊天室*/

public voidsendChatMessage(InMessage message) {//可以看出template最大的灵活就是我们可以获取前端传来的参数来指定订阅地址//前面参数是订阅地址,后面参数是消息信息

template.convertAndSend("/chat/single/"+message.getTo(),new OutMessage(message.getFrom()+" 发送:"+message.getContent()));

}

3、app.js

其它地方和公告的app.js一样,只有下面两点做了一点修改

function connect() {

var from= $("#from").val();

var socket= new SockJS('/endpoint-websocket');

stompClient=Stomp.over(socket);

stompClient.connect({}, function (frame) {

setConnected(true);

console.log('Connected: ' +frame);//1、通过+from就可以灵活的用当前用户的某一信息来指定该用户订阅地址。

stompClient.subscribe('/chat/single/'+from, function (result) {

showContent(JSON.parse(result.body));

});

});

}

function sendName() {//2、这里出了发送content信息外,还发送了发送者用户信息,和接受者的信息

stompClient.send("/app/ptp/single/chat", {}, JSON.stringify({'content': $("#content").val(), 'to':$("#to").val(), 'from':$("#from").val()}));

}

4、user.html

其它地方也和之前公告的一样,下面是修改的地方

发送

5、再把整个思路缕一缕

以 A 向 B 发送消息为例

(1)form输入框输入:“A”,to输入框输入 “B” 点击“Connect”建立websocket连接

(2)那么的 A 用户的订阅地址就是'/chat/single/A'

(3)前端在“content”按钮中输入“你今天吃鸡了吗?”,再点击“发送”按钮

(4)后台通过接受处理就成了:

template.convertAndSend("/chat/single/B",new OutMessage(" A 发送:你今天吃鸡了吗?"));

那么 B 向 A 发送性质一模一样。就可以实现一对一聊天。

注意:这个只是演示,并不是真正一对一聊天,一般如果实现一对一聊天,那么form和to都应该是唯一的,比如该用户的userID,这样就可以真正实现一对一聊天了。

想太多,做太少,中间的落差就是烦恼。想没有烦恼,要么别想,要么多做。中校【19】

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现一对一聊天,可以使用 WebSocket 技术。WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它可以在客户端和服务器之间建立一个持久的连接,使得实时通信成为可能。 以下是实现一对一聊天的基本步骤: 1. 创建 WebSocket 连接:在客户端和服务器之间建立 WebSocket 连接,可以使用浏览器提供的 WebSocket API 或者第三方库。 2. 发送消息:客户端可以通过 WebSocket 连接向服务器发送消息,消息可以是文本、二进制数据等。服务器接收到消息后,可以将消息转发给对应的客户端。 3. 接收消息:客户端和服务器都可以通过 WebSocket 连接接收消息。客户端可以通过监听 WebSocket 的 onmessage 事件来接收服务器发送的消息。服务器可以通过 WebSocketsend 方法向客户端发送消息。 4. 关闭连接:当聊天结束时,客户端或服务器可以通过调用 WebSocket 的 close 方法来关闭连接。 实现一对一聊天的关键在于如何将消息发送给对应的客户端。一种简单的方法是为每个客户端分配一个唯一的标识符,例如用户 ID。客户端在建立 WebSocket 连接时,可以将自己的标识符发送给服务器。当服务器接收到客户端发送的消息时,可以根据消息中的目标标识符将消息转发给对应的客户端。 以上就是使用 WebSocket 实现一对一聊天的基本步骤。需要注意的是,WebSocket 通常需要与其他技术(例如 HTTP、SSL 等)配合使用,这些技术的具体实现方式可以根据实际情况进行选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值