WebSocket通信,多客户端数据同时发送

3 篇文章 0 订阅
1 篇文章 0 订阅

WebSocket通信,多客户端数据同时发送

目标:当一个客户端改变了某项数据后,其他的客户端都可以通过 WebSocket方式 看到新的数据。
单浏览器推送

需要用到的pom坐标:

<dependency>
  	<groupId>javax.websocket</groupId>
  	<artifactId>javax.websocket-api</artifactId>
  	<version>1.0-rc5</version>
  	<scope>provided</scope>
</dependency> 
<dependency>
	<groupId>org.springframework</groupId>
  	<artifactId>spring-websocket</artifactId>
  	<version>4.3.16.RELEASE</version>
</dependency>

页面:

<div>
    <input type="button" value="发送数据" onclick="send('黎明')"/> <input type="button" value="关闭连接" onclick="onClose()"/>
    <div id="ht" style="font-size: 15px;"></div>
</div>

<script type="text/javascript">
    let webSocket;
    if ('WebSocket' in window) {
        webSocket = new WebSocket('ws://localhost:8088/你的项目名/coverSocket');
    } else if ('MozWebSocket' in window) {
        webSocket = new MozWebSocket('ws://localhost:8088/你的项目名/coverSocket');
    } else {
        console.log('此浏览器暂不支持webSocket');
    }
    if (webSocket != null) {
        webSocket.onopen = function (event) {
            onOpen(event)
        };
        webSocket.onclose = function () {
            onClose()
        };
        webSocket.onerror = function (event) {
            onError(event)
        };
        webSocket.onmessage = function (event) {
            onMessage(event)
        };
        //监听窗口关闭
        window.onbeforeunload = function () {
            webSocket.close();
        };
    }

    function onOpen(event) {
        console.info("WebSocket连接打开" + event);
    }

    function onClose() {
      	webSocket.close();
        console.info("WebSocket连接关闭");
    }

    function onError(event) {
        console.info("WebSocket发生错误" + event);
    }

    //接收数据
    function onMessage(event) {
        $('#ht').append('<br>' + event.data)
    }

    //发送数据
    function send(st) {
        return webSocket.send(st);
    }
</script>

java类:

import org.springframework.stereotype.Component;
import org.springframework.web.socket.server.standard.SpringConfigurator;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

//configurator = SpringConfigurator.class 通过这个类,该WebSocket中就可以注入Spring容器的bean。
@ServerEndpoint(value = "/coverSocket", configurator = SpringConfigurator.class)
public class WebSocketServer {

	//你注入的BeanService
	@Autowired
    private BeanService beanService;

    @OnOpen
    public void onOpen(Session session) {
        String id = session.getId();
        System.err.println("通道打开"+id);
    }
    @OnClose
    public void onClose(Session session) {
        String id = session.getId();
        System.err.println("通道关闭"+id);
    }
    @OnError
    public void onError(Session session,Throwable error){
        System.err.println("WebSocket发生错误");
        error.printStackTrace();
    }

    @OnMessage
    public void onMessage(String message, Session session) throws IOException, InterruptedException {
    	//你业务层操作的方法
    	MyBean bean = beanService.getByUniqueKey("xx","xx", MyBean .class);
        session.getBasicRemote().sendText("欢迎您:"+bean.toString());
    }
}
  • 这种是最基本的从库里查数据然后推送给一个浏览器,就不解释了。
  • 如果要实现从一个浏览器中点击按钮,给多个浏览器推送数据,怎么实现呢?
  • 那就需要把浏览器和服务端的通信保存起来(session),每次有数据传输时,都把session取出来,然后发送数据。
  • 注意:这个session不是平时保存用户信息的servlet session,而是websocket的session。
多浏览器同步推送

前端需要修改的代码如下:

