目录
流程图
可运行的websock代码
收消息
/**
* 收到客户端消息后调用的方法
*
* @param message 客户端发送过来的消息*/
@OnMessage
public void onMessage(String message, Session session) throws IOException {
log.info("收到来自窗口"+sid+"的叫号信息:"+message);
//生产目标消息然后回调发送消息
this.sendMessage("接收到"+message+"。 请访问接口"+"'"+"MessageToCaller"+"'"+"获取当前窗口的排队信息");
}
发消息
public static void sendInfo(String message,@PathParam("sid") String sid) throws IOException {
log.info("推送消息到窗口"+sid+",推送内容:"+message);
for (WebSocketServer item : webSocketSet) {
try {
//这里可以设定只推送给这个sid的,为null则全部推送
if(sid==null) {
item.sendMessage(message);
}else if(item.sid.equals(sid)){
item.sendMessage(message);
}
} catch (IOException e) {
continue;
}
}
}
D:\wsy\下载\websocket\springboot + netty + websocket\pxm6666-springboot-websocket-master\springboot-websocket
多人聊天、单人聊天
D:\wsy\下载\springboot整合\csdn下载的多人聊天和单人聊天\wbsocket
接收到客户端的json需要经过处理,目前可应答
D:\wsy\project\排队机\4.实现\code\v1.0\wbsocket_没有加生产者,可应答.zip
D:\wsy\下载\springboot整合\csdn下载的多人聊天和单人聊天\wbsocket_yuan 整合rocketmq
参考网址:
https://blog.csdn.net/qq_35387940/article/details/93483678
https://www.bilibili.com/video/av71654125?p=18 黑马rocket教程
websocket在接口中被调用。
@Controller
@RequestMapping("/checkcenter")
public class WebSocketController {
//推送数据接口
@ResponseBody
@RequestMapping("/socket/push/{cid}")
public String pushToWeb(@PathVariable String cid,String message) {
try {
WebSocketServer.sendInfo(message,cid);
} catch (IOException e) {
e.printStackTrace();
return "failure";
}
return "success";
}
}
评论:实际项目中,服务器和客户端交互,2种方案:
A:客户端访问接口,是访问接口的数据,接口的数据来自mq,就像是来自数据库一样的道理。
B: 服务器访问接口,把数据发送给客户端。为什么不直接发?为了系统中其他角色也能调用这个接口。就像是一个项目组中合作的成员,各自做自己的事情,有些资源需要共享
项目地址:
D:\wsy\下载\springboot整合\beyondli71-websocket-demo-master\websocket-demo
springboot整合Rockmq
消费者:
@Slf4j
@Component
@RocketMQMessageListener(topic = "springboot-mq",consumerGroup = "springboot-mq-consumer-1")
public class Consumer implements RocketMQListener<String> {
@Override
public void onMessage(String message) {
log.info("Receive message:"+message);
}
pom.xml
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>${rocketmq-spring-boot-starter-version}</version>
</dependency>
地址:D:\wsy\下载\黑马\RocketMQ\代码\springboot-rocketmq-consumer
生产者:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {MQSpringBootApplication.class})
public class ProducerTest {
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Test
public void test1(){
rocketMQTemplate.convertAndSend("springboot-mq","hello springboot rocketmq");
}
}
地址:D:\wsy\下载\黑马\RocketMQ1\代码\springboot-rocketmq-producer
在websocket中调用MQ的producer——sptingboot整合ms的项目
发消息
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage textMessage) throws Exception {
Long uid = (Long) session.getAttributes().get("uid");
JsonNode jsonNode = MAPPER.readTree(textMessage.getPayload());
Long toId = jsonNode.get("toId").asLong();
String msg = jsonNode.get("msg").asText();
// 将消息保存到MongoDB
// message = this.messageDAO.saveMessage(message);
String msgJson = MAPPER.writeValueAsString(message);
// 判断to用户是否在线
WebSocketSession toSession = SESSIONS.get(toId);
if (toSession != null && toSession.isOpen()) {
//TODO 具体格式需要和前端对接
toSession.sendMessage(new TextMessage("你好"));
// 更新消息状态为已读
// this.messageDAO.updateMessageState(message.getId(), 2);
}else{
// 该用户可能下线,可能在其他的节点中,发送消息到MQ系统
// 需求:添加tag,便于消费者对消息的筛选
this.rocketMQTemplate.convertAndSend("haoke-im-send-message-topic:SEND_MSG", msgJson);
}
}
收消息
@Override
public void onMessage(String msg) {
try {
JsonNode jsonNode = MAPPER.readTree(msg);
long toId = jsonNode.get("to").get("id").longValue();
// 判断to用户是否在线
WebSocketSession toSession = SESSIONS.get(toId);
if (toSession != null && toSession.isOpen()) {
//TODO 具体格式需要和前端对接
toSession.sendMessage(new TextMessage(msg));
// 更新消息状态为已读
// this.messageDAO.updateMessageState(new ObjectId(jsonNode.get("id").asText()), 2);
}else{
// 不需要做处理
}
} catch (Exception e) {
e.printStackTrace();
}
}
地址:D:\wsy\下载\黑马—租房\新建文件夹(2)\day10-RocketMQ集群、分布式WebSocket实现以及地图找房功能实现\代码\itcast-haoke-im
其他项目保存到redis的数据,Ms推送到前端
地址:D:\wsy\下载\springboot整合\notice-master\notice
MS项目,应用了定时器
但是报错404
项目是在springboot整合Mq的基础上整合了ms
代码:D:\wsy\project\排队机\4.实现\code\v1.0\springboot-rocketmq-producer_rocketmq
参考网址:https://blog.csdn.net/qq_35387940/article/details/93483678