Gentle0503 2022-11-22 18:00 采纳率: 64.7%
浏览 44
已结题

websocket 连接报错1006 CLOSE_ABNORMAL

WebSocket 连接 出错 不知道哪里的问题

代码如下:

package com.ms.web.websocket;

import com.ms.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PathVariable;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @author Delta
 */
@Slf4j
@ServerEndpoint(value = "/ws/api/{sid}")
@Component
public class SocketServer {
    private Session session;
    /**
     * @Author delta
     * 当前在线连接数
    **/
    private static int onlineCount = 0;
    /**
     * @Author delta
     * 存放每个客户端对应的MyWebsocket对象
     * **/
    private static Map<String, SocketServer> copyOnWriteArraySet = new HashMap();
    /**
     * 接收sid
    **/
    private String sid = "";

    @OnOpen
    public void onOpen(Session session,@PathParam("sid") String sid) {
        this.session = session;
        copyOnWriteArraySet.put(sid, this);
        this.sid = sid;
        SocketServer.onlineCount++;
        //推送数据
        sendMessage("连接成功");
        log.info("有新的窗口开始监听" + sid + ",当前在线人数为:" + onlineCount);
    }

    @OnClose
    public void onClose() {
        //移除需要关闭的对象
        copyOnWriteArraySet.remove(this);
        SocketServer.onlineCount--;
        log.info("释放的sid为:" + sid);
        log.info("有一个连接关闭!当前在线人数为" + SocketServer.onlineCount);
    }

    /**
     * @Author delta
    收到客户端消息时触发。处理客户端通过这个websocket
    方法提供的访问地址(eg:ws://localhost:8080/ws/api/123)
    推送过来的数据.。常见于前端调用,进行数据推送。
    **/
    @OnMessage
    public void onMsg(String info, Session session) {
        //这个方法没什么暖用,之前的@Open方法已经将当前方法的session存到集合中了
        Set<SocketServer> collect = copyOnWriteArraySet.values().stream().filter(a -> a.session.getId().equals(session.getId())).collect(Collectors.toSet());
        //给所有已经连接的客户端进行消息群发
        copyOnWriteArraySet.forEach((key, value) -> copyOnWriteArraySet.get(value.sid).sendMessage(info));
        //获取服务端到客户端的通道并发送信息
        collect.forEach(a -> copyOnWriteArraySet.get(a.sid).sendMessage("服务器收到了信息,并把信息返回给你" + info));
        log.info("服务器收到了" + info);
    }

    @OnError
    public void onError(Session session, Throwable error) {
        error.printStackTrace();
    }

    /**
     * 发送消息到客户端-> 服务器的主动推送
     * @Date 17:01 2022/11/22
     * @Param
     * @return
    **/
    public synchronized void sendMessage(String message) {
        try {
            this.session.getBasicRemote().sendText(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * @Author delta
     * @Description
     * 这边是我们主要的业务方法,是服务器端给客户端发信息的思路,
     * 在Controller层进行调用,主要是实现在接口被调用时,
     * 对目前在线的客户端进行数据推送
     * @Date 17:33 2022/11/22
     * @Param
     * @return
    **/
    public static void sengInfo(String msg, @PathVariable("sid") String sid) {
        System.out.println("推送信息到窗口" + sid + "推送内容:" + msg);
        //sid不为空就将匹配的信息发给相应客户端
        if (!StringUtils.isEmpty(sid)) {
            copyOnWriteArraySet.get(sid).sendMessage(msg);
        }
        //sid是空的,所有的客户端都发,遍历map中所有的对象,并发送信息
        if (StringUtils.isEmpty(sid)) {
            copyOnWriteArraySet.forEach((key, value) ->
                    value.sendMessage(msg));
        }
    }
}

我在线测试 显示的就是 1006 CLOSE_ABNORMAL

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 11月30日
    • 创建了问题 11月22日

    悬赏问题

    • ¥15 乘性高斯噪声在深度学习网络中的应用
    • ¥15 运筹学排序问题中的在线排序
    • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
    • ¥30 求一段fortran代码用IVF编译运行的结果
    • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
    • ¥15 C++ 头文件/宏冲突问题解决
    • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
    • ¥50 安卓adb backup备份子用户应用数据失败
    • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
    • ¥30 python代码,帮调试,帮帮忙吧