NodeJS实现UDP数据报套接字通讯
Server
var dgram = require('dgram');
var socket = dgram.createSocket('udp4');
var colors = require("colors");
var clientList = [];
var Config = {
socketPort: 10086,
httpPort: 11086,
heartBeat: 1,
message: 2,
//用户状态保持时间
userTimeout: 10,
//显示用户数时间间隔
showUserTime: 3000,
system: 1,
group: 2,
systemAccount: 10000
};
socket.on('message', function(data, client) {
var address = client.address;
var port = client.port;
data = JSON.parse(data.toString());
switch (data.type) {
case Config.heartBeat:
if (!clientExist(clientList, data.account)) {
clientList.push({
account: data.account,
name: data.name,
address: address,
port: port,
last: getTimeStamps()
});
sendSystemMsg(data.name + " 上线了");
} else {
for (var i = 0; i < clientList.length; i++) {
if (clientList[i].account === data.account) {
clientList[i].last = getTimeStamps();
}
}
}
break;
case Config.message:
debug((data.name + ' says : ' + data.message).white);
switch (data.message) {
case "whoami":
sendSystemMsg((data.name.yellow) + " " + ("连自己是谁都不知道了。。。").red);
break;
default:
var msg = JSON.stringify({
type: Config.group,
account: data.account,
name: data.name,
address: address,
port: port,
msg: data.message.toString()
});
groupMsg(msg);
}
break;
default:
debug("Known message type".yellow);
}
});
function groupMsg(msg) {
for (var i = 0; i < clientList.length; i++) {
socket.send(new Buffer(msg), 0, new Buffer(msg).length, clientList[i].port, clientList[i].address, function(err, bytes) {
//debug("Group message success!");
});
}
}
function getTimeStamps() {
return Date.parse(new Date()) / 1000;
}
function sendSystemMsg(msg) {
var msg = JSON.stringify({
type: Config.system,
account: Config.systemAccount,
name: "系统消息",
address: "",
port: "",
msg: msg
});
groupMsg(msg);
}
function showUsers() {
setTimeout(function() {
for (var i = 0; i < clientList.length; i++) {
if (clientList[i].last + Config.userTimeout < getTimeStamps()) {
debug((clientList[i].name + " 下线了").red)
sendSystemMsg(clientList[i].name + " 下线了");
clientList.splice(i, 1);
}
}
showUsers();
}, Config.showUserTime);
}
socket.on('error', function(err) {
debug(("Socket Error " + err.message).red);
});
socket.on('listening', function() {
debug(("Socket服务{" + Config.socketPort + "}启动成功!").yellow);
})
socket.bind(Config.socketPort);
showUsers();
var crypto = require('crypto');
var http = require('http');
var url = require('url');
var querystring = require('querystring');
var httpServer = http.createServer(function(req, res) {
res.writeHead(200, {
'Content-Type': 'text/plain;charset=utf-8'
});
if (req.method.toUpperCase() == 'POST') {
res.end("Hello world");
} else if (req.method.toUpperCase() == 'GET') {
var query = new QueryString(req);
if (query.msg != null) {
sendSystemMsg(query.msg);
}
res.end("Send OK!");
} else {
res.end("Hello world");
}
});
httpServer.listen(Config.httpPort);
debug(("Web服务{" + Config.httpPort + "}启动成功!").yellow);
function debug(msg) {
console.log(msg);
}
function clientExist(clients, account) {
for (var i = 0; i < clients.length; i++) {
if (clients[i].account === account) {
return true;
}
}
return false;
}
function getClient(id) {
for (var i = 0; i < clientList.length; i++) {
if (clientList[i].id == id) {
return clientList[i];
}
}
return null;
}
function QueryString(req) {
return querystring.parse(url.parse(req.url).query);
}
function sha1(str) {
var sha1 = crypto.createHash("sha1");
sha1.update(str);
var res = sha1.digest("hex"); //加密后的值d
return res;
}