密码: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。具体如下图:
2、【解压到 ./plugins 下】(会出现KING文件夹)
3、参照以下代码和接口编写你自己的插件
4、开服!
注:该WebSocketServer为了保护系统特定端口,仅允许从1024到65535范围内监听
有人说,用nodejs做一个wss服务器,然后通过bds接入,就可以实现群互通。而且bds崩了也不用担心wss崩。我寻思着你bds都崩了,你要wss还有什么用?另外,你的wss能做数据验证吗,就算能做还得有调用和回传,不麻烦吗,写正则累不累?用wss结合bds既可以实现wss功能,也能通过bds进行数据验证,不香吗?另外,你做群组服还得装node,装Python,不累吗,插件讲究的就是开箱即用。
【重要】
由于文件内包含源码包,老规矩,允许魔改与商用,请著名出处:<平台:MineBBS, 作者:KING>
有任何bug或者问题请私信或者讨论,我都会及时修复与更新
【接口示例】
【以下是给想修改jar源码的人看的】没有别的需求你就到此为止
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。具体如下图:
2、【解压到 ./plugins 下】(会出现KING文件夹)
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之后构建