java+websocket前后端调用过程解析

开发平台:普元eos(封装eclipse)

先上代码:后端代码如下:

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 com.eos.runtime.core.TraceLoggerFactory;
import com.eos.system.logging.Logger;
@ServerEndpoint("/webSocket")
public class WebSocketHandler{
	// 打印日志使用
	Logger log = TraceLoggerFactory.getLogger(WebSocketHandler.class);
	private static ConcurrentHashMap<String, Session> webSocketSessionMap = new ConcurrentHashMap<String, Session>();
	
	public WebSocketHandler(){
		log.info("Websocket创建" + new Date().getTime());
    }

    @OnOpen
    public void onOpen(Session session){
        log.info("webSocket连接成功" + new Date().getTime());
    }
    
    @OnClose
    public void onClose(Session session){
    	log.info("close...." + new Date().getTime());
    }
    
    @OnError
    public void onError(Session session, Throwable error) {
        log.info("webSocket服务关闭" + new Date().getTime());
        log.info(error.getMessage());
    }
    
    @OnMessage      
    public void onSend(Session session,String msg){
        try {
            session.getBasicRemote().sendText(msg);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    // 由后端业务代码调用
    public void sendMessage(String toUserId,String msg) throws Exception{
    	if(ObjectUtil.isNotEmpty(webSocketSessionMap.get(toUserId))){
    		onsend(webSocketSessionMap.get(toUserId), msg);
    	}
    }
}

前端代码如下:

// 有项目路径时,在端口号后面添加即可
var url = "ws://localhost:8080/webSocket"
var ws = new WebSocket(url);
ws.onopen = function(e) {
	console.info("连接创建" + new Date().getTime());
};  
ws.onmessage = function (e) { 
	console.info("接收到消息" + new Date().getTime());
}; 
ws.onclose = function(e) { 
	console.info("连接关闭" + new Date().getTime());
};
ws.error = function(e) { 
	console.info("连接失败" + new Date().getTime());
};
// 前端主动向后端发送消息
ws.send();
// 前端关闭连接
ws.close();

1."var ws = new WebSocket(url);"执行时

后端构造方法WebSocketHandler()执行---->
后端@OnOpen注解方法执行---->
前端ws.onopen执行---->
连接创建成功

2.前端调用"ws.close();"

后端@OnClose注解方法执行---->
前端ws.onclose执行(参数中包含关闭状态码)---->
连接关闭

3.前端调用"ws.send();"

后端@OnMessage注解方法执行---->
前端ws.onmessage执行---->
数据发送成功

4.直接停止tomcat服务

后端@OnClose注解方法执行---->
前端ws.onclose执行(参数中包含关闭状态码)---->
连接关闭

注:后端方法中不能写返回值,必须使用void,否则会触发@OnError,@OnError执行前会先调用@OnClose关闭连接。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值