Files
youlegames/tools/server2017-64-stable/test/servernet.js

575 lines
15 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
function mylog(data) //log
{
// console.log(data);
};
function mylog2(data) //log
{
console.log(data);
};
var eylj=60*1000*30;//恶意链接时间
var tcpinit = 10000;
var httpinit = 10000;
var constcount=0;
//var constcountinit=10;
var constcountinit=9989998;
constcount=constcountinit+tcpinit;
var rf = require("fs");
var data1 = rf.readFileSync("port.txt", "utf-8");
var obj = JSON.parse(data1);
var oo=obj[0];
var ll;
for (var i = 0; i < obj.length; i++) {
// var oo = obj[i];
// server_heihu(oo.tcpport, oo.httpport);
};
function $() {
return document.getElementById(arguments[0]);
}
var memo1=$('txtChatMain');
var title1=$('btnChatSend');
var countmemo1=0;
function clearmsg() {
memo1.value = '黑狐服务器2016'+ '\n';
};
function logmsg(msg) {
memo1.value += msg + '\n';
countmemo1++;
if (countmemo1>1000)
{
clearmsg();
}
};
function logtitle(msg) {
title1.value = msg ;
};
Array.prototype.indexOf = function(val) {
for (var i = 0; i < this.length; i++) {
if (this[i] == val) return i;
}
return - 1;
};
Array.prototype.remove = function(val) {
var index = this.indexOf(val);
if (index > -1) {
this.splice(index, 1);
};
return index;
};
function server_findip(str) //查找ip
{
var j = 0;
var x;
for (var i = 0; i < str.length; i++) {
x = parseInt(str[i]);
if (!isNaN(x))
// if (str[i]=='1')
{
j = i;
break;
}
}
return str.substr(j, str.length - j);
}
//---------------------------
function clientleave(mode, conn, data) //tcp
{
webserver.sendText('@toleave1:' + conn.ljid);
};
function clientlogin(mode, conn, data) //tcp
{
webserver.sendText('@tologin1:' + conn.ljid + ':');
};
function httprev_todo(mode, conn, data) // http
{
webserver.sendText('@toserver' + ':' + conn.ljid + ':' + data);
};
function tcprev_todo(mode, conn, data) ////tcp
{
webserver.sendText('@toserver' + ':' + conn.ljid + ':' + conn.ip + ':' + data);
};
function myfind(str,cha,num){//0是第一次出现
var x=str.indexOf(cha);
for(var i=0;i<num;i++){
x=str.indexOf(cha,x+1);
}
return x;
}
function serverrev_fromdo(mode, conn, data) //tcp http
{
mylog("逻辑服务器处理返回:" + data);
var tou = data.substr(10, 5);
var pos2=myfind(data,':',1);//位置
if (pos2<5)
{
return;
}
var data1=data.substr(0, pos2);
var arrs=data1.split(":");
mylog("解析数据:" + data1);
var mod = 0;
if (tou == 'http_') {
mod = 1;
};
var ss = '@tooneone' + ':' + arrs[1] + ':';
ss = data.substr(ss.length, data.length - ss.length);
if (mod == 1) {
var response = lists_all_http[arrs[1]];
response.write(ss);
response.end();
lists_all_http[arrs[1]]=null;
//response.time;
//response.ljid;
return;
};
if ('@toclosed' == arrs[1]) {
mod = 2; //关闭连接
}
if (arrs[1]=="-1")//群发
{
//群发
broadcast(httpserver,ss);
return;
}
var ids = arrs[1].split(",");
for (var u = 0; u < ids.length; u++) {
if (lists_all[ids[u]]) {
if (mod == 2) {
lists_all[ids[u]].close(2001); //主动关闭连接
} else {
lists_all[ids[u]].sendText(ss);
}
}
};
};
//============================================================================
//var http2 = require("http"); //提供web服务
var http = require("http"); //提供web服务
var url = require("url"); //解析GET请求
var query = require("querystring"); //解析POST请求
//http://127.0.0.1:4321/dfw.html?num=32&num1=13&type=add&name=dfw
//服务
var httpserver = function(request, response) {
try {
var url1 = request.url;
mylog(url1);
var exe = url1.substr(url1.length - 4);
if (exe == '.ico' || exe == '.jpg' || exe == '.png') {
mylog("exe " + exe);
response.writeHead(200, {
"Content-Type": "text/json",
"Access-Control-Allow-Origin": "*"
});
response.end();
return;
};
response.writeHead(200, {
"Content-Type": "text/json",
"Access-Control-Allow-Origin": "*"
});
if (request.method == "GET") {
response.ljid = 'http_GET' + httpinit;
} else {
response.ljid = 'http_POST' + httpinit;
};
response.time = new Date();
lists_all_http[response.ljid] = response;
httpinit++;
if (httpinit > 99999) {
httpinit = 10000;
}
//判断是GET/POST请求
if (request.method == "GET") {
var params = [];
params = url.parse(request.url).query;
mylog("===");
mylog(params);
//console.log(params.query);
mylog(request.url);
/*params['fruit'] = compute(params);
params['ljid'] = response.ljid;
var pathname = url.parse(request.url).pathname;
params['pathname'] = pathname;
params['url'] = request.url;
var arg1 = url.parse(request.url, true).query; //arg1 => {name:'a',id:'5'}
var str = JSON.stringify(arg1);
console.log("ljid " + response.ljid);
console.log("url " + request.url);
console.log("Request for1 " + str);
console.log("name0 = " + arg1.name);*/
//var name = query.parse(str).name; //name => a
//console.log("name = "+name);
if (webserver == null) {
response.write("webserve-服务器未工作" + url1);
response.end();
lists_all_http[response.ljid]=null;
} else {
httprev_todo('http', response, decodeURI(params));
}
} else {
var postdata = "";
request.addListener("data",
function(postchunk) {
postdata += postchunk;
});
//POST结束输出结果
request.addListener("end",
function() {
//var params = query.parse(postdata);
//params['fruit'] = compute(params);
//params['ljid'] = response.ljid;
mylog("收到:post " + postdata);
if (webserver == null) {
response.write("webserve-服务器未工作");
response.end();
lists_all_http[response.ljid]=null;
} else {
httprev_todo('http', response, postdata);
}
})
}
} catch(err) {
mylog2("httpserver:" + err);
}
};
//计算
var compute = function(params) {
switch (params['type']) {
case "add":
return parseFloat(params['num']) + parseFloat(params['num1']);
break;
case "subtract":
return parseFloat(params['num']) - parseFloat(params['num1']);
break;
case "multiplication":
return parseFloat(params['num']) * parseFloat(params['num1']);
break;
case "division":
return parseFloat(params['num']) / parseFloat(params['num1']);
break;
};
};
//开启服务在127.0.0.1:8080
//server_heihu(oo.tcpport, oo.httpport);
var httpport=oo.httpport;
var tcpport=oo.tcpport;
if (httpport) {
http.createServer(httpserver).listen(httpport);
mylog("http Server start!" + httpport);
};
//http2.createServer(server).listen(4322);
var ws = require("nodejs-websocket");
mylog("开始建立连接...");
var game1 = null,
game2 = null,
game1Ready = false,
game2Ready = false;
var webserver = null;
var myid = 0;
if (tcpport > 0) {
var tcpserver = ws.createServer(function(conn) {
try {
// mylog(conn.socket);
// mylog(conn.socket.remoteAddress);
// mylog(conn.socket.remotePort);
//console.log("Headers对象");
//console.log(conn.headers);
var er=0;
var ip = server_findip(conn.socket.remoteAddress);
conn.ip = ip;
er=1;
var ok=-1;
for (var i1=0;i1<constcountinit;i1++)
{
tcpinit=tcpinit+1;
if (tcpinit > constcount) {
tcpinit = 10000;
}
mylog('tcpinit1:'+tcpinit);
if ((typeof(lists_all['tcp_' + tcpinit])=="undefined")||(lists_all['tcp_' + tcpinit]==null))
{
mylog(lists_all['tcp_' + tcpinit]);
mylog('tcpinit2:'+tcpinit);
ok=tcpinit;
break;
}
}
if (ok==-1)
{
mylog2('连接已经满了:'+tcpinit);
conn.isserver = -1;//没进队列
conn.close(1000);
return;
}
er=2;
conn.ljid = 'tcp_' + tcpinit;
conn.isserver = 0;
conn.contime=(new Date()).getTime();
conn.readpack=0;//还没有包
lists.push(conn);
lists_all[conn.ljid]=conn;
mylog("New connection ---" + conn.ip+'/'+ conn.ljid+'/'+tcpinit);
er=3;
if (webserver) {
clientlogin('tcp', conn);
};
conn.on("text",
function(str) {
try {
mylog("收到的信息为0:" + str);
this.readpack=1;//有包了
if (str === "dfw19770109") {
this.isserver = 1;
webserver = this;
lists.remove(this);
lists_all[this.ljid]=null;
delete lists_all[this.ljid];
this.ljid = 'tcp_' + 0;
//this.sendText("webserver-dfw19770109");
return;
};
if (this == webserver) //处理完发来的
{
mylog("收到的信息为 从server来:" + str);
serverrev_fromdo('server', 'id', str);
} else
{
if (webserver == null) {
this.sendText("webserve-服务器未工作");
} else {
mylog("转发给逻辑服务器:" + str);
tcprev_todo('tcp', this, str);
}
}
}
catch(err) {
mylog2("text:" + err);
}
//lists_all_http[response.ljid]
// if (game1Ready && game2Ready) {
// game2.sendText(str);
// }
//
// conn.sendText(str)
});
conn.on("close",
function(code, reason) {
if (conn.isserver==-1)
{
mylog2('连接已经满了收包:');
return;
}
try {
if (this.isserver == 1) {
webserver = null;
mylog("逻辑服务器关闭连接");
} else {
var index = lists.remove(this);
if (index > -1) {
if (webserver) {
clientleave('tcp', this);
};
};
//this.socket=null;
var i9=this.ljid;
lists_all[i9]=null;
delete lists_all[i9];
//conn=null;
mylog("关闭连接"+i9);
};
} catch(err) {
mylog2("close:" + err);
}
});
conn.on("error",
function(code, reason) {
// try {
// if (this.isserver == 1) {
// webserver = null;
// mylog("逻辑服务器错误关闭连接");
// } else {
// var index = lists.remove(this);
// if (index > -1) {
// if (webserver) {
// clientleave('tcp', this);
// };
// };
//this.socket=null;
// var i9=this.ljid;
// lists_all[i9]=null;
// delete lists_all[i9];
//this=null;
// mylog("异常关闭"+i9);
// };
// } catch(err) {
// mylog2("error:" + err);
// }
});
} catch(err) {
mylog2("newsocket:" + err+" "+er);
}
}).listen(tcpport);
mylog("Socket建立完毕:" + tcpport);
};
function broadcast(server, msg) {
try {
server.connections.forEach(function(conn) {
if (conn.readpack==1)
{conn.sendText(msg)};
})
} catch(err) {
mylog2("broadcast:" + err);
}
} //广播
var maxsocketcount=0;
var maxsocketcounttcp=0;
function dotime() {
try {
mylog("Socket群发1111");
if (webserver != null) {
// return;
}
var newDate=new Date();
if (maxsocketcounttcp<tcpserver.connections.length){maxsocketcounttcp=tcpserver.connections.length};
if (maxsocketcount<lists.length){maxsocketcount=lists.length};
logtitle(newDate.toLocaleDateString()+"/"+(lists.length)+"/"+tcpserver.connections.length+" "+maxsocketcount+"/"+maxsocketcounttcp+" "+tcpinit);
var mytime=(new Date()).getTime();//当前时间
if (lists.length > 0) {
mylog("群发,检测时间");
for (var i = 0; i < lists.length; i++) {
if (lists[i].readpack==0)
{
if (mytime-lists[i].contime>eylj)
{ mylog2("Socket恶意链接");
lists[i].close(1001);
}
}
// lists[i].sendText(i + ' :message server! ' + lists.length);
}
}
} catch(err) {
mylog2("dotime:" + err);
}
};
if (tcpport > 0) {
var interval = setInterval(dotime, 6000);
};
var lists = [];
var lists_all = {};
var lists_all_http = {};
var newDate = new Date();
logmsg(newDate.toLocaleDateString());
//server_heihu(5414,4321);
//server_heihu(5415,4322);