• R/O
  • HTTP
  • SSH
  • HTTPS

コミット

タグ
未設定

よく使われているワード(クリックで追加)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Node.js sample application with Socket.IO


コミットメタ情報

リビジョンca8b208fa2dac803bd0497a210e6633e6232e59b (tree)
日時2012-10-26 01:08:10
作者hylom <hylom@hylo...>
コミッターhylom

ログメッセージ

fix say message

変更サマリ

差分

--- a/app.js
+++ b/app.js
@@ -38,29 +38,50 @@ server.listen(app.get('port'), function(){
3838 console.log("Express server listening on port " + app.get('port'));
3939 });
4040
41+// socket.ioのソケットを管理するオブジェクト
4142 var socketsOf = {};
4243
44+// socket.ioのコネクション設定
4345 io.sockets.on('connection', function (socket) {
46+ // コネクションが確立されたら'connected'メッセージを送信する
4447 socket.emit('connected', {});
45- socket.on('regist request', function (data) {
46- console.log('regist client for ' + data.roomId);
47- if (socketsOf[data.roomId] !== undefined) {
48- socketsOf[data.roomId].push(socket);
49- } else {
50- socketsOf[data.roomId] = [socket];
48+
49+ // クライアントは'connected'メッセージを受信したら、
50+ // クライアントの情報とともに'regist request'メッセージを送信する
51+ socket.on('regist request', function (client) {
52+ console.log('regist client');
53+ if (socketsOf[client.roomId] === undefined) {
54+ socketsOf[client.roomId] = {};
5155 }
56+ socketsOf[client.roomId][client.userName] = socket;
5257 });
5358
54- socket.on('say', function (data) {
59+ // クライアントは'say'メッセージとともにチャットメッセージを送信する
60+ socket.on('say', function (message) {
5561 console.log('receive message');
5662 socket.emit('say accept', {});
57- if (socketsOf[data.roomId] !== undefined) {
58- var targets = socketsOf[data.roomId];
59- for (var i = 0; i < targets.length; i++) {
60- targets[i].emit('push message', data);
61- }
63+ message.date = _formatDate(new Date());
64+ if (socketsOf[message.roomId] !== undefined) {
65+ var sockets = socketsOf[message.roomId];
66+ Object.keys(sockets).forEach(function (key) {
67+ sockets[key].emit('push message', message);
68+ });
6269 }
6370 });
6471
6572 });
6673
74+function _formatDate(date) {
75+ var mm = date.getMonth();
76+ var dd = date.getDate();
77+ var HH = date.getHours();
78+ var MM = date.getMinutes();
79+ if (HH < 10) {
80+ HH = '0' + HH;
81+ }
82+ if (MM < 10) {
83+ MM = '0' + MM;
84+ }
85+ return mm + '/' + dd + ' ' + HH + ':' + MM;
86+};
87+
--- a/public/css/style.css
+++ b/public/css/style.css
@@ -9,12 +9,13 @@ a {
99 }
1010
1111 #messages {
12- margin-top: 60px;
12+ margin-top: 20px;
1313 background: white;
1414 border: 1px solid #bbb;
1515 }
1616
1717 .message {
18+ margin-top: 8px;
1819 border-bottom: 1px solid #ddd;
1920 line-height: 120%;
2021 }
@@ -30,3 +31,15 @@ a {
3031 .message .comment {
3132 word-wrap: break-word;
3233 }
34+
35+#members-box {
36+ border-top: 1px solid #ddd;
37+}
38+
39+#members-box ul {
40+ margin: 0 0 0 10px;;
41+}
42+#members-box li {
43+ font-size: 100%;
44+ list-style: none;
45+}
--- a/public/js/room.js
+++ b/public/js/room.js
@@ -1,6 +1,5 @@
11 // room.js
22
3-
43 (function () {
54 var socket;
65
@@ -8,26 +7,39 @@
87 $(document).ready(function () {
98 // ユーザー名、ルーム名、パスワードを送信
109 socket = io.connect('http://localhost');
11- // ページロード時の処理ここまで
10+
11+ // メッセージハンドラの定義
12+ // サーバーへの接続完了
1213 socket.on('connected', function(data) {
13- socket.emit('regist request', {roomId: minichat.roomId});
14+ socket.emit('regist request', minichat);
1415 });
15- socket.on('push message', function (data) {
16- alert(data.message);
16+
17+ // チャットメッセージ受信
18+ socket.on('push message', function (message) {
19+ var html = '<div class="message">'
20+ + '<p class="postdate pull-right">' + message.date + '</p>'
21+ + '<p class="author">' + message.from + ':</p>'
22+ + '<p class="comment">' + message.body + '</p>'
23+ + '</div>';
24+ $('#messages').prepend(html);
1725 });
26+
27+ // チャットメッセージの送信完了
1828 socket.on('say accept', function (data) {
1929 $('#message').val('');
2030 });
21- });
2231
23- $('#post-message').live('click', function () {
24- socket.emit('say', {
25- name: minichat.userName,
26- message: $('#message').val(),
27- roomId: minichat.roomId
32+ // メッセージの送信ボタンを有効化
33+ $('#post-message').on('click', function () {
34+ var message = {
35+ from: minichat.userName,
36+ body: $('#message').val(),
37+ roomId: minichat.roomId
38+ };
39+ socket.emit('say', message);
2840 });
29- });
3041
42+ }); // document.ready()ここまで
3143
3244
3345 }).apply(this);
--- a/views/room.jade
+++ b/views/room.jade
@@ -27,6 +27,10 @@ block content
2727 label
2828 textarea#message.span4(rows='5', placeholder='メッセージを入力...')
2929 button#post-message.btn.btn-primary(type='button') メッセージを投稿
30+ #members-box
31+ h5 チャットメンバー:
32+ ul#members
33+ li #{user.name}
3034 .span8
3135 #messages.well
3236 .message