LXLWebSocketServer-让LXL(LLSE)的js插件具备WebSocketServer功能

LSE LXLWebSocketServer-让LXL(LLSE)的js插件具备WebSocketServer功能 0.1.1

请登录后获取
版权类型
原创
版权链接
#
语言支持
中文(简体)
前置组件
LiteXLoader(LiteLoaderBDS)
适配版本(基岩)
  1. 全版本
密码:KING


LL计划在将来新增对nodejs的支持,因此本项目已经没有存在意义,将不再提供支持,但你依旧可以下载

【背景】
目前为止 LXL(LLSE)插件(js插件)只具备WebSocketClient功能,想要做wss功能要么通过nodejs途径,要么通过Python或者其他途径。这种第三方途径需要安装运行环境,导致LLSE插件做跨服非常繁琐与困难。对于萌新腐竹或者小白来说,开发的跨服插件他们根本玩不懂。
【功能】
本插件底层利用 Java 实现了WebSocketServer逻辑,自带精简版jre运行,为 LXL 的 js 插件提供WebSocketServer 接口,让 LXL 也能轻易实现 wss 功能。
自带jre运行环境,让你不需要你做什么复杂工作。你只需要把下载的压缩包解压到plugins目录下即可,它就是那么简单,让你错误以为他就是原生lxl接口

【食用方法】
开袋即食,咳咳
首先、你知道什么叫WebSocket
第二、你知道什么叫WebSocketClient
第三、你知道什么叫WebSocketServer
以及你知道什么http1.1和ws协议区别(一个是全双工,一个是半双工,http不能主动给client发送数据)

1、【下载插件】插件为KING.zip压缩文件,内部包含五个文件:jre精简版运行环境、wss的jar文件、封装好的wss接口、源码包-担心有后门的可以自己编译、代码demo。具体如下图:
文件列表.PNG

2、【解压到 ./plugins 下】(会出现KING文件夹)
KING文件夹.PNG

3、参照以下代码和接口编写你自己的插件
4、开服!

注:该WebSocketServer为了保护系统特定端口,仅允许从1024到65535范围内监听


有人说,用nodejs做一个wss服务器,然后通过bds接入,就可以实现群互通。而且bds崩了也不用担心wss崩。我寻思着你bds都崩了,你要wss还有什么用?另外,你的wss能做数据验证吗,就算能做还得有调用和回传,不麻烦吗,写正则累不累?用wss结合bds既可以实现wss功能,也能通过bds进行数据验证,不香吗?另外,你做群组服还得装node,装Python,不累吗,插件讲究的就是开箱即用。

【重要】
由于文件内包含源码包,老规矩,允许魔改与商用,请著名出处:<平台:MineBBS, 作者:KING>
有任何bug或者问题请私信或者讨论,我都会及时修复与更新



【接口示例】
JavaScript:
const FakeLXLWebSocket = require("./KING/LXLWebSocketServer/FakeLXLWSServer")
let lXLWebSocketServer = new FakeLXLWebSocket();

//注册事件
lXLWebSocketServer.register({
    /** 加入了一个新链接
     * @param {新加入的连接} connection
     */
    onConnected:(connection)=>{
        
        //欢迎语
        connection.sendText("你好客户端,欢迎加入lXLWebSocketServer<平台:minebbs,作者:KING>")

        //所有属性
        log(`有新的客户端接入:${connection.ip}:${connection.port} 状态:${connection.status}`);
        //当前连接的状态:  0:已断开   1:保持会话
    },

    /**一个连接关闭了
     * @param {关闭的连接} connection
     */
    onDisconnect:(connection)=>{
        log("["+connection.ip+":"+connection.port+"]断开了连接");
    },

    /**一个连接发来信息
     * @param {发送文本的连接} connection
     * @param {发送的文本} text
     */
    onText:(connection,text)=>{
        log("["+connection.ip+":"+connection.port+"]发来信息: "+text);
    },

    /** webSocketServer被关闭
     * @param {状态码} status
     * @param {反馈消息} msg
     */
    onServerClosed:(status,msg)=>{ //服务器关闭
        switch(status){
            case 0:{
                //服务器正常关闭
                log("服务器正常关闭")
            }break;
            case 1:{
                //通道异常导致的网络断开
                log("因为网络通道异常而关闭,请尝试重启插件")
            }break;
            case 2:{
                //底层运行异常导致的网络断开
                log("因为底层运行异常而关闭,请尝试重启插件")
            }break;
            default:{
                //绝不会执行
                log("不可能发生的情况")
            }
        }
    }

    // 强制断开(踢出)连接 ,这里注释掉并不是说没用,而是怕你直接执行把客户端关了,主要是告诉你有这个功能
    // allConnections[i].close();
});