function myBrowser(){
        let userAgent = navigator.userAgent; //取得浏览bai器du的userAgent字符串
        let isOpera = userAgent.indexOf("Opera") > -1;
        if (isOpera) {
            return "Opera"
        } //判断zhi是否Opera浏览器
        if (userAgent.indexOf("Firefox") > -1) {
            return "Firefox";
        } //判断是否Firefox浏览器
        if (userAgent.indexOf("Chrome") > -1){
            return "Chrome";
        }
        if (userAgent.indexOf("Safari") > -1) {
            return "Safari";
        } //判断是否Safari浏览器
        if (userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera) {
            return "IE";
        } //判断是否IE浏览器
    }
    //需要修改的部分
 webSocket = new 
 WebSocket('ws://localhost:8088/你的项目名/coverSocket/'+myBrowser());
  • 需要传一个值用来区分每一个浏览器的标识
  • 这里我用了谷歌和火狐两个浏览器测试,就加了一个方法获取当前浏览器的标识,把这个标识传给后台。

后台修改后的代码

//configurator = SpringConfigurator.class 通过这个类,该WebSocket中就可以注入Spring容器的bean。
@ServerEndpoint(value = "/coverSocket/{name}", configurator = SpringConfigurator.class)
@Component
public class WebSocketServer {

	//你注入的业务Service
    @Autowired
    private BeanService BeanService;

	//存放用户信息的map
    private Map<String,Session> concurrentHashMap=new ConcurrentHashMap<>();

    @OnOpen
    public void onOpen(@PathParam("name")String name, Session session) {
        concurrentHashMap.put(name,session);
        String id = session.getId();
        System.err.println("通道打开"+id);
    }

    @OnClose
    public void onClose(@PathParam("name")String name,Session session) {
        concurrentHashMap.remove(name);
        String id = session.getId();
        System.err.println("通道关闭"+id);
    }

    @OnError
    public void onError(Session session,Throwable error){
        System.err.println("WebSocket发生错误");
        error.printStackTrace();
    }

    @OnMessage
    public void onMessage(String message, Session session) throws IOException, InterruptedException {
        //你业务层操作的方法
    	MyBean bean = beanService.getByUniqueKey("xx","xx", MyBean .class);
        for(Map.Entry<String,Session> user:concurrentHashMap.entrySet()){
        	//这里可以开启线程发送数据更好
            user.getValue().getBasicRemote().sendText("欢迎您:"+bean.toString());
        }
    }
  • 添加了一个类对象ConcurrentHashMap,作用就是把每个连接的客户端信息存放到这个Map里
  • 在注解@ServerEndpoint定义一个参数name,并在open和close方法接收了这个参数,就是每次webSocket开启链接过关闭连接时,都根据这个参数把客户端信息存放到Map里,就是客户端的标识。
  • onMessage方法里面的就是循环将Map里的用户信息取出来并输出数据到前端。
  • 一定要加@Component,因为我这里测试多客户端使用的是同一个对象,否则每次调用都会创建不同的对象,那样就存不住客户端信息了。

同时用谷歌和火狐打开此页面,点击火狐的 发送数据按钮,发现火狐和谷歌都接受到了数据,测试成功!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity是一款流行的跨平台游戏引擎,它也提供了一套完整的网络通信解决方案,包括支持WebSocket协议的服务器和客户端应用程序。 在Unity中,可以使用WebSocket Sharp这个第三方插件来实现WebSocket通信WebSocket Sharp是一个开源的C#实现的WebSocket协议库,它可以让我们在Unity中轻松地创建WebSocket服务器和客户端应用程序。 对于WebSocket服务器,我们可以在Unity中创建一个新的C#脚本,并使用WebSocket Sharp库来编写服务器端逻辑。我们可以定义连接、断开连接时的回调函数,并处理接收到的消息。服务器可以与多个客户端建立连接,并通过WebSocket协议进行双向通信。例如,我们可以使用WebSocket服务器在游戏中实现多人联机功能,让多个客户端之间进行实时的数据交互。 对于WebSocket客户端,我们同样可以使用WebSocket Sharp库来创建。在Unity中,我们可以创建一个新的C#脚本,使用WebSocket Sharp库来编写客户端的逻辑。客户端可以连接到一个WebSocket服务器,并发送消息给服务器,也可以接收服务器端发送过来的消息。客户端可以在游戏中与其他玩家或服务器进行实时通信,或者接收实时更新的数据。 总的来说,Unity提供了强大的网络通信解决方案,包括WebSocket服务器和客户端应用程序。借助WebSocket Sharp库,我们可以用C#在Unity中开发WebSocket服务器和客户端,并通过WebSocket协议实现实时通信数据交互。这为我们开发基于网络的游戏和应用程序提供了很大的便利和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值