二上面界面已经写了,这里就不说了。
开始就说了,是为了试验webSocket库。这里肯定要继承啦。
别的就不写了,昨天说了却换界面的时候容易报错,干脆暂时还是搞单界面吧。把却换的屏蔽了。
先建了一个socect库专门处理websockect消息。
//socket应用
namespace socect;
import base;
import table;
import string;
import time;
import thread.command;
import web.socket.server;
wsrv := web.socket.server();
wstable = {}; //用来保存连接信息
//客户端使用HTTP请求切换到WebSocket协议
wsrv.onUpgradeToWebsocket = function(hSocket,request,response,protocol,origin){
if( request.path!="/aardio"){
//关闭应答即可拒绝请求 调用response.close()也可以
return response.errorStatus(404);
}
}
//一个客户端连接过来了
wsrv.onOpen = function(hSocket){
var client = wsrv.client(hSocket);
var tab = {};
tab.ip = client.getRemoteIp();
var tm = time();
tm.format = "%Y-%m-%d %H:%M:%S";
tab.trme = tostring(tm); //登录时间
// ..console.dump(hSocket);
tab.clent = tonumber(hSocket) ; //连接指针
table.push(wstable,tab);
wsrv.send(hSocket,"已连接");
if(client)thread.command.openline(wstable,tonumber(hSocket) ); //发送连接信息到界面
}
//一个客户端掉线了
wsrv.onClose = function(hSocket){
thread.command.onClose(tonumber(hSocket));
}
//一个客户端出错了
wsrv.onError = function(hSocket,err){
thread.command.msg("onError",tonumber(hSocket),err);
}
//一个客户端发消息过来了
wsrv.onMessage = function(hSocket,msg){
thread.command.msg( tonumber(hSocket),msg.data);
}
//启动服务端
star = function(){
var str = "";
if( wsrv.start(,8876) ){
var ip = base.gethttpIp().ip;
str = "当前外网ip:"++ip+ " 内网ip:"+base.getIp()+" 端口:8876/aardio 已启动服务器。";
}
else {
str = "启动失败,建议修改端口号";
}
thread.command.foot(str); //发送尾部信息
}本来准备在main.aardio里用多线程调用这个的,结果发现websocect这个库不支持,用多线程就连不上了。
main.aardio文件
import win.ui;
import win.ui.atom;
import web.json;
import string.html;
import thread.command;
io.open();
/*DSG{{*/
mainForm = win.form(text="我们都是好孩子";right=951;bottom=575;border="none";mode="popup")
mainForm.add()
/*}}*/
//导入webkit支持库
import web.kit.form;
import web.kit.jsFunction;
import console;
var atom,hwnd = mainForm.atom("D40607E2-3287-433A-98F7-E3469BCA21F1");
if(!atom){
win.quitMessage(); return;
}
var wbKitView = web.kit.form(mainForm);//创建webkit浏览器窗口
/*
wbKitView.onDocumentReady = function(url,mainFrameJSState,frameJSState){
console.dump("按F12调试试试")
}
*/
//使用external接口定义网页脚本可调用的本地函数
wbKitView.external = {
aardioCall = function(str){
mainForm.msgbox(str);
};
conlog = function(obj){
var obj = web.json.strip(obj);
console.dump(obj);
}
//发送消息
send = function(obj){
var obj = web.json.parse(obj);
var str =obj.content;
var tm = time();
tm.format = "%Y-%m-%d %H:%M:%S";
var ftm = tostring(tm); //发送时间
str = "服务端直接发送:"++ftm++": "++str++"<br/>";
var htmtab = {str = str;status="str"}
str = web.json.stringify(htmtab); //转化为json
//未选择则全部发送
var tab = socect.wstable;
for(i=1;#tab;1){
var clhp = topointer(tab[i].clent);
socect.wsrv.send(clhp,str);
}
//var xtab = {status=1;data={str=str}};
//return web.json.stringify(xtab);
}
}
//打开链接时触发
wbKitView.onNavigation = function(url,navigationType){
if( navigationType == 0/*_WKE_NAVIGATION_TYPE_LINKCLICK*/ ){
}
return true;
}
var windows_but = /**
<li class="layui-nav-item">
<a id="window-min" onclick="windowCommand('min')">0</a>
</li>
<li class="layui-nav-item">
<a id="window-max" onclick="this.innerText = windowCommand('max')?'2':'1';">1</a>
</li>
<li class="layui-nav-item">
<a id="window-close" onclick="windowCommand('close')">r</a>
</li>
**/
import wsock.tcp.simpleHttpServer;
wbKitView.go( wsock.tcp.simpleHttpServer.startUrl("/html/main.aardio") );
wbKitView.wait();
//可以使用CSS选择器获取HTML节点对象,为了保持网页的原特性,窗口开关后加
wbKitView.querySelector(".footer").setAttribute("onmousedown","windowCommand('drag')"); //必须加这个,才能拖动窗口
wbKitView.querySelector(".layui-header .drag").setAttribute("onmousedown","windowCommand('drag')"); //必须加这个,才能拖动窗口
wbKitView.querySelector(".layui-header .layui-logo").innerText = mainForm.text;
wbKitView.querySelector(".layui-header .layui-layout-right ").innerHTML = windows_but; //加windows窗体最大最小关闭按钮
//其实webkit里可以直接用jq,方便的很
wbKitView.jQuery(".contop").html("");
wbKitView.jQuery(".rcont").html("");
//初始化,把上面的演示内容都清零
msg = thread.command();
//多线程底部信息
msg.foot = function(str){
wbKitView.querySelector(".footer").innerText = str;
}
//打开连接信息
msg.openline = function(tab,hSocket){
var num = table.count(tab);
var html = "<h3>当前在线:"++ num ++"人</h3>" ;
for(i=1;num;1){
html +="<div class='xcont'><span>ip:<a data='"++tostring(tab[i].clent) ++"'>"++tab[i].ip ++"</a></span><span>上线时间:"+ tab[i].trme +"</span></div>" ;
}
wbKitView.querySelector(".rcont").innerHTML = html;
//把链接这边的窗口初始化
var html_top = wbKitView.jQuery(".contop").html(); //左上部
var html_right = wbKitView.jQuery(".rcont").html();
var htmtab = {h_top=html_top?html_top:"";h_right = html_right ;status="init"}
var str = web.json.stringify(htmtab); //转化为json发出去
for(i=1;num;1){
var clhp = topointer(tab[i].clent);
socect.wsrv.send(clhp,str);
}
}
//消息来信息,收到信息
msg.msg = function(hSocket,data){
var tab = socect.wstable;
var ip = "";
for(i=1;#tab;1){
if(table.find(tab[i],hSocket)){
ip = tab[i].ip;
break ;
};
}
//wbKitView.jQuery(".contop").append( string.format("%s:%s<br/>",ip,data ));
data = string.trim(data);
var tm = time();
tm.format = "%Y-%m-%d %H:%M:%S";
var ftm = tostring(tm); //发送时间
var str = string.format("%s:%s %s<br/>",ip,ftm,string.html.toText(data ));
var htmtab = {str = str;status="str"}
str = web.json.stringify(htmtab); //转化为json发出去
var tab = socect.wstable;
for(i=1;#tab;1){
var clhp = topointer(tab[i].clent);
socect.wsrv.send(clhp,str); //这个信息全部转发到别的服务端
}
}
//掉线信息
msg.onClose = function(hSocket){
var tab = socect.wstable;
for(i=1;#tab;1){
if(table.find(tab[i],hSocket)){
table.remove(tab,i);
break ;
};
}
var num = table.count(tab);
var html = "<h3>当前在线:"++ num ++"人</h3>" ;
for(i=1;num;1){
html +="<div class='xcont'><span>ip:<a data='"++tostring(tab[i].clent) ++"'>"++tab[i].ip ++"</a></span><span>上线时间:"+ tab[i].trme +"</span></div>" ;
}
wbKitView.querySelector(".rcont").innerHTML = html;
//把链接这边的窗口初始化
var html_top = wbKitView.jQuery(".contop").html(); //左上部
var html_right = wbKitView.jQuery(".rcont").html();
var htmtab = {h_top=html_top?html_top:"";h_right = html_right ;status="init"}
var str = web.json.stringify(htmtab); //转化为json发出去
for(i=1;num;1){
var clhp = topointer(tab[i].clent);
socect.wsrv.send(clhp,str);
}
}
//这个消息库等界面显示了再运行
import socect;
socect.star();
//添加可拖动边框
import win.ui.resizeBorder;
win.ui.resizeBorder(mainForm);
//添加阴影
import win.ui.shadow;
win.ui.shadow(mainForm);
//限定最大化范围
import win.ui.minmax;
win.ui.minmax(mainForm);
mainForm.show();
win.loopMessage();写的很粗糙,也就是玩玩的。当然也能够一对一的对话的,不过我没搞。这些暂时没有深入需求,觉得浪费时间不划算。有时间还是加紧搞微信小程序和公众号应用吧。哎。
来个服务端的界面截图。

网页聊天页面在这里。
http://blog.jvbaopeng.com/demo/WebSocket/index.html
欢迎大家测试。这次基本做到了一个页面两套共享,还是很满意的。aardio就是屌!