Node.js sample application with Socket.IO
リビジョン | ca8b208fa2dac803bd0497a210e6633e6232e59b (tree) |
---|---|
日時 | 2012-10-26 01:08:10 |
作者 | hylom <hylom@hylo...> |
コミッター | hylom |
fix say message
@@ -38,29 +38,50 @@ server.listen(app.get('port'), function(){ | ||
38 | 38 | console.log("Express server listening on port " + app.get('port')); |
39 | 39 | }); |
40 | 40 | |
41 | +// socket.ioのソケットを管理するオブジェクト | |
41 | 42 | var socketsOf = {}; |
42 | 43 | |
44 | +// socket.ioのコネクション設定 | |
43 | 45 | io.sockets.on('connection', function (socket) { |
46 | + // コネクションが確立されたら'connected'メッセージを送信する | |
44 | 47 | 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] = {}; | |
51 | 55 | } |
56 | + socketsOf[client.roomId][client.userName] = socket; | |
52 | 57 | }); |
53 | 58 | |
54 | - socket.on('say', function (data) { | |
59 | + // クライアントは'say'メッセージとともにチャットメッセージを送信する | |
60 | + socket.on('say', function (message) { | |
55 | 61 | console.log('receive message'); |
56 | 62 | 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 | + }); | |
62 | 69 | } |
63 | 70 | }); |
64 | 71 | |
65 | 72 | }); |
66 | 73 | |
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 | + |
@@ -9,12 +9,13 @@ a { | ||
9 | 9 | } |
10 | 10 | |
11 | 11 | #messages { |
12 | - margin-top: 60px; | |
12 | + margin-top: 20px; | |
13 | 13 | background: white; |
14 | 14 | border: 1px solid #bbb; |
15 | 15 | } |
16 | 16 | |
17 | 17 | .message { |
18 | + margin-top: 8px; | |
18 | 19 | border-bottom: 1px solid #ddd; |
19 | 20 | line-height: 120%; |
20 | 21 | } |
@@ -30,3 +31,15 @@ a { | ||
30 | 31 | .message .comment { |
31 | 32 | word-wrap: break-word; |
32 | 33 | } |
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 | +} |
@@ -1,6 +1,5 @@ | ||
1 | 1 | // room.js |
2 | 2 | |
3 | - | |
4 | 3 | (function () { |
5 | 4 | var socket; |
6 | 5 |
@@ -8,26 +7,39 @@ | ||
8 | 7 | $(document).ready(function () { |
9 | 8 | // ユーザー名、ルーム名、パスワードを送信 |
10 | 9 | socket = io.connect('http://localhost'); |
11 | - // ページロード時の処理ここまで | |
10 | + | |
11 | + // メッセージハンドラの定義 | |
12 | + // サーバーへの接続完了 | |
12 | 13 | socket.on('connected', function(data) { |
13 | - socket.emit('regist request', {roomId: minichat.roomId}); | |
14 | + socket.emit('regist request', minichat); | |
14 | 15 | }); |
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); | |
17 | 25 | }); |
26 | + | |
27 | + // チャットメッセージの送信完了 | |
18 | 28 | socket.on('say accept', function (data) { |
19 | 29 | $('#message').val(''); |
20 | 30 | }); |
21 | - }); | |
22 | 31 | |
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); | |
28 | 40 | }); |
29 | - }); | |
30 | 41 | |
42 | + }); // document.ready()ここまで | |
31 | 43 | |
32 | 44 | |
33 | 45 | }).apply(this); |
@@ -27,6 +27,10 @@ block content | ||
27 | 27 | label |
28 | 28 | textarea#message.span4(rows='5', placeholder='メッセージを入力...') |
29 | 29 | button#post-message.btn.btn-primary(type='button') メッセージを投稿 |
30 | + #members-box | |
31 | + h5 チャットメンバー: | |
32 | + ul#members | |
33 | + li #{user.name} | |
30 | 34 | .span8 |
31 | 35 | #messages.well |
32 | 36 | .message |