Websocket相遇、相知、相爱、相杀(附源码和在线演示)

本人博客全部迁至个人博客,柒情博客:http://www.ityw.club ,后续所有博客将在柒情博客上进行更新。

一、相遇

某天发现某个网站有可以检测IP的功能,能检测出IP是否高匿、延时、地区,恰好前不久做了能提取IP的项目,正好可以利用这个接口提高我们使用IP的质量,咋办呢?

打开我们的Fiddler盘它!

fd:努力工作中!

我:啥? 没数据 没数据  fd坏了? 打开浏览器调试一波

浏览器:努力工作中!

我:啥? 还是没数据? 今天见鬼了?

让我郁闷了好久,平时所向无敌的FD大法失效了,本来还以为是那个网站随机返回的假数据,于是机智的我看了下源码,嘿嘿嘿,总算让我抓住了今天我们的主角 “webSocket”,原来那个网站在进页面的时候就直接用webSocket和服务器建立了长连接,所以我们就抓不到包啦,主角找出来了 大结局吧! 不不不 害我郁闷这么久 继续盘它。

二、相知

于是开始疯狂百度谷歌中,终于发现了一篇通俗易懂有意思的文章,也发现了一位发型很有型的实战大佬。

想和webSocket相知的 进去和webSocket交流下感情吧,通道如下:

有趣的灵魂大佬:https://www.zhihu.com/question/20215561

实战大佬:https://www.cnblogs.com/xdp-gacl/p/5193279.html

三、相爱

简单的和webSocket交流了下感情,发现webSocket还是挺有魅力的,于是我决定继续盘它,毕竟滴水之恩须涌泉相报嘛。

下面我们开始用webSocket做个小小的聊天室吧,来上我们的祖传代码!

1.项目结构图

Websocket相遇、相知、相爱、相杀(附源码和在线演示)_第1张图片

2.在pom.xml中引入我们的jar包


    javax
    javaee-api
    8.0
    provided

3.后端代码

/**
 * @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,
 * 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
 */
@ServerEndpoint("/websocket")
public class WebSocket {
    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
    private static int onlineCount = 0;

    //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
    private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet();

    //与某个客户端的连接会话,需要通过它来给客户端发送数据
    private Session session;

    /**
     * 连接建立成功调用的方法
     * @param session  可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
     */
    @OnOpen
    public void onOpen(Session session){
        this.session = session;
        webSocketSet.add(this);     //加入set中
        addOnlineCount();           //在线数加1
        //更新页面在线人数
        for(WebSocket item: webSocketSet){
            try {
                item.sendMessage(String.valueOf(getOnlineCount()));
            } catch (IOException e) {
                e.printStackTrace();
                continue;
            }
        }
        System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(){
        webSocketSet.remove(this);  //从set中删除
        subOnlineCount();           //在线数减1
        //更新页面在线人数
        for(WebSocket item: webSocketSet){
            try {
                item.sendMessage(String.valueOf(getOnlineCount()));
            } catch (IOException e) {
                e.printStackTrace();
                continue;
            }
        }
        System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
    }

    /**
     * 收到客户端消息后调用的方法
     * @param message 客户端发送过来的消息
     * @param session 可选的参数
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("来自客户端的消息:" + message);
        //群发消息
        for(WebSocket item: webSocketSet){
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                e.printStackTrace();
                continue;
            }
        }
    }

    /**
     * 发生错误时调用
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error){
        System.out.println("发生错误");
        error.printStackTrace();
    }

    /**
     * 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。
     * @param message
     * @throws IOException
     */
    public void sendMessage(String message) throws IOException{
        this.session.getBasicRemote().sendText(message);
        //this.session.getAsyncRemote().sendText(message);
    }

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

    public static synchronized void addOnlineCount() {
        WebSocket.onlineCount++;
    }

    public static synchronized void subOnlineCount() {
        WebSocket.onlineCount--;
    }
}

4.前端代码

<%@ page language="java" pageEncoding="UTF-8" %>



    柒情
    
    
    
    
    
    
    
    


  • Drake 2:09 PM howdoyoudoaspace
To: Dog Woofson
hi, 柒情

四、相杀

啥? 你还想看戏? no no no,接下来就是你们的舞台,这个项目coding中肯定还会遇见各种问题的,有问题就在评论区展示出来吧,解决了也可以展示出来,方便后人嘛,哈哈哈哈哈哈

项目源码地址:https://gitee.com/liuyuzhijia/willProject

项目在线体验地址:http://www.lingchang.club/webSocket.jsp

这dome和理论来大部分来源于上面两位大佬,再此对他们表示感谢,我是站在巨人肩膀上的小码农。

你可能感兴趣的:(java基础,Websocket)