2

簡単なチャットアプリケーションを開発しようとしています。これが私のchat.jsファイルです。

var app = require('http').createServer(handler)
, io = require('socket.io').listen(app)
, fs = require('fs');
app.listen(8124);
function handler (req, res) {
fs.readFile(__dirname + '/chat.html',
function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading chat.html');
}
res.writeHead(200);
res.end(data);
});
}
io.sockets.on('connection', function (socket) {
    socket.on('addme',function(username) {
        socket.username = username;
        socket.emit('chat', 'SERVER', 'You have connected');
        socket.broadcast.emit('chat', 'SERVER', username + ' is on deck');
    });
    socket.on('sendchat', function(data) {
        io.sockets.emit('chat', socket.username, data);
    });
    socket.on('disconnect', function() {
        io.sockets.emit('chat', 'SERVER', socket.username + ' has left the building');
    });
});

そして私のchat.htmlファイル。

<head>
<meta charset="utf-8">
<title>bi-directional communication</title>
<script src="/socket.io/socket.io.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script>
$(document).ready(function(e) {
    var socket = io.connect('http://localhost:8124/');
    $('#submit').click(function(e) {
        e.preventDefault();
        v = $('#uname').val();
        $('#username').html('');
        socket.emit('addme', v);
    });

    socket.on('chat',function(username, data) {
        var p = document.createElement('p');
        p.innerHTML = username + ': ' + data;
        document.getElementById('output').appendChild(p);
    });
    window.addEventListener('load',function() {
        document.getElementById('sendtext').addEventListener('click',
        function() {
            var text = document.getElementById('data').value;
            socket.emit('sendchat', text);
        }, false);
    }, false);

});
</script>
</head>
<body>
<div id="output"></div>
<div id="username">
  <input type="text" name="uname" id="uname">
  <input type="submit" name="submit" id="submit" value="Submit">
</div>
<div id="send">
  <input type="text" id="data" size="100" /><br />
<input type="button" id="sendtext" value="Send Text" />
</div>
</body>
</html>

node.jsコマンドプロンプトにnodechat.jshttp://localhost:8124/と入力し、ブラウザーのアドレスバーに入力して、コードをテストします。問題は、これはIE9では完全に機能しますが、FirefoxとChromeでは何も起こらないことです。

chromeまたはfirefoxでこれを実行すると、Node.jsコマンドプロンプトで次のメッセージが表示されます。

info  - socket.io started
   debug - served static content /socket.io.js
   debug - client authorized
   info  - handshake authorized 0yJjYvt7o36BTX6T_hXA
   debug - setting request GET /socket.io/1/websocket/0yJjYvt7o36BTX6T_hXA
   debug - set heartbeat interval for client 0yJjYvt7o36BTX6T_hXA
   debug - client authorized for
   debug - websocket writing 1::
   debug - setting request GET /socket.io/1/xhr-polling/0yJjYvt7o36BTX6T_hXA?t=1
341573194770
   debug - setting poll timeout
   debug - discarding transport
   debug - cleared heartbeat interval for client 0yJjYvt7o36BTX6T_hXA
   debug - setting request GET /socket.io/1/jsonp-polling/0yJjYvt7o36BTX6T_hXA?t
=1341573204771&i=0
   debug - setting poll timeout
   debug - discarding transport
   debug - clearing poll timeout
   debug - clearing poll timeout
   debug - jsonppolling writing io.j[0]("8::");
   debug - set close timeout for client 0yJjYvt7o36BTX6T_hXA
   debug - jsonppolling closed due to exceeded duration
   debug - setting request GET /socket.io/1/jsonp-polling/0yJjYvt7o36BTX6T_hXA?t
=1341573224817&i=0
   debug - setting poll timeout
   debug - discarding transport
   debug - cleared close timeout for client 0yJjYvt7o36BTX6T_hXA
   debug - clearing poll timeout
   debug - jsonppolling writing io.j[0]("8::");
   debug - set close timeout for client 0yJjYvt7o36BTX6T_hXA
   debug - jsonppolling closed due to exceeded duration
   debug - setting request GET /socket.io/1/jsonp-polling/0yJjYvt7o36BTX6T_hXA?t
=1341573244856&i=0

そしてこれは続きます。助けてください。

4

3 に答える 3

5

お時間をいただきありがとうございますが、私は問題を解決しました。chat.jsに、次のを追加しました。

io.configure('development', function(){
  io.set('transports', ['xhr-polling']);
});

これで、chat.jsは次のようになります。

var app = require('http').createServer(handler)
, io = require('socket.io').listen(app)
, fs = require('fs');

app.listen(8124);

io.configure('development', function(){
  io.set('transports', ['xhr-polling']);
});

function handler (req, res) {
fs.readFile(__dirname + '/chat.html',
function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading chat.html');
}
res.writeHead(200);
res.end(data);
});
}
io.sockets.on('connection', function (socket) {
    socket.on('addme',function(username) {
        socket.username = username;
        socket.emit('chat', 'SERVER', 'You have connected');
        socket.broadcast.emit('chat', 'SERVER', username + ' is on deck');
    });
    socket.on('sendchat', function(data) {
        io.sockets.emit('chat', socket.username, data);
    });
    socket.on('disconnect', function() {
        io.sockets.emit('chat', 'SERVER', socket.username + ' has left the building');
    });
});

しかし、何がエラーを引き起こしたのかはまだわかりません。知っているなら説明してください!

于 2012-07-06T11:47:46.853 に答える
1

AppFogに公開しようとしたときに、同じ問題が発生しました。これは、WebSocketがまだAppFogでサポートされていないことが原因であるため、socket.ioに長いポーリング/AJAXを使用させることで修正が機能しました。AppFogは、Webサイトに従ってWebSocketのサポートに取り組んでいますが、日付は指定されていません。

私が見つけたほとんどのクラウドPaaSプロバイダーは、残念ながらまだWebSocketをサポートしていません。私が現在テストしている注目すべき例外の1つは、Nodejitsuです:http: //nodejitsu.com/

于 2013-02-25T15:08:12.167 に答える
0

これは問題とそれがどのように修正されるかを知るのに役立つと思います私はそれをたくさん検索し、最終的にそれを手に入れました

「xhr-polling」設定はsocket.ioで何をしますか?

ありがとうございました

于 2015-01-23T04:35:44.657 に答える