/**
* start(端口,callback)
*      callback(状态码,返回消息)
*      监听19300端口
*/
lXLWebSocketServer.start(19300,(status,msg)=>{
    switch(status){
        case 0:{
            log("webSocketServer服务器启动成功")

            //5秒对所有连接进行一次广播,这里只是教你怎么遍历所有连接而已,具体业务看你自己
            setInterval(()=>{
                let allConnections = lXLWebSocketServer.getAllConnections();
                for(let i in allConnections){
                    allConnections[i].sendText("各位客户端你好,这里是服务端广播信息")
                    
                    // 强制断开(踢出)连接 ,这里注释掉并不是说没用,而是怕你直接执行把客户端关了,主要是告诉你有这个功能
                    // allConnections[i].close();
                }
            },10000)

            // webSocket服务器关闭,这里注释掉并不是说没用,而是怕你直接执行把服务器关了,主要是告诉你有这个功能
            // lXLWebSocketServer.stop();

        }break;
        case 1:{
            log("端口错误,请检查端口1024~65535")
        }break;
        case 2:{
            log("端口已经被使用,请尝试更换端口")
        }break;
        case 3:{
            log("无法启动端口监听器,请尝试重启插件")
        }break;
        case 4:{
            log("网络通道异常,请尝试重启插件")
        }break;
    }
});














【以下是给想修改jar源码的人看的】没有别的需求你就到此为止


JavaScript:
serverSocket连接思路
1、如果服务端未被注册,那么所有的clientSocket将会被拒绝会话
2、如果服务端已经注册,如果另外一个也要来注册,那么就会产生监听冲突,会直接关闭后者
3、注册服务端仅在第一次报文会话中携带xCodde
4、在服务端启动初期,如果有大量的服务端注册请求,会被加入到缓冲池,然后等待最先提交注册的ServerSocket成为server
5、如果clientSocket长时间没有第一次会话,会在5分钟内关闭该clientSocket
6、如果ServerSocket关闭,服务端会进入重置状态
7、ServerSocket与JavaServer是实时对接,不是轮询查询,力求完美代理WebSocketServer

/**说明
*
* 原理:
*      代理:
*      lxl  <--交互-->  java  <--交互-->  webSocketServer
*         websocketclient     websocketserver
*
*   lxl_webSocketServer 代理 java_WebSocketServer
*   lxl_connections 代理 java_WebSocket
*   通过 xCode 来判断是 lxl_webSocketServer 还是 lxl_connections
*   当xCode正确,且地址为 127.0.0.1 或者 localhost 时,会充当为 lxl_webSocketServer(仅第一次接入确立,后续都无效)
*   默认xCode等于port,因为这样就可以顺带检测端口监听冲突
*
*
* //基于 ws(WebServer)协议(应用层) 的 WebSocketCall 调用协议(应用层ws调用协议)
* 1、--------------------------------------------------------------------
*    a、webSocketServer(lxl) 向 JavaWebSocketServer 调用请求的报文格式:
*          xCode: xxx          [可选] :当前WebSocket的身份识别码
*          connXCode: xxx      [可选] :被操作的socket身份识别码
*          method: xxx         [必选] :请求的操作
*          data: anydata       [可选] :携带参数 (text)
*      注:
*          1、凡是没有xCode的的连接,在第一次发送报文的都会被注册为client,后续只能一直充当为client
*          2、如果第一次发送且携带了xCode,(1:与Java服务端设置的相同、2:属于本地ip)
*              a、如果没有注册服务端,则注册为Server
*              b、如果注册服务端了,则会被视为端口冲突,直接断开连接
*
* 2、--------------------------------------------------------------------
*    a、JavaWebSocketServer 向 webSocketServer(lxl) 调用的请求报文格式:
*          connXCode: xxx      [可选] :被操作的WebSocket身份识别码
*          method: xxx         [必选] :需要调用的method
*          data: xxx           [可选] :携带参数 json
*  --------------------------------------------------------------------
*
*
* 3、lxl请求调用报文:
*   注:\n表示换行
*   申请server          :  xCode:xxx\n method:tryRegisterServer
*   关闭server          :  xCode:xxx\n method:closeServer
*   关闭connection      :  xCode:xxx\n method:closeConnection\n connXCode:xxx
*   向connection发送文本 :  xCode:xxx\n method:sendTextToConnection\n connXCode:xxx\n data:xxx
*
* 3、java回调调用报文:
*   申请server成功       :  method:serverListen
*   javaServer关闭      :  method:serverClose
*   connection关闭      :  method:socketClose\n connXCode:xxx
*   connection发送文本   :  method:socketText\n connXCode:xxx\n data:text
*   新connection加入     :  method:socketJoin\n connXCode:xxx\n data:json
*
*   由于报文需要换行,因此发送的data文本需要将\n转义,规定\n转义为 "[\n]" 注,里面的"\n"是两个字符,[] 也是字符
*
* 设计缺陷:
*      1、由于延迟性异步编程技术过于复杂,因此并未设计返回机制,就会导致远程调用是否成功也不知道,
*  一般情况想网络没出现问题是不会出现问题的
*      2、由于该协议是基于应用层,因此无法发送二进制数据,只能传输字符串(理论上可以传输二进制数据,转字符就好了)
*/

注:项目由maven构建,之后转Java application进行打包
如果需要扩展,可以将项目转maven之后构建
结构图.png
作者
KING
价格
5.00金粒
下载
28
查看
1,394
首次发布
最后更新

评分

0.00 星 0 次评分

KING 的其他资源

后退
顶部 底部