SpringBoot+WebSocket群聊功能完整代码实例

效果图

每一个浏览器打开都会生成一个随机数,当然你也可以通过ip来控制,目的是实现即时通讯的功能.
接下来的代码都是全部的代码,你可以直接拿过来用就行.终极目的是通过简单示例了解他的沟通过程
目前是群发广播,如果想要实现一对一聊天的话,就需要记录userid来区分用户进行广播.也就是点对点的即时通讯.入门建议先走一遍群发广播.

在这里插入图片描述

准备条件

Java首先引入maven-版本根据你的spring-boot版本就行

<!--websocket 即时通讯-->
<dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

配置类

准备config类直接复制就行

import org.springframework.context.annotation.Bean;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * @author hanfeng
 * @date 2022/1/14
 */
@Component
public class WebSocketAutoConfig {

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }

}

WebSocket相应类

此部分是从网上复制过来的比较简单,但我这个是用的jwt令牌鉴权的,所以还需要再写一套鉴权的过程代码,此处只是简单实现.

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * @author hanfeng
 * @date 2022/1/19
 */
@Component
@ServerEndpoint ("/webSocket")
@Slf4j
public class WebSocket {

    private Session session;

    private static CopyOnWriteArraySet<WebSocket> webSocketSet = new CopyOnWriteArraySet<>();

    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        //这里就是我们所提交的token
        //String submitedToken=session.getHandshakeHeaders().get("sec-websocket-protocol").get(0);
        webSocketSet.add(this);
        this.sendMessage("第一次回应消息");
        log.info("【websocket消息】有新的连接, 总数:{}", webSocketSet.size());
    }
    //https://my.oschina.net/xiedeshou/blog/1927371
    @OnClose
    public void onClose() {
        webSocketSet.remove(this);
        log.info("【websocket消息】连接断开, 总数:{}", webSocketSet.size());
    }

    @OnMessage
    public void onMessage(String message) {
        log.info("【websocket消息】收到客户端发来的消息:{}", message);
        this.sendMessage(message);
    }

    public void sendMessage(String message) {
        for (WebSocket webSocket : webSocketSet) {
            log.info("【websocket消息】广播消息, message={}", message);
            try {
                webSocket.session.getBasicRemote().sendText(message);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

前端代码

前端代码之前不是这样,我做了一个小小的完善.

<html>
<head>
    <meta charset="UTF-8">
    <title>websocket测试</title>
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
    <style type="text/css">
        h3,h4{
            text-align:center;
        }
		#messageId{
			width:1070px;
			height:500px;
			margin:0 auto;
			border:1px solid #e5e5e5;
			  background: #ece9e6;
			  background: -webkit-linear-gradient(to bottom, #ffffff, #ece9e6); 
			  background: linear-gradient(to bottom, #ffffff, #ece9e6);
			padding:10px;
			overflow-y:auto;
		}
		#messageId p{
			margin-bottom:8px;
		}
		.wby{
			height:60px;
			resize:none;
			margin-top:10px;
			padding:10px;
		}
		.shuru{
			position:relative;
			width:1090px;
			margin:0 auto;
		}
		.sendMsg{
			position:absolute;
			right:5px;
			bottom:5px;
			width:60px;
			height:25px;
			line-height:25px;
			border:none;
			background-color:green;
			color:#fff;
			border-radius:5px;
		}
    </style>
</head>
<body>

<h3>WebSocket小组聊天室</h3>

<div id = "messageId"></div>
<form onsubmit="return false" action="##" id="formtest">
	<div class="shuru">
		<textarea class="wby" name="msg" cols="150" value="" onkeypress="BindEnter();"></textarea>
		<input class="sendMsg" type="button" value="发送" onclick="sendMessage()" >
	</div>
</form>

<script type="text/javascript" >
    var socket;
	var ceil = Math.ceil(Math.random()*10);
    if (typeof (WebSocket) == "undefined") {
        console.log("遗憾:您的浏览器不支持WebSocket");
    } else {
        console.log("恭喜:您的浏览器支持WebSocket");
        //实现化WebSocket对象
        //指定要连接的服务器地址与端口建立连接
        //注意ws、wss使用不同的端口。我使用自签名的证书测试,
        //无法使用wss,浏览器打开WebSocket时报错
        //ws对应http、wss对应https。
        socket = new WebSocket("ws://127.0.0.1:80/webSocket");
        //连接打开事件
        socket.onopen = function() {
            console.log("Socket 已打开");
            socket.send('<p style="color:#999;text-align:center;font-size:3px">'+ceil+"号:加入群聊"+'</p>');
        };
        //收到消息事件
        socket.onmessage = function(msg) {
            $("#messageId").append('<p style="font-size:15px">'+ msg.data+'</p>');
            console.log(msg.data);
        };
		 //发送消息事件
        socket.sendMessage = function(msg) {
			socket.send(ceil+"号: "+msg);
            $(".wby").val('');
        };
        //连接关闭事件
        socket.onclose = function() {
            console.log("Socket已关闭");
        };
        //发生了错误事件
        socket.onerror = function() {
            alert("Socket发生了错误");
        }
        //窗口关闭时,关闭连接
        window.unload=function() {
            socket.close();
        };
    }
	
	function sendMessage() {
		var msg = $("textarea[name='msg']").val();
		socket.sendMessage(msg);
	}
	
	function BindEnter(e){
		var evt  = window.event || e;
		if(evt.keyCode == 13){
			//回车事件
			var msg = $("textarea[name='msg']").val();
			socket.sendMessage(msg);
		}
	}
</script>

</body>
</html>

WebSocket客户端和服务端实例源码 WebSocket ws实例 HTML5 用java实现的服务端 Websocket与服务器的正常通信 众所周知,Web 应用的交互过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给客户端,客户端浏览器将信息呈现,这种机制对于信息变化不是特别频繁的应用尚可,但对于实时要求高、海量并发的应用来说显得捉襟见肘,尤其在当前业界移动互联网蓬勃发展的趋势下,高并发与用户实时响应是 Web 应用经常面临的问题,比如金融证券的实时信息,Web 导航应用中的地理位置获取,社交网络的实时消息推送等。 传统的请求-响应模式的 Web 开发在处理此类业务场景时,通常采用实时通讯方案,常见的是: 轮询,原理简单易懂,就是客户端通过一定的时间间隔以频繁请求的方式向服务器发送请求,来保持客户端和服务器端的数据同步。问题很明显,当客户端以固定频率向服务器端发送请求时,服务器端的数据可能并没有更新,带来很多无谓请求,浪费带宽,效率低下。 基于 Flash,AdobeFlash 通过自己的 Socket 实现完成数据交换,再利用 Flash 暴露出相应的接口为 JavaScript 调用,从而达到实时传输目的。此方式比轮询要高效,且因为 Flash 安装率高,应用场景比较广泛,但在移动互联网终端上 Flash 的支持并不好。IOS 系统中没有 Flash 的存在,在 Android 中虽然有 Flash 的支持,但实际的使用效果差强人意,且对移动设备的硬件配置要求较高。2012 年 Adobe 官方宣布不再支持 Android4.1+系统,宣告了 Flash 在移动终端上的死亡。 从上文可以看出,传统 Web 模式在处理高并发及实时性需求的时候,会遇到难以逾越的瓶颈,我们需要一种高效节能的双向通信机制来保证数据的实时传输。在此背景下,基于 HTML5 规范的、有 Web TCP 之称的 WebSocket 应运而生。 早期 HTML5 并没有形成业界统一的规范,各个浏览器和应用服务器厂商有着各异的类似实现,如 IBM 的 MQTT,Comet 开源框架等,直到 2014 年,HTML5 在 IBM、微软、Google 等巨头的推动和协作下终于尘埃落地,正式从草案落实为实际标准规范,各个应用服务器及浏览器厂商逐步开始统一,在 JavaEE7 中也实现了 WebSocket 协议,从而无论是客户端还是服务端的 WebSocket 都已完备,读者可以查阅HTML5 规范,熟悉新的 HTML 协议规范及 WebSocket 支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值