575 lines
15 KiB
JavaScript
575 lines
15 KiB
JavaScript
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);
|