模块 org.redkale

类 WebSocket<G extends Serializable,​T>

  • 类型参数:
    G - Groupid的泛型
    T - Message的泛型

    public abstract class WebSocket<G extends Serializable,​T>
    extends Object
     一个WebSocket连接对应一个WebSocket实体,即一个WebSocket会绑定一个TCP连接。
     协议上符合HTML5规范, 其流程顺序如下:
          1.1 onOpen 若返回null,视为WebSocket的连接不合法,强制关闭WebSocket连接;通常用于判断登录态。
          1.2 createUserid 若返回null,视为WebSocket的连接不合法,强制关闭WebSocket连接;通常用于判断用户权限是否符合。
          1.3 onConnected WebSocket成功连接后在准备接收数据前回调此方法。
          1.4 onMessage/onFragment+ WebSocket接收到消息后回调此消息类方法。
          1.5 onClose WebSocket被关闭后回调此方法。
      普通模式下 以上方法都应该被重载。
     

    详情见: https://redkale.org

    作者:
    zhangjx
    • 字段详细资料

      • CLOSECODE_SERVERCLOSE

        @Comment("\u670d\u52a1\u5668\u4e3b\u52a8\u5173\u95ed")
        public static final int CLOSECODE_SERVERCLOSE
        另请参阅:
        常量字段值
      • CLOSECODE_CLIENTCLOSE

        @Comment("\u5ba2\u6237\u7aef\u4e3b\u52a8\u5173\u95ed")
        public static final int CLOSECODE_CLIENTCLOSE
        另请参阅:
        常量字段值
      • CLOSECODE_WSEXCEPTION

        @Comment("\u5f02\u5e38\u5173\u95ed")
        public static final int CLOSECODE_WSEXCEPTION
        另请参阅:
        常量字段值
      • CLOSECODE_ILLPACKET

        @Comment("\u5f02\u5e38\u6570\u636e\u5f3a\u5236\u5173\u95ed")
        public static final int CLOSECODE_ILLPACKET
        另请参阅:
        常量字段值
      • RETCODE_SEND_ILLPACKET

        @Comment("\u6d88\u606f\u4e0d\u5408\u6cd5")
        public static final int RETCODE_SEND_ILLPACKET
        另请参阅:
        常量字段值
      • RETCODE_WSOCKET_CLOSED

        @Comment("WebSocket\u5df2\u7ecf\u5173\u95ed")
        public static final int RETCODE_WSOCKET_CLOSED
        另请参阅:
        常量字段值
      • RETCODE_ILLEGALBUFFER

        @Comment("Socket\u7684buffer\u4e0d\u5408\u6cd5")
        public static final int RETCODE_ILLEGALBUFFER
        另请参阅:
        常量字段值
      • RETCODE_SENDEXCEPTION

        @Comment("WebSocket\u53d1\u9001\u6d88\u606f\u5f02\u5e38")
        public static final int RETCODE_SENDEXCEPTION
        另请参阅:
        常量字段值
      • RETCODE_ENGINE_NULL

        @Comment("WebSocketEngine\u5b9e\u4f8b\u4e0d\u5b58\u5728")
        public static final int RETCODE_ENGINE_NULL
        另请参阅:
        常量字段值
      • RETCODE_NODESERVICE_NULL

        @Comment("WebSocketNode\u5b9e\u4f8b\u4e0d\u5b58\u5728")
        public static final int RETCODE_NODESERVICE_NULL
        另请参阅:
        常量字段值
      • RETCODE_GROUP_EMPTY

        @Comment("WebSocket\u7ec4\u4e3a\u7a7a, \u8868\u793a\u65e0WebSocket\u8fde\u63a5")
        public static final int RETCODE_GROUP_EMPTY
        另请参阅:
        常量字段值
      • RETCODE_WSOFFLINE

        @Comment("WebSocket\u5df2\u79bb\u7ebf")
        public static final int RETCODE_WSOFFLINE
        另请参阅:
        常量字段值
      • RETCODE_DELAYSEND

        @Comment("WebSocket\u5c06\u5ef6\u8fdf\u53d1\u9001")
        public static final int RETCODE_DELAYSEND
        另请参阅:
        常量字段值
    • 构造器详细资料

      • WebSocket

        protected WebSocket()
    • 方法详细资料

      • getCreateTime

        public final long getCreateTime()
      • send

        public final CompletableFuture<Integer> send​(Object message)
        给自身发送消息, 消息类型是String或byte[]或可JavaBean对象
        参数:
        message - 不可为空, 只能是String或byte[]或可JavaBean对象
        返回:
        0表示成功, 非0表示错误码
      • send

        public final CompletableFuture<Integer> send​(Object message,
                                                     boolean last)
        给自身发送消息, 消息类型是String或byte[]或可JavaBean对象
        参数:
        message - 不可为空, 只能是String或byte[]或可JavaBean对象
        last - 是否最后一条
        返回:
        0表示成功, 非0表示错误码
      • send

        public final CompletableFuture<Integer> send​(Convert convert,
                                                     Object message)
        给自身发送消息, 消息类型是JavaBean对象
        参数:
        convert - Convert
        message - 不可为空, 只能是JSON对象
        返回:
        0表示成功, 非0表示错误码
      • send

        public final CompletableFuture<Integer> send​(Convert convert,
                                                     Object message,
                                                     boolean last)
        给自身发送消息, 消息类型是JavaBean对象
        参数:
        convert - Convert
        message - 不可为空, 只能是JavaBean对象
        last - 是否最后一条
        返回:
        0表示成功, 非0表示错误码
      • sendMessage

        public final CompletableFuture<Integer> sendMessage​(Object message,
                                                            Stream<G> userids)
        给指定userid的WebSocket节点发送 二进制消息/文本消息/JavaBean对象消息
        参数:
        message - 不可为空
        userids - Stream
        返回:
        为0表示成功, 其他值表示异常
      • sendMessage

        public final CompletableFuture<Integer> sendMessage​(Object message,
                                                            G... userids)
        给指定userid的WebSocket节点发送 二进制消息/文本消息/JavaBean对象消息
        参数:
        message - 不可为空
        userids - Serializable[]
        返回:
        为0表示成功, 其他值表示异常
      • sendMessage

        public final CompletableFuture<Integer> sendMessage​(Convert convert,
                                                            Object message,
                                                            Stream<G> userids)
        给指定userid的WebSocket节点发送 二进制消息/文本消息/JavaBean对象消息
        参数:
        convert - Convert
        message - 不可为空
        userids - Stream
        返回:
        为0表示成功, 其他值表示异常
      • sendMessage

        public final CompletableFuture<Integer> sendMessage​(Convert convert,
                                                            Object message,
                                                            G... userids)
        给指定userid的WebSocket节点发送 二进制消息/文本消息/JavaBean对象消息
        参数:
        convert - Convert
        message - 不可为空
        userids - Serializable[]
        返回:
        为0表示成功, 其他值表示异常
      • sendMessage

        public final CompletableFuture<Integer> sendMessage​(Object message,
                                                            boolean last,
                                                            Stream<G> userids)
        给指定userid的WebSocket节点发送 二进制消息/文本消息/JavaBean对象消息
        参数:
        message - 不可为空
        last - 是否最后一条
        userids - Serializable[]
        返回:
        为0表示成功, 其他值表示异常
      • sendMessage

        public final CompletableFuture<Integer> sendMessage​(Object message,
                                                            boolean last,
                                                            G... userids)
        给指定userid的WebSocket节点发送 二进制消息/文本消息/JavaBean对象消息
        参数:
        message - 不可为空
        last - 是否最后一条
        userids - Serializable[]
        返回:
        为0表示成功, 其他值表示异常
      • sendMessage

        public final CompletableFuture<Integer> sendMessage​(Convert convert,
                                                            Object message,
                                                            boolean last,
                                                            Stream<G> userids)
        给指定userid的WebSocket节点发送 二进制消息/文本消息/JavaBean对象消息
        参数:
        convert - Convert
        message - 不可为空
        last - 是否最后一条
        userids - Stream
        返回:
        为0表示成功, 其他值表示异常
      • sendMessage

        public final CompletableFuture<Integer> sendMessage​(Convert convert,
                                                            Object message,
                                                            boolean last,
                                                            Serializable... userids)
        给指定userid的WebSocket节点发送 二进制消息/文本消息/JavaBean对象消息
        参数:
        convert - Convert
        message - 不可为空
        last - 是否最后一条
        userids - Serializable[]
        返回:
        为0表示成功, 其他值表示异常
      • broadcastMessage

        public final CompletableFuture<Integer> broadcastMessage​(Object message)
        广播消息, 给所有人发消息
        参数:
        message - 消息内容
        返回:
        为0表示成功, 其他值表示部分发送异常
      • broadcastMessage

        public final CompletableFuture<Integer> broadcastMessage​(WebSocketRange wsrange,
                                                                 Object message)
        广播消息, 给所有人发消息
        参数:
        wsrange - 过滤条件
        message - 消息内容
        返回:
        为0表示成功, 其他值表示部分发送异常
      • broadcastMessage

        public final CompletableFuture<Integer> broadcastMessage​(Convert convert,
                                                                 Object message)
        广播消息, 给所有人发消息
        参数:
        convert - Convert
        message - 消息内容
        返回:
        为0表示成功, 其他值表示部分发送异常
      • broadcastMessage

        public final CompletableFuture<Integer> broadcastMessage​(WebSocketRange wsrange,
                                                                 Convert convert,
                                                                 Object message)
        广播消息, 给所有人发消息
        参数:
        wsrange - 过滤条件
        convert - Convert
        message - 消息内容
        返回:
        为0表示成功, 其他值表示部分发送异常
      • broadcastMessage

        public final CompletableFuture<Integer> broadcastMessage​(Object message,
                                                                 boolean last)
        广播消息, 给所有人发消息
        参数:
        message - 消息内容
        last - 是否最后一条
        返回:
        为0表示成功, 其他值表示部分发送异常
      • broadcastMessage

        public final CompletableFuture<Integer> broadcastMessage​(WebSocketRange wsrange,
                                                                 Object message,
                                                                 boolean last)
        广播消息, 给所有人发消息
        参数:
        wsrange - 过滤条件
        message - 消息内容
        last - 是否最后一条
        返回:
        为0表示成功, 其他值表示部分发送异常
      • broadcastMessage

        public final CompletableFuture<Integer> broadcastMessage​(Convert convert,
                                                                 Object message,
                                                                 boolean last)
        广播消息, 给所有人发消息
        参数:
        convert - Convert
        message - 消息内容
        last - 是否最后一条
        返回:
        为0表示成功, 其他值表示部分发送异常
      • broadcastMessage

        public final CompletableFuture<Integer> broadcastMessage​(WebSocketRange wsrange,
                                                                 Convert convert,
                                                                 Object message,
                                                                 boolean last)
        广播消息, 给所有人发消息
        参数:
        wsrange - 过滤条件
        convert - Convert
        message - 消息内容
        last - 是否最后一条
        返回:
        为0表示成功, 其他值表示部分发送异常
      • sendAction

        public final CompletableFuture<Integer> sendAction​(WebSocketAction action,
                                                           Serializable... userids)
        给指定userid的WebSocket节点发送操作
        参数:
        action - 操作参数
        userids - Serializable[]
        返回:
        为0表示成功, 其他值表示异常
      • broadcastAction

        public final CompletableFuture<Integer> broadcastAction​(WebSocketAction action)
        广播操作, 给所有人发操作指令
        参数:
        action - 操作参数
        返回:
        为0表示成功, 其他值表示部分发送异常
      • getRpcNodeAddresses

        public CompletableFuture<Set<WebSocketAddress>> getRpcNodeAddresses​(Serializable userid)
        获取用户在线的SNCP节点地址列表,不是分布式则返回元素数量为1,且元素值为null的列表
        InetSocketAddress 为 SNCP节点地址
        参数:
        userid - Serializable
        返回:
        地址列表
      • getRpcNodeWebSocketAddresses

        public CompletableFuture<Map<WebSocketAddress,​List<String>>> getRpcNodeWebSocketAddresses​(Serializable userid)
        获取在线用户的详细连接信息
        Map.key 为 SNCP节点地址, 含值为null的key表示没有分布式 Map.value 为 用户客户端的IP
        参数:
        userid - Serializable
        返回:
        地址集合
      • changeUserid

        public CompletableFuture<Void> changeUserid​(G newuserid)
        更改本WebSocket的userid
        参数:
        newuserid - 新用户ID,不能为null
        返回:
        CompletableFuture
      • forceCloseWebSocket

        @Comment("\u5f3a\u5236\u5173\u95ed\u7528\u6237\u7684\u6240\u6709WebSocket")
        public CompletableFuture<Integer> forceCloseWebSocket​(Serializable userid)
        强制关闭用户的所有WebSocket
        参数:
        userid - Serializable
        返回:
        int
      • webSocketNode

        @Comment("\u83b7\u53d6WebSocketNode")
        public final WebSocketNode webSocketNode()
        获取WebSocketNode
        返回:
        WebSocketNode
      • getAttribute

        public final <V> V getAttribute​(String name)
        获取当前WebSocket下的属性,非线程安全
        类型参数:
        V - 属性值的类型
        参数:
        name - 属性名
        返回:
        属性值
      • removeAttribute

        public final <V> V removeAttribute​(String name)
        移出当前WebSocket下的属性,非线程安全
        类型参数:
        V - 属性值的类型
        参数:
        name - 属性名
        返回:
        属性值
      • setAttribute

        public final void setAttribute​(String name,
                                       Object value)
        给当前WebSocket下的增加属性,非线程安全
        参数:
        name - 属性值
        value - 属性值
      • getUserid

        public final G getUserid()
        获取当前WebSocket所属的userid
        返回:
        userid
      • getSessionid

        public final String getSessionid()
        获取当前WebSocket的会话ID, 不会为null
        返回:
        sessionid
      • getRemoteAddress

        public final SocketAddress getRemoteAddress()
        获取客户端直接地址, 当WebSocket连接是由代理服务器转发的,则该值固定为代理服务器的IP地址
        返回:
        SocketAddress
      • getRemoteAddr

        public final String getRemoteAddr()
        获取客户端真实地址 同 HttpRequest.getRemoteAddr()
        返回:
        String
      • getTextConvert

        protected Convert getTextConvert()
      • getBinaryConvert

        protected Convert getBinaryConvert()
      • getSendConvert

        protected Convert getSendConvert()
      • setTextConvert

        protected void setTextConvert​(Convert convert)
      • setBinaryConvert

        protected void setBinaryConvert​(Convert convert)
      • setSendConvert

        protected void setSendConvert​(Convert convert)
      • getLocalWebSockets

        protected final Stream<WebSocket> getLocalWebSockets​(G userid)
        获取指定userid的WebSocket数组, 没有返回null
        此方法用于单用户多连接模式
        参数:
        userid - Serializable
        返回:
        WebSocket集合
      • findLocalWebSocket

        protected final WebSocket findLocalWebSocket​(G userid)
        获取指定userid的WebSocket数组, 没有返回null
        此方法用于单用户单连接模式
        参数:
        userid - Serializable
        返回:
        WebSocket
      • getLocalWebSockets

        protected final Collection<WebSocket> getLocalWebSockets()
        获取当前进程节点所有在线的WebSocket
        返回:
        WebSocketGroup列表
      • onOpen

        protected CompletableFuture<String> onOpen​(HttpRequest request)
        返回sessionid, null表示连接不合法或异常,默认实现是request.sessionid(true),通常需要重写该方法
        参数:
        request - HttpRequest
        返回:
        sessionid
      • createUserid

        protected abstract CompletableFuture<G> createUserid()
        创建userid, null表示异常, 必须实现该方法
        返回:
        userid
      • predicate

        protected boolean predicate​(WebSocketRange wsrange)
        WebSocket.broadcastMessage时的过滤条件
        参数:
        wsrange - 过滤条件
        返回:
        boolean
      • onConnected

        public CompletableFuture onConnected()
        WebSokcet连接成功后的回调方法
        返回:
        Future 可以为null
      • onPing

        public void onPing​(byte[] bytes)
        ping后的回调方法
        参数:
        bytes - 数据
      • onPong

        public void onPong​(byte[] bytes)
        pong后的回调方法
        参数:
        bytes - 数据
      • preOnMessage

        public void preOnMessage​(String restMapping,
                                 WebSocketParam param,
                                 Runnable messageEvent)
        接收到消息前的拦截方法, ping/pong不在其内
        注意:处理完后需要调用 messageEvent.run() 才能响应onMessage
        参数:
        restMapping - Rest的方法名,没有则为空字符串
        param - onMessage方法的参数
        messageEvent - onMessage事件
      • onMessage

        public void onMessage​(T message,
                              boolean last)
        接收到消息的回调方法
        参数:
        message - 消息
        last - 是否最后一条
      • onMessage

        public void onMessage​(String text,
                              boolean last)
        接收到文本消息的回调方法
        参数:
        text - 消息
        last - 是否最后一条
      • onMessage

        public void onMessage​(byte[] bytes,
                              boolean last)
        接收到二进制消息的回调方法
        参数:
        bytes - 消息
        last - 是否最后一条
      • onClose

        public CompletableFuture onClose​(int code,
                                         String reason)
        关闭的回调方法,调用此方法时WebSocket已经被关闭
        参数:
        code - 结果码,非0表示非正常关闭
        reason - 关闭原因
        返回:
        Future 可以为null
      • onOccurException

        public void onOccurException​(Throwable t,
                                     ByteBuffer[] buffers)
        发生异常时调用
        参数:
        t - 异常
        buffers - ByteBuffer[]
      • onSingleRepeatConnect

        public CompletableFuture<Boolean> onSingleRepeatConnect()
        当Single模式下用户重复登录时回调函数,默认处理方式: 关闭旧连接
        返回:
        Future 可以为null, 为null或者Future值为false表示关闭新连接, Future值为true表示关闭旧连接
      • getSncpAddress

        public InetSocketAddress getSncpAddress()
        获取分布式情况下的SNCP地址, 非分布式下为null
        返回:
        InetSocketAddress sncpAddress
      • getLogger

        public Logger getLogger()
        获取Logger
        返回:
        Logger Logger
      • getLastSendTime

        public long getLastSendTime()
        获取最后一次发送消息的时间
        返回:
        long
      • getLastReadTime

        public long getLastReadTime()
        获取最后一次读取消息的时间
        返回:
        long
      • getLastPingTime

        public long getLastPingTime()
        获取最后一次发送PING消息的时间
        返回:
        long
      • close

        public final void close()
        显式地关闭WebSocket
      • isClosed

        public final boolean isClosed()
        是否关闭
        返回:
        boolean