操蛋!新来的同事竟然不会在javaee项目中使用WebSocket~

上一篇:没想到Sharding-Jdbc竟然这么牛逼!一键实现读写分离、分库分表~

作者:集成显卡

来源:https://blog.csdn.net/ssrc0604hx/article/details/41694121

这篇文章是对最近使用WebSocket的一个经验分享。

首先,什么是WebSocket,有兴趣的朋友可以看看这里:http://zh.wikipedia.org/zh-cn/WebSocket

对WebSocket有了基本认识后,我们可以着手开发WebSocket应用程序,推荐使用Maven搭建项目。我使用的服务器是Tomcat 7.0.56(Tomcat 7或者更高版本才能使用WebSocket,而且至少是7.0.47以上版本才支持, LZ一开始用7.0.41部署没有成功...)。WebSocket 还需要javaee7的支持,所以在pom.xml中需要引用一下jar:

<span style="white-space:pre">  </span><dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
        </dependency>




        <dependency>
            <groupId>javax.websocket</groupId>
            <artifactId>javax.websocket-api</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>




        <!-- 增加fastjson-1.1.34.jar -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.1.34</version>
        </dependency>

因为Tomcat自带了websocket-api,所以项目中的 websocket-api是provided,方便编译。

接着可以编写服务端的WebSocket程序,示例代码:

package com.jiepu.visuallab.web.servlet;


import com.alibaba.fastjson.JSON;
import com.jiepu.visuallab.common.C;
import com.jiepu.visuallab.common.bean.SocketReply;
import com.jiepu.visuallab.common.tools.HostTools;


import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;


/**
 *
 * Created by zengxm on 2014/11/4.
 */
@ServerEndpoint("/websocket/test")
public class HostWebSocketServlet {




    private static Map<String, Session> sessions = new HashMap<String, Session>();




    public HostWebSocketServlet(){
        System.out.println("--------------------------------------");
    }




    /**
     * 向客户端群发信息
     * @param category
     * @param data
     */
    public synchronized static void sendAll(String category, Object data){
        SocketReply re = new SocketReply(category, data);
        String replyStr = JSON.toJSONString(re);
        System.out.println("开始群发信息!");
        Set<String> keys = sessions.keySet();
        for(String k:keys){
            Session s = sessions.get(k);
            if(s.isOpen()){
                try{
                    s.getBasicRemote().sendText(replyStr);




                    System.out.println("发送成功, id="+k);
                }catch(Exception e){
                    System.err.println("发送出错:"+e.getMessage());
                }
            }
        }
    }




    @OnMessage
    public void onMessage(Session session, String msg){
        System.out.println("收到信息");
        try {
            session.getBasicRemote().sendText("get");
        }catch (Exception e){
            e.printStackTrace();
        }
    }




    @OnOpen
    public void onOpen(Session session, EndpointConfig config){
        try {
            sessions.put(session.getId(), session);




            SocketReply re = new SocketReply(C.HOST_DATA, HostTools.getHostList());
            String replyStr = JSON.toJSONString(re);




            session.getBasicRemote().sendText(replyStr);
        }catch (Exception e){
            e.printStackTrace();
        }
    }




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




    }




    @OnClose
    public void onClose(Session session, CloseReason reason){
        try {
            System.out.println("断开连接, id="+session.getId());
            synchronized (sessions){
                sessions.remove(session.getId());
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

在html页面中可以这样连接到上面定义好的WebSocket:

var url = "ws://"+document.location.host+"${base}/websocket/test";
    var ws = new WebSocket(url);


    ws.onopen = function(e){
        console.log("ws connect Success!");
        HostUtil.start();


        HostConsole.init();
        listeners.push(HostConsole);
    }


    ws.onmessage = function(evt){
        console.log("ws get:"+evt.data);
    }

上面代码中的${base}就是项目名称,替换成实际的路径即可。将项目部署到tomcat,运行之,在console可以看到连接信息:

530a8724670f7042c05fcf429e63aa62.png

总结

1. 如果环境都搭建好了,运行项目也没报错,但是连接不了WebSocket(js端报404错误),可以看看是不是jar冲突了。就是项目lib里面是不是有websocket-api相关的jar,有的话要删除,不然会跟tomcat自带的websocket冲突,导致服务端程序没有执行。

感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!小编到你上高速。

    · END ·

最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。

正文结束

推荐阅读 ↓↓↓

1.不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

2.如何才能成为优秀的架构师?

3.从零开始搭建创业公司后台技术栈

4.程序员一般可以从什么平台接私活?

5.37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6.IntelliJ IDEA 2019.3 首个最新访问版本发布,新特性抢先看

7.这封“领导痛批95后下属”的邮件,句句扎心!

8.15张图看懂瞎忙和高效的区别!

6235bedd422e3b17aac9368f32d420af.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值