WebSocket实现线上聊天就是这么简单!

简介: WebSocket实现线上聊天就是这么简单!

线上聊天是不是感觉很有意思,为什么他发的消息我能实时收到,有没有想过,做一个服务,让自己的小伙伴用自己的应用聊天呢?
今天我们来一起聊聊,WebSocket实现线上聊天的功能!这个项目时基于jdk1.8,springboot来做的。

引入依赖

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

WebSocket.java

@Slf4j
@Component
@ServerEndpoint(value = "/WebSocket/{user}")
public class WebSocket {

    /**
     * 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
     */
    private static final AtomicInteger OnlineCount = new AtomicInteger(0);

    /**
     * concurrent包的线程安全Set,用来存放每个客户端对应的WebSocket对象。
     */
    private static CopyOnWriteArraySet<WebSocket> webSocketSet = new CopyOnWriteArraySet<WebSocket>();

    /**
     * 与某个客户端的连接会话,需要通过它来给客户端发送数据
     */
    private Session session;

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(@PathParam("user")String user, Session session) {
        log.info("新客户端连入,用户id:" + user);
        this.session = session;
        //加入set中
        webSocketSet.add(this);
        addOnlineCount(); // 在线数加1
        if(user!=null) {
            List<String> totalPushMsgs = new ArrayList<String>();
            totalPushMsgs.add(user + "连接成功");
            if(totalPushMsgs != null && !totalPushMsgs.isEmpty()) {
                totalPushMsgs.forEach(e -> sendMessage(e));
            }
        }
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        log.info("一个客户端关闭连接");
        //从set中删除
        webSocketSet.remove(this);
        // 在线数减1
        subOnlineCount();
    }

    /**
     * 收到客户端消息后调用的方法
     * @param message
     * 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        log.info("用户发送过来的消息为:" + message);
    }

    /**
     * 发生错误时调用
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("websocket出现错误");
        error.printStackTrace();
    }

    public void sendMessage(String message) {
        try {
            this.session.getBasicRemote().sendText(message);
            log.info("推送消息成功,消息为:" + message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 群发自定义消息
     */
    public void sendInfo(String message) {
        for (WebSocket webSocket : webSocketSet) {
            webSocket.sendMessage(message);
        }
    }

    public static synchronized int getOnlineCount() {
        return OnlineCount.get();
    }

    public static synchronized void addOnlineCount() {
        // 在线数加1
        OnlineCount.incrementAndGet();
    }

    public static synchronized void subOnlineCount() {
        // 在线数加1
        OnlineCount.decrementAndGet();
    }
}

后端任务结束了,我们来测试下吧,找个谷歌浏览器,按F12,会出现控制台,如图:

640.png

在红色箭头写下一下内容回车就会连接上。

var ws = new WebSocket('ws://localhost:8080/WebSocket/zy');

640.png

控制台输出如下:

640-1.png
这代表我们已经连上服务了。

怎么从后端发信息给链接的客户端呢?这里木有具体应用,我们就写个定时器然后让它定时发送消息给客户端。

SpringScheduled.java


@Slf4j
@Component
public class SpringScheduled {

    @Autowired
    private WebSocket webSocket;

    @Scheduled(cron="30 * * * * ?")
    public void sendElectricSystemHtDto() throws InterruptedException {

        ProblemAndAnswer listen = new ProblemAndAnswer();
        listen.setType("L");
        listen.setMessage("听的动作!");
        webSocket.sendInfo(JSONObject.toJSONString(listen));
        Thread.sleep(1500);

        ProblemAndAnswer problem = new ProblemAndAnswer();
        problem.setType("P");
        problem.setMessage("自我介绍!");
        webSocket.sendInfo(JSONObject.toJSONString(problem));

        Thread.sleep(2500);
        ProblemAndAnswer answer = new ProblemAndAnswer();
        answer.setType("A");
        answer.setMessage("您好!我是人工智能小A,有什么是可以帮您吗?");
        webSocket.sendInfo(JSONObject.toJSONString(answer));
    }
}

测试结果:

640.png

这个是群体发送消息,如同广播,当然也可是点对点,这边就介绍这么多吧!剩下的就靠各位探讨了。

相关文章
|
4月前
使用uniapp实现websocket聊天功能
使用uniapp实现websocket聊天功能
|
11月前
|
Python
PyQt5链接WebSocket,可以实现简易QQ聊天
PyQt5链接WebSocket,可以实现简易QQ聊天
182 0
|
4月前
|
前端开发
t-io websocket的聊天功能学习记录(二)
t-io websocket的聊天功能学习记录(二)
62 0
|
4月前
t-io websocket的聊天功能学习记录(一)
t-io websocket的聊天功能学习记录(一)
74 0
|
4月前
|
资源调度 JavaScript 前端开发
❤Nodejs 第十五章(简单websocket聊天实现)
【4月更文挑战第15天】本文介绍了在Node.js中实现简单WebSocket聊天的过程。首先通过`yarn`创建项目并安装`ws`和`express`依赖。接着,编写`WebSocketServer.js`建立WebSocket服务器,处理客户端连接、消息收发及错误。然后,用`server.js`创建一个静态文件服务器,提供`index.html`。`index.html`包含客户端的WebSocket连接和消息处理。启动两个服务器后,可以在浏览器中打开`index.html`进行聊天。最后,讨论了在Node.js 20+Vite环境下使用WebSocket时可能遇到的问题
48 0
|
Java
基于Tomcate、java、websocket 简单在线聊天
基于Tomcate、java、websocket 简单在线聊天
101 0
|
移动开发 监控 网络协议
基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)
基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)
|
存储 JavaScript 前端开发
SpringBoot集成WebSocket实现及时通讯聊天功能!!!
SpringBoot集成WebSocket实现及时通讯聊天功能!!!
310 0
|
前端开发 Java 应用服务中间件
SpringBoot整合Netty搭建高性能Websocket服务器(实现聊天功能)
之前使用Springboot整合了websocket,实现了一个后端向前端推送信息的基本小案例,这篇文章主要是增加了一个新的框架就是Netty,实现一个高性能的websocket服务器,并结合前端代码,实现一个基本的聊天功能。你可以根据自己的业务需求进行更改。 这里假设你已经了解了Netty和websocket的相关知识,仅仅是想通过Springboot来整合他们。根据之前大家的需求,代码已经上传到了github上。在文末给出。 废话不多说,直接看步骤代码。
1776 0
SpringBoot整合Netty搭建高性能Websocket服务器(实现聊天功能)
|
开发框架 JavaScript 前端开发
如何使用SpringBoot和Netty实现一个WebSocket服务器,并配合Vue前端实现聊天功能?
如何使用SpringBoot和Netty实现一个WebSocket服务器,并配合Vue前端实现聊天功能?
279 0