通过实现简单聊天室了解websocket的基础使用

news/2024/7/19 12:55:22 标签: java, websocket, js

websocket_0">websocket基础使用

用到的依赖包
  • websocket的依赖

    <dependency>
    	<groupId>javax.websocket</groupId>
        <artifactId>javax.websocket-api</artifactId>
        <version>1.1</version>
        <scope>provided</scope>
    </dependency>
    
  • json-lib的依赖

    <dependency>
    	<groupId>net.sf.json-lib</groupId>
        <artifactId>json-lib</artifactId>
        <version>2.4</version>
    </dependency>
    
    服务端代码实现
  • 服务端需要Servlet3.0的注解

    @ServerEndpoint("/websocket/{name}") : 用于标记该类为websocket服务端类

    name用于记录当前websocket是谁,用于区分连接的用户

    servlet是单例对象,websocket是多里对象,因为他需要实时连接,与要知道每个连接是谁
    (解释都在注释里,不多赘述)

    java">public class WebSocket {
        private String name;//用于记录当前websocket是谁,用于区分连接的用户
        private Session session; //webSocket中的session 链接,用于记录当前的连接
        
        private static Map<String,WebSocket> allClients = new HashMap<>();
        
        public Session getSession(){
            //...
        }
        
        public void setSession() {
            //...
        }
        
        /**
          *
          * @param name 嗲表地址参数中的name
          * @param session 当前建立的链接
          */
        @OnOpen  //标志建立连接的注释
        public void openConnection(@PathParam("name") String name,Session session){
            this.name = name;
            this.session = session;
            allClients.put(name,this);//将name与webSocket绑定
        }
        
        /**
          * 当服务器接受到消息时触发
          * @param message 
          * @param session 当前建立的链接
          */
        @OnMessage //用于接收客户端发来的消息,这个地方应该根据自己的实际业务需求,来决定到底写什么
        public void onMessage(Session session,String message) {
            //1.首先解析发过来的内容,找到目标接收者:通过名字找到名字对应的websocket对象,获取websocket对象中的session,创建一个固定容器用于存放对应key-value值:String-WebSocket
            JSONObject jsonObject  JSONObject.fromObject(message);
            
            //与前端约定,接收者为toUser,发送信息内容为toMessage
            String to = jsonObject.getString("toUser");//找到接收者
            String toMessage = jsonObject.getString("toMessage");//获取到发送的内容
            //2.根据目标接收者,找到它的session链接
            WebSocket webSocket = allClients.get(to);//获取到目标接收者的webSocket
            //3.通过session发消息
            if(WebSocket != null){
                Session toSession = webSocket.getSession();//获取到服务器和目标接收者的链接
    			if(toSession.isOpen()) {
                    //toSession为要发送的目标者,getAsyncRemote获得链接的相对的另一端
                    toSession.getAsyncRemote().sendText(toMessage);
                }
            }else {
                //正常来说应该缓存这个消息,这里我就直接发送留言,对方不在线
                session.getAsyncRemote().sendText("对方不在线");
            }
           
        }
        
        /**
          * 当服务器发生异常时触发
          * @param e 可抛出的异常
          * @param session 哪个链接出现了异常
          */
        @OnError
        public void onError(Session session,Throwable e) {
            
        }
        
        /**
          * 当链接关闭的时候触发
          * @param e 可抛出的异常
          * @param session 哪个链接出现了异常
          */
        @OnClose
        public void onClose(Session session){
            
        }
        
    }
    
    js_119">客户端js代码
    javascript">var websocket = null;
    
    //-------------===客户端获取websocekt链接===-----------------
    function connection(){
        var username="";//对应服务端的name TODO:更具具体情况获得一个username用于表示当前的链接
        //首先判断当前浏览器是否支持websocket
        if('WebSocket' in window) {
            //创建websocket
            websocket = new WebSocket("ws://"+document.location.host+"/websocket"+username);
        }else{
            alert('当前浏览器不支持websocket');
        }
        
        //建立链接的回调
        websocket.onopen = function() {
            console.log("链接建立了")
        }
        
        //收到消息时
        websocket.onmessage = function(event) {
           	//获得消息,并打印
            console.log(event.data)
        }
        
        websocket.onerror = function() {
            console.log("出现异常了")
        }
        
        websocket.onclose = function() {
            console.log("链接关闭了")
        }
        
        //当浏览器的页面窗口关闭的时候,此时应该关闭链接,防止服务器出现异常
        window.onbeforeunload = = function() {
            if (websocket!=null){
                websocket.close();
            }
        }
    }
    
    //------------==发送消息==-----------
    function sendMessage(){
        //1.获取到发送给谁
        var toUser = "";//Dom操作,此处省略了
        //2.获取到发送的内容
        var toMessage = ""//Dom操作,此处省略了
        
        if(websocket!=null) {
           	//拼json串
            var message = "{'toUser':"+toUser+","+"'toMessage':"+toMessage+"}";//发送json串
            websocket.send(message);
        }
    }
    

