aardio 文档
aardio 范例: HTTP/WebSocket/JSON-RPC 三合一体服务端
//WS-JSON-RPC服务端
import win.ui;
/*DSG{{*/
var winform = win.form(text="HTTP/WebSocket/JSON-RPC 三合一体服务端";left=10;top=4;right=774;bottom=467)
winform.add(
btnPublish={cls="button";text="群发通知消息";left=505;top=411;right=621;bottom=450;db=1;dr=1;z=2};
btnSurvey={cls="button";text="发起调查任务";left=633;top=408;right=746;bottom=449;db=1;dr=1;z=3};
txtMessage={cls="edit";left=29;top=22;right=741;bottom=389;db=1;dl=1;dr=1;dt=1;edge=1;multiline=1;z=1}
)
/*}}*/
//创建WebSocket服务端
import web.socket.server;
var wsrv = web.socket.server();
//创建JSON-RPC服务端
import web.socket.jsonServer;
var rpcServer = web.socket.jsonServer(wsrv);
//指定客户端可以调用的对象和方法
rpcServer.external ={
/*
如果函数名首字符为$,第一个回调参数为$( 表示当前客户端套接字句柄 )。
*/
$hello = function($,name){
return "hello " + name;
}
aardio= {
hello = function(name){
return "aardio.hello " + name;
}
}
}
//客户端使用HTTP请求切换到WebSocket协议
wsrv.onUpgradeToWebsocket = function(hSocket,request,response,protocol,origin){
if( request.path == "/jsonrpc" ){
//允许指定的套接字开启JSON-RPC服务
return rpcServer.start(hSocket);
}
//禁止访问其他地址
response.close();
}
//一个客户端连接过来了
wsrv.onOpen = function(hSocket){
var client = wsrv.client(hSocket);
if(client) winform.txtMessage.print("客户端已连接", client.getRemoteIp() );
rpcServer.notify(hSocket,"hello","服务端通知");
}
//一个客户端掉线了
wsrv.onClose = function(hSocket){
winform.txtMessage.print("客户端已断线",hSocket);
}
//一个客户端出错了
wsrv.onError = function(hSocket,err){
winform.txtMessage.print("出错了",hSocket,err);
}
//一个客户端发消息过来了
wsrv.onMessage = function(hSocket,msg){
winform.txtMessage.print(hSocket,msg.data);
wsrv.send(hSocket,"WebSocket客户端,收到了你发过来的消息:" + msg.data)
}
//启动服务端
if( wsrv.start(,8879) ){
winform.txtMessage.print( wsrv.getUrl("jsonrpc"),"已启动 WebSocket/JSON-RPC 服务器");
winform.txtMessage.print( wsrv.httpServer.getUrl(),"已启动 HTTP服务器");
}
else {
winform.txtMessage.print("启动失败,建议修改端口号")
}
//同一个端口还可以同时运行HTTP服务端
wsrv.httpServer.run(
function(response,request){
//response.loadcode( request.path );
winform.txtMessage.print("HTTP协议访问:",request.url);
loadcodex(`
<!doctype html>
<html><head></head><body style="white-space:pre"><?
response.write("欢迎使用HTTP/WebSocket/JSON-RPC 三合一体服务端");
?></body>
</html>`)
}
);
winform.btnPublish.oncommand = function(id,event){
//发布订阅模式:在指定频道发布消息,支持传给客户端不定个数的参数
rpcServer.publish("serverTime",time() )
}
winform.btnSurvey.oncommand = function(id,event){
//调查模式:对客户端发起问询,支持传给客户端不定个数的参数
rpcServer.survey("clientTime");
}
rpcServer.xcallback.clientTime = function(hSocket,result,err){
winform.txtMessage.print( wsrv.getRemoteIp(hSocket) +"返回调查结果:"
, result );
}
winform.show()
win.loopMessage();
Markdown 格式