/*
【node.js】socket.ioで構築したローカルで動くシンプルなチャットルーム。みんなで書けるリモート版も公開中。
http://www.tettori.net/post/852/
Node + MongoDBでチャット的ななにかをつくる - Mongodbの導入、セッションを貼る、チャットロビーの作成まで
http://atasatamatara.hatenablog.jp/entry/20120420/1334922757
*/
// ----------------------------------------------------------
var http = require("http");
var url = require('url');
var fs = require("fs");
var WebSocketServer = require('ws').Server;
var mongoose = require('mongoose');
var member={};
// ----------------------------------------------------------
// MongoDB定義フェーズ
var Schema = mongoose.Schema;
var commentSchema = new Schema({
message : { type:String, required: true },
date : { type:Date, default: Date.now }
});
mongoose.model('Comment', commentSchema);
var db = mongoose.createConnection('mongodb://localhost/chat_db');
var Comment = db.model('Comment');
// ----------------------------------------------------------
//httpサーバー
var server = http.createServer(function(req, res) {
//GET
var params = url.parse(req.url, true);
for (var keyString in params) {
if(keyString=="host"||keyString=="port"||keyString=="hostname"||keyString=="href"){
if(keyString=="href"){
var h=params[keyString];
if(h.indexOf("//")==0){
h=h.substring(1);
params[keyString]=h;
params.pathname=h.substring(0,h.indexOf("?"));;
}
}
console.log("params "+keyString+" : "+params[keyString]);
}
else
console.log("params "+keyString+".");
}
for (var key in req.headers)console.log("req.headers:"+key+":"+req.headers[key]);
if(params.pathname=="/httpserv"){
console.log("***** "+params.query.mode);
if(params.query.mode=="getdata"){
// Comment.find( {}, function(err, docs) {
Comment.find({}).sort({date:-1}).execFind( function(err, docs) {
var st="";
if(docs){
for (var i=0, size=docs.length; i<size; ++i) {
var msg=docs[i].message.split("\\'").join("'");
var msg=docs[i].message.split("\\\"").join("\"");
var dd=docs[i].date;
st += "message: "+msg+" date: "+dd+ "<br> ";
console.log(docs[i]);
}
}
else st="No Data";
for (var keyString in member) {
console.log("●USER INFO "+keyString+":"+member[keyString]);
} res.setHeader("Pragma","no-cache");
res.setHeader("Expires","-1");
res.writeHead(200, {'Content-Type': 'text/html; charset="UTF-8"'});
res.end("<>"+st+"</p>");
});
}
}
else {
console.log("./index_websocket.html");
res.writeHead(200, {"Content-Type":"text/html"});
var output = fs.readFileSync("./index_websocket.html", "utf-8");
res.end(output);
}
}).listen(process.env.VMC_APP_PORT || 3001);
// ----------------------------------------------------------
//websocketサーバー
var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({server:server});
//Websocket接続情報を保存
var connections = [];
//接続時
wss.on('connection', function (ws) {
//for (var key in ws)console.log("ws "+key+":"+ws[key]);
connections.push(ws); //WebSocket接続情報の保存
//受信メッセージのブロードキャスト
ws.on('message', function (data) {
data=JSON.parse(data);
var comment = new Comment();
comment.message = data.message;
comment.date = Date.now();
comment.save( function(err, comment) {
if (err) { console.log(err); }
});
console.log('message:', comment.message);
broadcast(JSON.stringify(comment.message));
});
//切断イベント
ws.on('close', function () {
connections = connections.filter(function (conn, i) {
return (conn === ws) ? false : true;
});
});
});
//メッセージのブロードキャスト
function broadcast(message) {
connections.forEach(function (con, i) {
con.send(message);
});
};