http://www.niftyadmin.cn/n/842903.html

相关文章

Oracle 12c 新特性之 temp undo

Oracle 12c R1 之前&#xff0c;临时表生成的undo记录是存储在undo表空间里的&#xff0c;通用表和持久表的undo记录也是类似的。而在 12c R12 的临时 undo 功能中&#xff0c;临时 undo 记录可以存储在一个临时表中&#xff0c;而无需再存储在 undo 表空间内。临时表的UNDO信息…

es java api 创建索引结构_ES15-JAVA API 索引管理

1.创建连接创建连接demopackage com.sean.esapi.client;import java.net.InetSocketAddress;import org.elasticsearch.action.get.GetResponse;import org.elasticsearch.client.transport.TransportClient;import org.elasticsearch.common.settings.Settings;import org.ela…

通过loosejar清理应用中冗余的jar包

随着应用规模的逐渐增大&#xff0c;依赖的jar包数量也大幅添加。当中不乏多余的&#xff0c;用不到的jar包&#xff0c;占用了大量的宝贵空间。通过loosejar这个工具。便可轻松找到“滥竽充数”的jar包了~loosejar的工作原理是利用classloader。由于应用在执行的时候&#xff…

Java的动态代理

Java的动态代理 动态代理&#xff1a; 特点&#xff1a;字节码随用随创建&#xff0c;随用随加载 作用&#xff1a;不修改源码的基础上对方法增强 分类&#xff1a; 基于接口的动态代理 基于子类的动态代理 一、java基于接口的动态代理 基于接口的动态代理&#xff1a;涉及的…

java滞后联编_Java语言优势是什么

Java语言优势是什么在日新月异的IT世界&#xff0c;Java算的上计算机领域一门古老的语言了&#xff0c;在当今信息化社会中发挥了举重轻重的作用&#xff0c;不管你对Java是怎样一个态度&#xff0c;有一点不可否认&#xff0c;Java是现在全球最时髦的开发工具之一。Java能存在…

spring的aop配置方法及注意细节

spring的aop使用方法 spring的aop是用通过动态代理的方式实现的 Java的动态代理有两种实现方式&#xff0c;不了解动态代理的可以看这里 一、AOP相关术语 Joinpoint(连接点)&#xff1a;所谓连接点就是指那些被拦截到的点。再spring中&#xff0c;这些点指的是方法&#xff…

jquery刷新页面的实现代码(局部及全页面刷新)

局部刷新&#xff1a; 这个方法就多了去了&#xff0c;常见的有以下几种&#xff1b; $.get方法&#xff0c;$.post方法&#xff0c;$.getJson方法,$.ajax方法如下 前两种使用方法基本上一样 下面介绍全页面刷新方法&#xff1a;有时候可能会用到 window.location.reload()刷新…

《Python自动化运维:技术与最佳实践》一1.3 DNS处理模块dnspython

本节书摘来自华章出版社《Python自动化运维&#xff1a;技术与最佳实践》一书中的第1章&#xff0c;第1.3节&#xff0c;作者 &#xff08;美&#xff09;Neil Bergman &#xff0c;更多章节内容可以访问云栖社区“华章计算机”公众号查看 1.3 DNS处理模块dnspython dnspython…