websocket实时聊天(一)

 今天简单看了一下webscoket的相关内容,写了一个入门demo,简单记录一下。

1、服务端

  服务端使用springboot来搭建,引入spring-boot-starter-websocket模块,以及web模块来做页面。页面使用简单的thymeleaf模板。

  • 配置websocket

服务的配置websocket需要先定义WebSocketExporter的bean,使用默认的构造方法即可。

package com.chat.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

@Configuration
public class WebSocketConfig {

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {

        return new ServerEndpointExporter();
    }
}
  • 创建websocket服务

创建websocket服务主要需要处理创建连接、发送消息、断开连接、发生错误这几种情况的逻辑。

package com.chat.bean;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArraySet;

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 org.springframework.stereotype.Component;

@ServerEndpoint(value="/sunSocket")
@Component
public class SunWebSocket {

    /**
     * 记录在线链接数
     */
    private static int onLineNum = 0;

    /**
     * concurrent包的线程安全set,存放每个客户端连接对应的webSocket对象。
     */
    private static CopyOnWriteArraySet<SunWebSocket> webSocketSet = new CopyOnWriteArraySet<>();

    /**
     * 与某个客户端的会话,通过会话给客户端传递消息
     */
    private Session session;

    /**
     * 开启一个客户端对话连接
     * @param session
     */
    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        webSocketSet.add(this);
        addOnlineCount();
        sendMsg("欢迎加入聊天室", session);
    }

    /**
     * 当连接断开时调用的方法
     * @param session
     */
    @OnClose
    public void onClose(Session session) {
        webSocketSet.remove(this);
        subOnlineCount();
        System.out.println("有人走了");
    }

    /**
     * 当有来自客户端的消息时
     * @param msg
     * @param session
     */
    @OnMessage
    public void onMessage(String msg,Session session) {
        Map<String, String> map = new HashMap<>();
        map.put("ip",session.getId());
        map.put("msg",msg);
        for (SunWebSocket sunWebSocket : webSocketSet) {
            try {
                sunWebSocket.session.getBasicRemote().sendText(session.getId() + ":" + msg);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @OnError
    public void onError(Session session,Throwable error) {

        try {
            session.getBasicRemote().sendText(error.getMessage());
        } catch (IOException e) {
            error.printStackTrace();
            e.printStackTrace();
        }
    }

    public void sendMsg(String msg, Session session) {

        try {
            session.getBasicRemote().sendText(msg);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

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

    public static synchronized void addOnlineCount() {
        onLineNum++;
    }

    public static synchronized void subOnlineCount() {
        onLineNum--;
    }
}

启动springboot服务后台内容即完成。

2、客户端

demo的客户端使用html5的websocket来编写。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>在线聊天</title>
<style type="text/css">
#msg-view{

    height: 400px;
    overflow: scroll;
}
</style>
</head>
<body>
    <div id="msg-view">

    </div>
    <div id="msg-input">
        <input id="msg"/>
        <button id="sendBtn" onclick="sendMsg()">发送</button>
    </div>
    <script type="text/javascript">

    var websocket = null;
    if(‘WebSocket‘ in window){
        websocket = new WebSocket("ws://localhost:8080/sunSocket")
    }
    else{
        alert(‘Not support websocket‘)
    }

    websocket.onmessage = function (event) {

        var data = event.data;
        if(typeof(data) == ‘string‘){
            showMsg(data)
        }else{
            showMsg(data.ip + ‘:‘ + data.msg)
        }
    }
    /* 页面关闭监听 */
    window.onbeforeunload = function(){
        websocket.close();
    }
    /**
     *    错误情况
     */
    websocket.onerror = function () {
        showMsg(‘连接异常‘)
    }

    function sendMsg() {
        var msg = document.getElementById(‘msg‘).value;
        websocket.send(msg)
    }

    function showMsg(msg) {
        document.getElementById(‘msg-view‘).innerHTML += msg + ‘<br/>‘;
    }
    </script>
</body>
</html>

原文地址:https://www.cnblogs.com/sunleaf/p/11082524.html

时间: 2024-10-12 16:50:30

websocket实时聊天(一)的相关文章

Node.js websocket 使用 socket.io库实现实时聊天室

认识websocket WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duple).一开始的握手需要借助HTTP请求完成. 其实websocket 并不是很依赖Http协议,它也拥有自己的一套协议机制,但在这里我们需要利用的socket.io 需要依赖到http . 之前用java jsp写过一个聊天,其实实现逻辑并不难,只是大部分时间都用在UI的设计上,其实现原理就是一个基于websocket的通信,要想做一个好的聊天室,我觉得大部

Python项目实战教程:web实时聊天室项目

新课强力来袭:基于Node.js的web实时聊天室项目! 麦子学院新课以马踏飞燕般的速度生粗来啦(*^__^*) .小伙伴们你萌确定不来一发吗? 啦啦啦--上图镇楼↓↓↓ 那些神奇的传送门→_→ 本课程:http://www.maiziedu.com/course/others/597-8698/ 李大大主页:http://www.maiziedu.com/group/common/course/59404/ 这里是正儿八经的课程介绍(快看快看o( ̄ヘ ̄o#)): 网站实时通讯一体化解决方案,采

使用Node.js+Socket.IO搭建WebSocket实时应用

Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. 作者:潘良虎链接:https://www.zhihu.com/question/20215561/answer/26419995来源:知乎原文地址:http://www.plhwin.com/2014/05/28/nodejs-socketio/ WebSocket简介 谈到Web实时推送,就不得不说

在Java7与Tomcat8环境下使用WebSocket实现聊天的示例

文中案例在apache-tomcat-8.0.15和jdk1.8.0_25环境下开发,运行.不过标题上是Java7,并不造成影响,代码中没有涉及任何与jdk1.8.x相关的代码.另外之所以要讲清软件版本,一是为了保证案例能够有个明确的实现背景,二是websocket实现tomcat7.x与tomcat8.x有很大差异. 在JavaEE规范集中我们这里主要看Java API for WebSocket(JSR 356).Websocket-api提供了Java实现Websocket的接口,其中最重

一个关于vue+mysql+express的全栈项目(五)------ 实时聊天部分socket.io

一.基于web端的实时通讯,我们都知道有websocket,为了快速开发,本项目我们采用socket.io(客户端使用socket.io-client) Socket.io是一个WebSocket库,包括了客户端的js和服务器端的nodejs,它的目标是构建可以在不同浏览器和移动设备上使用的实时应用.它会自动根据浏览器从WebSocket.AJAX长轮询.Iframe流等等各种方式中选择最佳的方式来实现网络实时应用,非常方便和人性化,而且支持的浏览器最低达IE5.5 socket.io特点: 实

基于django channel 实现websocket的聊天室

websocket ? 网易聊天室? ? web微信? ? 直播? 假如你工作以后,你的老板让你来开发一个内部的微信程序,你需要怎么办?我们先来分析一下里面的技术难点 消息的实时性? 实现群聊 现在有这样一个需求,老板给到你了,关乎你是否能转正?你要怎么做? 我们先说消息的实时性,按照我们目前的想法是我需要用http协议来做,那么http协议怎么来做那? 是不是要一直去访问我们的服务器,问服务器有没有人给我发消息,有没有人给我发消息?那么大家认为我多长时间去访问一次服务比较合适那? 1分钟1次?

基于swoole的网页一对一实时聊天

需求分析 网站上实现一对一即时沟通,能查看聊天记录以及离线留言,新消息提醒. 核心技术 html5的websocket,php的swoole扩展http://wiki.swoole.com/ 数据表 CREATE TABLE `msg` ( `id` int(11) NOT NULL AUTO_INCREMENT, `content` varchar(255) NOT NULL DEFAULT '' COMMENT '内容', `tid` int(11) NOT NULL DEFAULT '0'

【使用SignalR+Asp.net创建实时聊天应用程序】

一.概述: 使用 ASP.NET 那么 SignalR 2 创建一个实时聊天应用程序.将 SignalR 添加 MVC 5 应用程序中,并创建聊天视图发送并显示消息. 在Demo中,将学习SignalR 开发任务包括 ︰ 向 MVC 5 应用程序添加那么 SignalR 图书馆. 创建集线器和浩然启动类,以将内容推送到客户端. 使用 web 页中的那么 SignalR jQuery 库发送邮件并显示更新从集线器. 下面的屏幕快照显示在浏览器中运行的已完成的聊天应用程序. 2.实现: 创建一个 A

Spring之WebSocket网页聊天以及服务器推送

Spring之WebSocket网页聊天以及服务器推送 转自:http://www.xdemo.org/spring-websocket-comet/ /Springframework /Spring之WebSocket网页聊天以及服务器推送 1. WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duplex). 2. 轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客服端