本文旨在记录如何实现小程序使用websocket接受/推送消息
- websocket 是什么
- websocket 服务器端和客户端
- 小程序如何和websocket建立连接,并实现消息推送/接受
websocket是什么?
websocket是一种通信协议,它使得我们可以建立双方连接的通道,也就是说的握手。通信不仅可以从客户端发起,也可以从服务器主动给客户端发送消息,典型使用场景就是类似多人聊天,一个客户端说话,其他的客户端也可以收到消息
详细可参考以下博客:
WebSocket 服务器端和客户端
服务器端:相当于一个中间站,每个客户端和它建立连接,当一个客户端给它发送消息时,服务器端收到消息,然后发送消息给其他建立连接的客户端,以下为服务器端实现推送简单的demo:
package com.net.websocket;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.Collection;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
/**
* @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,
* 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
*/
@ServerEndpoint("/websocket")
public class WebSocket {
//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
private static int onlineCount = 0;
//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
// private static CopyOnWriteArraySet<WebSocket> webSocketSet = new CopyOnWriteArraySet<WebSocket>();
private static ConcurrentMap<String, WebSocket> webSocketMap = new ConcurrentHashMap<String, WebSocket>();
//与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session;
/**
* 连接建立成功调用的方法
* @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
*/
@OnOpen
public void onOpen(Session session) {
try {
this.session = session;
System.out.println("==> session.getQueryString:" + session.getQueryString());
String str = session.getQueryString();
String[] list = str.split("_");
String sessionId = "";
if(list.length>0){
sessionId = list[0]; //第一个参数作为当前建立连接的sessionkey
webSocketMap.put(sessionId,this); //将这个会话加入到Map中
addOnlineCount();