最近搜索

WebSocket 的简单使用

浏览:423
管理员 2021-09-17 14:29



    onLoad() { 
        var webSocket = new WebSocket("ws://localhost/ws/dd");
        webSocket.onopen = function(event){
            console.log("打开链接");
            //console.log(event);
            //self.webSocketRes.string = event.type
        }
        ////接受服务器发送的消息 
        webSocket.onmessage = function(event){
            console.log("接受服务器发送的消息 :"+event);
            console.log(event);
            
            //self.webSocketRes.string = self.webSocketRes.string + "--" + event.type
            //webSocket.close();
            //webSocket = null;
        }
        webSocket.onerror = function(event){
            console.log("webSocket.onerror:");
            console.log(event.data);
            //self.webSocketRes.string = self.webSocketRes.string + "--" + event.type
        }
        webSocket.onclose = function(event){
            console.log("webSocket.onclose:");
            console.log(event);
            //self.webSocketRes.string = self.webSocketRes.string + "--" + event.type
        }
        
        setTimeout(function () {
            if (webSocket.readyState === WebSocket.OPEN) {
                webSocket.send("Hello WebSocket, I'm a text message.");
            }
            else {
                console.log("WebSocket instance wasn't ready...");
            }
        }, 1000);


    },




spring boot后台代码 和pom。xml


package com.java456.socket;

import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import org.springframework.stereotype.Component;

import com.java456.dao.UserDao;
import com.java456.entity.User;
import com.java456.service.UserService;

import net.sf.json.JSONObject;

import javax.annotation.Resource;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

@ServerEndpoint("/ws/{username}")
@Component
public class WsServerEndpoint {
	private static final ConcurrentMap<String, WsServerEndpoint> USER_CLIENT_MAP = new ConcurrentHashMap<>();
	private Session session;
	private String username = "";
	private static int onlineCount = 0;// 记录在线人
	@Resource
	private UserService userService;
	
	/**
	 * #连接成功
	 * 
	 * @param session
	 */
	@OnOpen
	public void onOpen(Session session, @PathParam("username") String username) {
		System.out.println("连接成功,sessionid:" + session.getId() + ",username:" + username);
		this.session = session;
		this.username = username;
		if (USER_CLIENT_MAP.containsKey(username)) {
			USER_CLIENT_MAP.remove(username);
			USER_CLIENT_MAP.put(username, this);
		} else {
			USER_CLIENT_MAP.put(username, this);
			addOnlineCount();
		}
	}

	/**
	 * #连接关闭
	 * 
	 * @param session
	 */
	@OnClose
	public void onClose(Session session) {
		System.out.println("连接关闭:" + username);
		System.out.println("sessionid:" + session.getId());
		if (USER_CLIENT_MAP.containsKey(username)) {
			USER_CLIENT_MAP.remove(username);
			// 从set中删除
			subOnlineCount();
		}
	}

	/**
	 * #接受到客户端发送的消息
	 * 
	 * @param text
	 */
	@OnMessage
	public void onMsg(String msg, Session session) throws IOException {
		System.out.println("接受客户消息 ");
		System.out.println("消息内容: " + msg);
		System.out.println("sessionid: " + session.getId());
		// String key = this.session.getId();
		// USER_CLIENT_MAP.get(key).sendMessage(msg);

		// 解析发送的报文
		// JSONObject jsonObject = JSONObject.fromObject(msg) ;
		// 追加发送人(防止串改)
		// jsonObject.put("username", this.username);
		//
		this.sendToAll(this.username + ":" + msg);
		// 这个返回的消息,是单独发给我的人发的。 可以在方法上面写返回 string
		// return "servet 发送:" + msg;
	}

	// 群发消息给所有客户
	public void sendToAll(String msg) {
		USER_CLIENT_MAP.values().forEach(item -> {
			item.sendMessage(msg);
		});
	}

	/**
	 * #推送消息给客户端
	 * 
	 * @param message 消息内容
	 */
	private void sendMessage(String message) {
		try {
			// 使用同步块和同步方法发送。看是否能防止产生IllegalStateException异常
			// modify by caoshuo at 200506
			synchronized (session) {
				session.getBasicRemote().sendText(message);
			}
		} catch (Exception e) {
			// 如果接受的人关闭了。这个会报错。
			System.out.println(
					"websocket连接发送客户端发送消息时异常!   消息内容:" + message + ",sessionid:" + this.toString() + "____" + e);
		}
	}

	/**
	 * 发生异常时的处理
	 *
	 * @param session   客户端session
	 * @param throwable session
	 */
	@OnError
	public void onError(Session session, Throwable throwable) {
		if (this.session != null && this.session.isOpen()) {
			System.out.println("websocket连接onError。inputSession:{}-localSession:{}" + session.getId() + this.toString()
					+ throwable);
		} else {
			System.out.println("已经关闭的websocket连接发生异常!inputSession:{}-localSession:{}" + session.getId()
					+ this.toString() + throwable);
		}
	}

	public static synchronized int getOnlineCount() {
		return onlineCount;
	}

	public static synchronized void addOnlineCount() {
		WsServerEndpoint.onlineCount++;
	}

	public static synchronized void subOnlineCount() {
		WsServerEndpoint.onlineCount--;
	}

}



	
<!--原生websocket-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!--原生websocket-->


联系站长

站长微信:xiaomao0055

站长QQ:14496453