ming_node 3.0.0 → 3.0.1
Sign up to get free protection for your applications and to get access to all the features.
- package/beforeTest/clusterStartTest.js +8 -0
- package/beforeTest/net/TcpClientTest.js +10 -0
- package/beforeTest/net/TcpServerTest.js +16 -0
- package/beforeTest/net/UdpClientTest.js +10 -0
- package/beforeTest/net/UdpServerTest.js +9 -0
- package/beforeTest/restartest.js +1 -0
- package/beforeTest/restartestMain.js +7 -0
- package/module/net/TcpClient.js +64 -0
- package/module/net/TcpServer.js +108 -0
- package/module/net/UdpClient.js +68 -0
- package/module/net/UdpServer.js +64 -0
- package/package.json +1 -1
- package/utils/common/DataConvert.js +30 -0
- package/utils/nodemon/clusterStart.js +72 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
const TcpServer=require("../../module/net/TcpServer.js");
|
2
|
+
app=new TcpServer()
|
3
|
+
app.listen(9999)
|
4
|
+
|
5
|
+
app.set("connect",(req,res)=>{
|
6
|
+
|
7
|
+
console.log(req)
|
8
|
+
})
|
9
|
+
|
10
|
+
app.set("data",(req,res)=>{
|
11
|
+
|
12
|
+
console.log(req.params)
|
13
|
+
|
14
|
+
res.send("123")
|
15
|
+
|
16
|
+
})
|
@@ -0,0 +1 @@
|
|
1
|
+
require("../utils/nodemon/restart")("restartestMain.js","restartestMain.js")
|
@@ -0,0 +1,64 @@
|
|
1
|
+
const net = require('net');
|
2
|
+
|
3
|
+
class TcpClient {
|
4
|
+
static _EventCallBack={};
|
5
|
+
constructor(remoteIp,remotePort) {
|
6
|
+
this.connected=false;
|
7
|
+
this.remoteIp=remoteIp;
|
8
|
+
this.remotePort=remotePort;
|
9
|
+
}
|
10
|
+
set(url, callback) {
|
11
|
+
TcpClient._EventCallBack[url]=callback;
|
12
|
+
}
|
13
|
+
|
14
|
+
connect(){
|
15
|
+
let that=this;
|
16
|
+
if(that.connected){
|
17
|
+
return
|
18
|
+
}
|
19
|
+
this.client = net.createConnection({
|
20
|
+
port:this.remotePort ,
|
21
|
+
host:this.remoteIp
|
22
|
+
});
|
23
|
+
this.connected=true;
|
24
|
+
//当套字节与服务端连接成功时触发connect事件
|
25
|
+
this.client.on('connect', () =>{
|
26
|
+
that.connected=true;
|
27
|
+
TcpClient._EventCallBack['connect']? TcpClient._EventCallBack['connect'](): console.log("connect success");
|
28
|
+
});
|
29
|
+
//使用data事件监听服务端响应过来的数据
|
30
|
+
this.client.on('data', (chunk) => {
|
31
|
+
let req={};
|
32
|
+
req.remoteIp=that.remoteIp;
|
33
|
+
req.remotePort=that.remotePort;
|
34
|
+
req.params=chunk;
|
35
|
+
let res={};
|
36
|
+
res.send=function (v){
|
37
|
+
if(Array.isArray(v)){
|
38
|
+
v=new Buffer(v)
|
39
|
+
}
|
40
|
+
that.client.write(v)
|
41
|
+
}
|
42
|
+
TcpClient._EventCallBack['data'](req,res);
|
43
|
+
|
44
|
+
});
|
45
|
+
this.client.on('error', (err)=>{
|
46
|
+
TcpClient._EventCallBack["error"]?TcpClient._EventCallBack["error"](client): console.error(err);
|
47
|
+
});
|
48
|
+
|
49
|
+
|
50
|
+
this.client.on('close', ()=>{
|
51
|
+
that.connected=false;
|
52
|
+
TcpClient._EventCallBack["error"]?TcpClient._EventCallBack["error"]():console.log("close");
|
53
|
+
});
|
54
|
+
}
|
55
|
+
|
56
|
+
send(buffer){
|
57
|
+
if(this.connected){
|
58
|
+
this.client.write(buffer);
|
59
|
+
}
|
60
|
+
}
|
61
|
+
|
62
|
+
}
|
63
|
+
|
64
|
+
module.exports = TcpClient;
|
@@ -0,0 +1,108 @@
|
|
1
|
+
const net = require('net');
|
2
|
+
const os = require("os");
|
3
|
+
class TcpServer {
|
4
|
+
static _EventCallBack={};
|
5
|
+
static socketClientMap={};
|
6
|
+
set(url, callback) {
|
7
|
+
TcpServer._EventCallBack[url]=callback;
|
8
|
+
}
|
9
|
+
constructor() {
|
10
|
+
this.localAddress=this.getIpAddress();
|
11
|
+
}
|
12
|
+
getIpAddress(){
|
13
|
+
/**os.networkInterfaces() 返回一个对象,该对象包含已分配了网络地址的网络接口 */
|
14
|
+
var interfaces = os.networkInterfaces();
|
15
|
+
for (var devName in interfaces) {
|
16
|
+
var iface = interfaces[devName];
|
17
|
+
for (var i = 0; i < iface.length; i++) {
|
18
|
+
var alias = iface[i];
|
19
|
+
if (
|
20
|
+
alias.family === "IPv4" &&
|
21
|
+
alias.address !== "127.0.0.1" &&
|
22
|
+
!alias.internal
|
23
|
+
) {
|
24
|
+
return alias.address;
|
25
|
+
}
|
26
|
+
}
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
|
31
|
+
listen(port){
|
32
|
+
let that=this;
|
33
|
+
this.localPort=port;
|
34
|
+
this.socketServer = net.createServer(function (client) {
|
35
|
+
let endPoint= client.remoteAddress+":"+client.remotePort;
|
36
|
+
TcpServer.socketClientMap[endPoint]=client;
|
37
|
+
let req={};
|
38
|
+
req.remoteIp=client.remoteAddress;
|
39
|
+
req.remotePort=client.remotePort;
|
40
|
+
TcpServer._EventCallBack['connect']? TcpServer._EventCallBack['connect'](req,null): console.log(endPoint+"connected");
|
41
|
+
|
42
|
+
// 接收客户端的数据
|
43
|
+
client.on('data', function (data) {
|
44
|
+
let req={};
|
45
|
+
req.remoteIp=client.remoteAddress;
|
46
|
+
req.remotePort=client.remotePort;
|
47
|
+
req.params=data;
|
48
|
+
let res={};
|
49
|
+
res.send=function (v){
|
50
|
+
if(Array.isArray(v)){
|
51
|
+
v=new Buffer(v)
|
52
|
+
}
|
53
|
+
client.write(v)
|
54
|
+
}
|
55
|
+
TcpServer._EventCallBack['data'](req,res);
|
56
|
+
});
|
57
|
+
|
58
|
+
// 客户端连接关闭
|
59
|
+
client.on('close', function (err) {
|
60
|
+
delete that.socketClientMap[endPoint];
|
61
|
+
TcpServer._EventCallBack["close"]?TcpServer._EventCallBack["close"](client):"";
|
62
|
+
});
|
63
|
+
// 客户端连接错误
|
64
|
+
client.on('error', function (err) {
|
65
|
+
delete that.socketClientMap[endPoint];
|
66
|
+
TcpServer._EventCallBack["error"]?TcpServer._EventCallBack["error"](client):"";
|
67
|
+
});
|
68
|
+
});
|
69
|
+
this.socketServer.listen(
|
70
|
+
{
|
71
|
+
port: port,
|
72
|
+
host: '0.0.0.0',
|
73
|
+
},
|
74
|
+
function () {
|
75
|
+
//console.log('Tcpserver listen listen on '+that.localPort);
|
76
|
+
}
|
77
|
+
);
|
78
|
+
|
79
|
+
//设置监听时的回调函数
|
80
|
+
this.socketServer.on('listening', function () {
|
81
|
+
const { address, port } = that.socketServer.address();
|
82
|
+
console.log('Tcpserver listen on '+port);
|
83
|
+
});
|
84
|
+
|
85
|
+
//设置关闭时的回调函数
|
86
|
+
this.socketServer.on('close', function () {
|
87
|
+
console.log('sever closed');
|
88
|
+
that.socketClientMap={};
|
89
|
+
});
|
90
|
+
|
91
|
+
//设置出错时的回调函数
|
92
|
+
this.socketServer.on('error', function () {
|
93
|
+
console.log('sever error');
|
94
|
+
that.socketClientMap={};
|
95
|
+
});
|
96
|
+
}
|
97
|
+
|
98
|
+
send(buffer){
|
99
|
+
let clientEndPointList= Object.keys(this.socketClientMap);
|
100
|
+
for (let i=0;i<clientEndPointList.length;i++){
|
101
|
+
this.socketClientMap[clientEndPointList[i]].write(buffer)
|
102
|
+
}
|
103
|
+
|
104
|
+
}
|
105
|
+
|
106
|
+
}
|
107
|
+
|
108
|
+
module.exports = TcpServer;
|
@@ -0,0 +1,68 @@
|
|
1
|
+
const dgram = require('dgram');
|
2
|
+
class UdpClient {
|
3
|
+
static _EventCallBack={};
|
4
|
+
|
5
|
+
constructor(remoteIp,remotePort) {
|
6
|
+
this.server = dgram.createSocket('udp4');
|
7
|
+
this.remotePort=remotePort ;
|
8
|
+
this.remoteIp=remoteIp;
|
9
|
+
this.port=0;
|
10
|
+
this.install();
|
11
|
+
}
|
12
|
+
|
13
|
+
set(url, callback) {
|
14
|
+
UdpClient._EventCallBack[url]=callback;
|
15
|
+
}
|
16
|
+
|
17
|
+
listen(port){
|
18
|
+
this.port=port;
|
19
|
+
this.server.bind(port);
|
20
|
+
|
21
|
+
}
|
22
|
+
send(v,remoteIp,remotePort) {
|
23
|
+
if(remoteIp){
|
24
|
+
this.remoteIp=remoteIp;
|
25
|
+
}
|
26
|
+
if(remotePort){
|
27
|
+
this.remoteIp=remotePort;
|
28
|
+
}
|
29
|
+
if(Array.isArray(v)){
|
30
|
+
v=new Buffer(v)
|
31
|
+
}
|
32
|
+
this.server.send(v,this.remotePort,this.remoteIp)
|
33
|
+
}
|
34
|
+
|
35
|
+
install(app,server){
|
36
|
+
let that=this;
|
37
|
+
this.server.on('close',()=>{
|
38
|
+
UdpClient._EventCallBack['close']? UdpClient._EventCallBack['close']():console.log('udp close');
|
39
|
+
});
|
40
|
+
|
41
|
+
this.server.on('error',(err)=>{
|
42
|
+
UdpClient._EventCallBack['error']? UdpClient._EventCallBack['error'](): console.log(err);
|
43
|
+
});
|
44
|
+
|
45
|
+
this.server.on('listening',()=>{
|
46
|
+
UdpClient._EventCallBack['listening']? UdpClient._EventCallBack['listening'](): console.log('udp listen on '+that.port);;
|
47
|
+
|
48
|
+
});
|
49
|
+
this.server.on('message',(msg,rinfo)=>{
|
50
|
+
let req={}
|
51
|
+
req.rinfo=rinfo;
|
52
|
+
req.remoteIp=rinfo.address;
|
53
|
+
req.remotePort=rinfo.port;
|
54
|
+
req.params=msg;
|
55
|
+
let res={};
|
56
|
+
res.send=function (v){
|
57
|
+
if(Array.isArray(v)){
|
58
|
+
v=new Buffer(v)
|
59
|
+
}
|
60
|
+
that.server.send(v,rinfo.port ,rinfo.address)
|
61
|
+
}
|
62
|
+
UdpClient._EventCallBack['message'](req,res)
|
63
|
+
});
|
64
|
+
|
65
|
+
}
|
66
|
+
}
|
67
|
+
|
68
|
+
module.exports = UdpClient;
|
@@ -0,0 +1,64 @@
|
|
1
|
+
const dgram = require('dgram');
|
2
|
+
class UdpServer {
|
3
|
+
static _EventCallBack={};
|
4
|
+
|
5
|
+
constructor() {
|
6
|
+
this.server = dgram.createSocket('udp4');
|
7
|
+
this.remotePort=0;
|
8
|
+
this.remoteIp=0;
|
9
|
+
this.port=0;
|
10
|
+
this.install();
|
11
|
+
}
|
12
|
+
|
13
|
+
set(url, callback) {
|
14
|
+
UdpServer._EventCallBack[url]=callback;
|
15
|
+
}
|
16
|
+
|
17
|
+
listen(port){
|
18
|
+
this.port=port;
|
19
|
+
this.server.bind(port);
|
20
|
+
|
21
|
+
}
|
22
|
+
send(v,remoteIp,remotePort) {
|
23
|
+
if(remoteIp){
|
24
|
+
this.remoteIp=remoteIp;
|
25
|
+
}
|
26
|
+
if(remotePort){
|
27
|
+
this.remoteIp=remotePort;
|
28
|
+
}
|
29
|
+
if(Array.isArray(v)){
|
30
|
+
v=new Buffer(v)
|
31
|
+
}
|
32
|
+
this.server.send(v,this.remotePort,this.remoteIp)
|
33
|
+
}
|
34
|
+
|
35
|
+
install(app,server){
|
36
|
+
let that=this;
|
37
|
+
this.server.on('close',()=>{
|
38
|
+
UdpServer._EventCallBack['close']? UdpServer._EventCallBack['close']():console.log('udp close');
|
39
|
+
});
|
40
|
+
|
41
|
+
this.server.on('error',(err)=>{
|
42
|
+
UdpServer._EventCallBack['error']? UdpServer._EventCallBack['error'](): console.log(err);
|
43
|
+
});
|
44
|
+
|
45
|
+
this.server.on('listening',()=>{
|
46
|
+
UdpServer._EventCallBack['listening']? UdpServer._EventCallBack['listening'](): console.log('udp listen on '+that.port);;
|
47
|
+
|
48
|
+
});
|
49
|
+
this.server.on('message',(msg,rinfo)=>{
|
50
|
+
that.remoteIp=rinfo.address;
|
51
|
+
that.remotePort=rinfo.port;
|
52
|
+
let req={}
|
53
|
+
req.rinfo=rinfo;
|
54
|
+
req.ip=rinfo.address;
|
55
|
+
req.port=rinfo.port;
|
56
|
+
req.params=msg;
|
57
|
+
let res=that;
|
58
|
+
UdpServer._EventCallBack['message'](req,res)
|
59
|
+
});
|
60
|
+
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
module.exports = UdpServer;
|
package/package.json
CHANGED
@@ -0,0 +1,30 @@
|
|
1
|
+
const DataConvert={};
|
2
|
+
|
3
|
+
DataConvert.num2Bytes=(num,length=4)=>{
|
4
|
+
if(length==2){
|
5
|
+
return [(num&(0xFF00))>>8,num&(0x00FF)]
|
6
|
+
}
|
7
|
+
if(length==4){
|
8
|
+
return [(num&(0xFF000000))>>24,(num&(0x00FF0000))>>16,(num&(0x0000FF00))>>8,num&(0x00FF)]
|
9
|
+
}
|
10
|
+
}
|
11
|
+
|
12
|
+
DataConvert.str2Bytes=(str,length=16)=>{
|
13
|
+
let zeroBuffer=new Buffer(length);
|
14
|
+
let strBuffer=new Buffer(str);
|
15
|
+
for (let i=0;i<16;i++){
|
16
|
+
zeroBuffer[i]=strBuffer[i];
|
17
|
+
}
|
18
|
+
return zeroBuffer;
|
19
|
+
}
|
20
|
+
|
21
|
+
DataConvert.parseIpToInt=(ip)=> {
|
22
|
+
var buf = ip.split(".")
|
23
|
+
return (parseInt(buf[0]) << 24 |
|
24
|
+
parseInt(buf[1]) << 16 |
|
25
|
+
parseInt(buf[2]) << 8 |
|
26
|
+
parseInt(buf[3]))>>>0;
|
27
|
+
}
|
28
|
+
|
29
|
+
|
30
|
+
module.exports = DataConvert;
|
@@ -0,0 +1,72 @@
|
|
1
|
+
const cluster = require('cluster');
|
2
|
+
const child_process = require('child_process');
|
3
|
+
const http = require('http');
|
4
|
+
|
5
|
+
function clusterStart(mainFile,reloadPort,beforeCmd,logFun,logHeatBeat){
|
6
|
+
if (cluster.isMaster) {
|
7
|
+
console.log(`主进程 ${process.pid} 正在运行`);
|
8
|
+
// fork工作进程
|
9
|
+
forkWorkProcess();
|
10
|
+
createReloadServer();
|
11
|
+
cluster.on('exit', work => {
|
12
|
+
console.log(`工作进程 ${work.process.pid} 已退出`);
|
13
|
+
});
|
14
|
+
} else {
|
15
|
+
require(mainFile);
|
16
|
+
console.log(`工作进程 ${process.pid} 已启动`);
|
17
|
+
}
|
18
|
+
|
19
|
+
// 创建1个工作进程
|
20
|
+
function forkWorkProcess() {
|
21
|
+
const node_version_cmd=beforeCmd;
|
22
|
+
logFun("===>"+node_version_cmd)
|
23
|
+
child_process.exec(node_version_cmd, (e, stdout) => {
|
24
|
+
logFun(stdout);
|
25
|
+
setTimeout(() => {
|
26
|
+
cluster.fork();
|
27
|
+
}, 2000);
|
28
|
+
});
|
29
|
+
}
|
30
|
+
|
31
|
+
//创建监听重启命令的http服务器
|
32
|
+
function createReloadServer() {
|
33
|
+
http.createServer((req, res) => {
|
34
|
+
if (req.url === '/reload') {
|
35
|
+
if (cluster.isMaster) {
|
36
|
+
const arr = Object.keys(cluster.workers);
|
37
|
+
if (arr.length !== 0) {
|
38
|
+
forkWorkProcess();
|
39
|
+
setTimeout(() => {
|
40
|
+
const arr = Object.keys(cluster.workers);
|
41
|
+
process.kill(cluster.workers[arr[0]].process.pid);
|
42
|
+
}, 20000);
|
43
|
+
}
|
44
|
+
}
|
45
|
+
res.end('reloading');
|
46
|
+
} else {
|
47
|
+
res.end('unknow command');
|
48
|
+
}
|
49
|
+
}).listen(reloadPort);
|
50
|
+
}
|
51
|
+
|
52
|
+
// 查看log
|
53
|
+
setInterval(() => {
|
54
|
+
if (cluster.isMaster) {
|
55
|
+
const workerArr = Object.keys(cluster.workers);
|
56
|
+
// 工作进程意外退出时,fork新的工作进程
|
57
|
+
if (workerArr.length === 0) {
|
58
|
+
forkWorkProcess();
|
59
|
+
}
|
60
|
+
logFun(new Date());
|
61
|
+
logFun(workerArr);
|
62
|
+
logFun(`主进程pid:${process.pid}`);
|
63
|
+
} else {
|
64
|
+
logFun(`工作进程pid:${process.pid}`);
|
65
|
+
}
|
66
|
+
}, logHeatBeat);
|
67
|
+
|
68
|
+
|
69
|
+
}
|
70
|
+
|
71
|
+
|
72
|
+
module.exports =clusterStart;
|