12470


Socket.ioで双方向通信のWebアプリを開発中です。  
現在、サーバ側からのemitはできるのですが、クライアントからのemitが送信できない状態です。

server.js

[code]

    var fs = require('fs'),
        socketio = require('socket.io'),
        path = require('path');
    
    var server = require('http').createServer();
    server.on('request', doRequest);
    server.listen(1234);
    
    var io = socketio.listen(server);
    io.sockets.on('connection', function(socket) {
    
        socket.emit('connect');
    
        socket.on('msg', function(data) {
            console.log(data);
        });
    });
    
    function doRequest(req, res) {
        switch(path.extname(req.url)) {
        case '':
            fs.readFile('./index.html', 'UTF-8',
                function (err, data) {
                    res.writeHead(200, {'Content-Type': 'text/html'});
                    res.write(data);
                    res.end();
                }
            );
            break;
        case '.css':
            fs.readFile('.'+req.url, 'UTF-8',
                function (err, data) {
                    res.writeHead(200, {'Content-Type': 'text/css'});
                    res.write(data);
                    res.end();
                }
            );
            break;
        case '.js':
            fs.readFile('.'+req.url, 'UTF-8',
                function (err, data) {
                    res.writeHead(200, {'Content-Type': 'application/javascript'});
                    res.write(data);
                    res.end();
                }
            );
            break;
        }
    }
    
[/code]

index.html

[code]

    <!DOCTYPE html>
    <html>
    <head>
        <meta http-equiv="content-type" content="text/html">
        <meta charset="UTF-8">
        <title>chat</title>
        <link rel="stylesheet" type="text/css" href="style.css">
        <script src="/socket.io/socket.io.js"></script>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
        <script>
        var socket = io.connect('http://localhost:1234');
    
        socket.on('connect', function() {
            socket.emit('msg', 'connect!');
            console.log('connect!');
        });
    
        function send() {
            var msg = $('#msg').val();
            $('#msg').val('');
            socket.emit('msg', msg);
        }
        </script>
    </head>
    <body>
        <form>
            <textarea id="msg" rows="4" cols="50"></textarea>
            <button type="button" onclick="send()">送信</button>
        </form>
        <div id="container">
        </div>
    </body>
    </html>
    
[/code]

index.html読み込み時、サーバ側からのemitによってクライアント側の以下のイベントが発火します。

[code]

    socket.on('connect', function() {
        socket.emit('msg', 'connect!');
        console.log('connect!');
    });
    
[/code]

Chromeのコンソールには「connect!」と表示されますが、同関数内のsocket.emitは実行されず、サーバ側でlistenしている

[code]

    socket.on('msg', function(data) {
        console.log(data);
    });
    
[/code]

こちらのイベントが発火しません。

また、textareaに文字を入力して送信ボタンを押しても、同様にsend()関数のsocket.emit部分のみ実行できていないです。

どうすればよいでしょうか。

Nodeのバージョンはv0.10.25です。よろしくお願いします。


CC BY-SA 3.0
2015-07-18T05:36:05.057
12464
2015-07-18T17:19:03.083
2015-07-18T17:19:03.083
10577
10577
question
node.js websocket
Node.js + Socket.ioでクライアントからemitできない


提示されたサーバー側のコードにいろいろとエラーに遭遇したのですが、  
それは質問用に削った時に起きたのかと思います。

できれば、動作確認した上で貼っていただいた方がいいでしょう。

一先ず一部修正すると片方だけ connectされた状態にはなるのですが、

> Chromeのコンソールには「connect!」と表示されますが、

とありますが、これは「サーバー側のコンソールに表示された」の間違いではないでしょうか？  
私が修正する段階でR.S.さんのコードと乖離しているかもしれませんが、  
そうであれば、

`client.emit('connect');` を `socket.emit('connect');` に直せば動くと思います。

私が遭遇したサーバー側のソースの不備ですが、  
（絶対そう間違えているとも言い切れないので質問の修正では無くここに提示しておきます。）

  * `io.sockets.on(`の第二引数のコールバック関数が閉じていない。  
=> 実際は `doRequest`の定義の前で閉じていると思います。

  * いくつかのモジュールがrequireされていない。  
=> 具体的には `fs`, `socket.io`, `path` です。

  * `io.sockets.on('connection', function(socket) {`で `client`が定義されていない。  
=> 前述の通りです。私の予想ではこれが今回の問題の原因かと思います。

以下、  
`node 0.10.33`, `socket.io 1.3.6`, `windows 8.1`, `Chrome 43.0.2357.134 m`
で動作した、サーバー側のソースを貼っておきます。  
index.htmlは変更していません。

[code]

    var socketio = require('socket.io')
    var path = require('path')
    var fs = require('fs')
    
    var server = require('http').createServer();
    // console.log(process.versions)
    
    server.on('request', doRequest);
    server.listen(1234);
    
    var io = socketio.listen(server);
    io.sockets.on('connection', function(socket) {
        socket.emit('connect');
    
        socket.on('msg', function (data) {
            console.log(data);
        })
    });
    
    function doRequest(req, res){
        switch(path.extname(req, req.url)) {
            case '':
                fs.readFile('./index.html', 'UTF-8',
                    function (err, data) {
                        res.writeHead(200, {'Content-Type': 'text/html'});
                        res.write(data);
                        res.end();
                    });
                break;
            case '.css':
                fs.readFile('.' + req.url, 'UTF-8',
                    function (err, data) {
                        res.writeHead(200, {'Content-Type': 'text/css'});
                        res.write(data);
                        res.end();
                    });
                break;
            case '.js':
                fs.readFile('.' + req.url, 'UTF-8',
                    function (err, data) {
                        res.writeHead(200, {'Content-Type': 'text/javascript'});
                        res.write(data);
                        res.end();
                    });
                break;
        }
    }
    
[/code]


CC BY-SA 3.0
2015-07-18T12:32:14.430
12470
2015-07-18T12:32:14.430
728
12464
answer