-
Notifications
You must be signed in to change notification settings - Fork 3
/
socketServer.js
310 lines (204 loc) · 8.4 KB
/
socketServer.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
console.log('重要的事情说三遍');
console.log('运行socketServer.js')
console.log('运行socketServer.js')
console.log('运行socketServer.js')
var net = require("net");
var config = require('./config')
/**
* 创建server
*/
function removeBlank(str) {
var result = str.replace(/^\s+|\s+$/g, '');
return result
}
function recordClientInfo(client) {
// 唯一标识码 做键名
var fs = require('fs'); //文件模块
var path = require('path'); //系统路径模块
fs.exists("./clientInfo.json", function (exists) {
console.log("./clientInfo.json")
console.log(exists ? "存在" : "不存在");
var file = path.join(__dirname, './clientInfo.json');
if (!exists) {
//指定创建目录及文件名称,__dirname为执行当前js文件的目录
//写入文件
var content = {}
var 唯一标识码 = client.唯一标识码
content[唯一标识码] = client
var content = JSON.stringify(content);
fs.writeFile(file, content, function (err) {
if (err) {
return console.log(err);
}
console.log('客户端信息文件创建成功,地址:' + file);
console.log("本次记录的客户端为");
console.log(content);
});
} else {
fs.readFile(file, 'utf8', function (err, data) {
if (err) console.log(err);
var clientInfo = JSON.parse(data);
var 唯一标识码 = client.唯一标识码
clientInfo[唯一标识码] = client
// fs.writeFileSync('test1.json',t)
var content = JSON.stringify(clientInfo);
fs.writeFile(file, content, function (err) {
if (err) {
return console.log(err);
}
console.log('客户端信息写入成功,写入文件为:' + file);
console.log("本次记录的客户端为");
console.log(content);
});
});
}
});
}
所有的手机 = []
function t1() {
var server = net.createServer()
server.on('connection', function (socket) {
var t = config.getTime()
socket.write(t + "hello,i'm nodejs! giveMeMobileInfo" + "\r\n");
console.log(t + "client connected! %j:%j", socket.remoteAddress, socket.remotePort);
所有的手机.push(socket)
socket.on("customEvent", function (msg) {
console.log('Received customEvent->' + msg);
});
socket.emit('customEvent', '与on同级别 socket emit customEvent')
socket.on("data", function (data) {
socket.emit('customEvent', 'data事件内部 socket emit customEvent')
var t = config.getTime()
var mobileInfo = ''
if ((data.toString()).indexOf('thisIsMobileInfo') != -1) {
var data = data.toString()
data = data.replace('thisIsMobileInfo', '')
mobileInfo = JSON.parse(data)
mobileInfo.ip = socket.remoteAddress
mobileInfo.port = socket.remotePort
mobileInfo.客户端登记时间 = t + ""
console.log("服务器收到的手机信息mobileInfo=")
console.log(mobileInfo);
console.table(mobileInfo);
recordClientInfo(mobileInfo)
var scriptContent = 'alert(\'' + JSON.stringify(mobileInfo) + '\')'
if (mobileInfo) {
// socket.write("runScript"+scriptContent+"\r\n");
// once=true
}
}
if (removeBlank(data.toString()) == 'iHadRunScript') {
console.log('手机执行脚本完毕->' + scriptContent);
} else if ((data.toString()).indexOf('iHadRunScript') != -1) {
console.log('indexOf手机执行脚本完毕,手机传过来的数据===' + data.toString() + "===");
}
console.log(t + "recived from autojs:", data.toString());
socket.write(t + "这是来自nodejs的数据->海贼王啥时候完结??" + "\r\n");
broadcast(data, socket)
})
socket.on("close", function (had_error) {
if (!had_error) {
console.log("client closed success! %j:%j", socket.remoteAddress, socket.remotePort);
} else {
console.log("client close error! %j:%j", socket.remoteAddress, socket.remotePort);
}
})
socket.on("error", function (err) {
console.log("!!!err!!!", err);
});
socket.on('end', function () {
所有的手机.splice(所有的手机.indexOf(socket), 1); // 删除数组中的制定元素。这是 JS 基本功哦~
})
//setTimeout(function(){
// socket.end("我结束了","utf8");
//},3000);
});
function broadcast(message, client) {
var clientList = 所有的手机
var cleanup = []
for (var i = 0; i < clientList.length; i += 1) {
if (client !== clientList[i]) {
if (clientList[i].writable) { // 先检查 sockets 是否可写
// clientList[i].write(client.name + " says " + message)
} else {
cleanup.push(clientList[i]) // 如果不可写,收集起来销毁。销毁之前要 Socket.destroy() 用 API 的方法销毁。
clientList[i].destroy()
}
}
} //Remove dead Nodes out of write loop to avoid trashing loop index
for (i = 0; i < cleanup.length; i += 1) {
clientList.splice(clientList.indexOf(cleanup[i]), 1)
}
}
server.listen({
port: config.port
}, function () {
var t = config.getTime()
var address = server.address();
console.log(t + " opened server on address %j ", address);
});
}
t1();
process.on('message', (msg) => {
console.log('大头儿子收到小头爸爸发来的的消息->' + msg)
if (msg.indexOf("项目更新信息") != -1) {
if (msg.indexOf("手机唯一标识码") != -1) {
命令指定手机更新指定项目的脚本(msg)
} else {
命令所有手机更新指定项目的脚本(msg)
}
}
process.send(`\n小头爸爸,我收到你的消息了,剩下的事情交给我了\n`);
// process.send(`\nhello parent\n`);
// process.send('[worker] worker received!');
});
function 命令所有手机更新指定项目的脚本(项目更新信息) {
console.log("执行命令,所有手机更新指定项目的脚本");
console.log("手机数量=" + 所有的手机.length);
for (let i = 0; i < 所有的手机.length; i++) {
var socket = 所有的手机[i]
socket.write("都起床,小头爸爸说,得更新脚本啦" + "\r\n");
socket.write(项目更新信息 + "\r\n");
console.log("本次通知手机对象%j:%j", socket.remoteAddress, socket.remotePort);
}
console.log('已经通知了所有手机')
}
function remoteAddress和手机唯一标识码是否对应(remoteAddress,手机唯一标识码){
if(手机唯一标识码.length<6){return false}
var fs = require('fs');
var 客户端的手机信息 = fs.readFileSync('./clientInfo.json')
客户端的手机信息=JSON.parse(客户端的手机信息)
if(客户端的手机信息.hasOwnProperty(手机唯一标识码)){
var 手机ip=客户端的手机信息[手机唯一标识码].ip
if(remoteAddress.indexOf(手机ip) != -1){
console.log(remoteAddress+' <=> '+手机唯一标识码);
return true
}
}
console.log(remoteAddress+' ~=~ '+手机唯一标识码);
return false
}
function 命令指定手机更新指定项目的脚本(项目更新信息) {
var 项目更新信息=项目更新信息.replace('项目更新信息','')
console.log('项目更新信息=',项目更新信息);
console.log("执行命令,指定手机更新指定项目的脚本");
console.log("手机数量=" + 所有的手机.length);
//ip数组
var 项目中包含的手机唯一标识码=(JSON.parse(项目更新信息)).手机唯一标识码
var 手机唯一标识码 = 项目中包含的手机唯一标识码
console.log('项目中包含的手机唯一标识码=',项目中包含的手机唯一标识码)
for (let j = 0; j < 手机唯一标识码.length; j++) {
for (let i = 0; i < 所有的手机.length; i++) {
var socket = 所有的手机[i]
//使用手机唯一标识码来指定手机
if(remoteAddress和手机唯一标识码是否对应(socket.remoteAddress,手机唯一标识码[j])){
var t = config.getTime()
socket.write(t + "你符合"+手机唯一标识码[j]+"! giveMeMobileInfo" + "\r\n");
socket.write("都起床,小头爸爸说,得更新脚本啦" + "\r\n");
socket.write('项目更新信息'+项目更新信息 + "\r\n");
console.log("本次通知手机对象%j:%j", socket.remoteAddress, socket.remotePort);
}
}
}
console.log('已经通知了指定手机')
}