2

Apache と Socket.IO を備えた実行中のサーバーがあります。Web サイトで socket.io を使用してメッセージを送受信しようとしています。

これは私のサーバーのコードです:

var fs = require('fs');
var hskey = fs.readFileSync('file.key');
var hscert = fs.readFileSync('file.crt');

var options = {
    key: hskey,
    cert: hscert
};

var app = require('https').createServer(options);
var io = require('/usr/local/lib/node_modules/socket.io').listen(app);

app.listen(8181);

io.sockets.on('connection', function (socket) {
  socket.emit('serverMessage', 'Bienvenue master!');
socket.broadcast.emit('serverMessage', 'New user online');
});

そして、これはウェブページです:

<!doctype html>
<html>
  <head>
    <title>Socket.io Test</title>
    <script src="./socket.io.js"></script>
  </head>
  <body>

    <script>

    var socket;
    var firstconnect = true;

    function connect() {
      if(firstconnect) {
        socket = io.connect('https://secure.mysite.com:8181');

        socket.on('serverMessage', function(data){ message(data); });
        socket.on('connect', function(){ status_update("Connected to Server"); });
        socket.on('disconnect', function(){ status_update("Disconnected from Server"); });
        socket.on('reconnect', function(){ status_update("Reconnected to Server"); });
        socket.on('reconnecting', function( nextRetry ){ status_update("Reconnecting in " 
          + nextRetry + " seconds"); });
        socket.on('reconnect_failed', function(){ message("Reconnect Failed"); });

        firstconnect = false;
      }
      else {
        socket.socket.reconnect();
      }
    }

    function disconnect() {
      socket.disconnect();
    }

    function message(data) {
      document.getElementById('message').innerHTML += "<br>" + "Server says: " + data;
    }

    function status_update(txt){
      document.getElementById('status').innerHTML = txt;
    }

    function esc(msg){
      return msg.replace(/</g, '&lt;').replace(/>/g, '&gt;');
    }

    function send() {
      socket.send('clientMessage', 'world');    
    };        

    </script>

    <h1>Socket.io Test</h1>
    <div><p id="status">Waiting for input</p></div>
    <div><p id="message"></p></div>  
    <button id="connect" onClick='connect()'/>Connect</button>
    <button id="disconnect" onClick='disconnect()'>Disconnect</button>
    <button id="send" onClick='send()'/>Send Message</button>
  </body>
</html>

Safari (websocket) と Opera (json プーリング) ではすべて正常に動作するようですが、Firefox と Chrome (websocket) ではクライアントからサーバーにメッセージを送信できません。他のすべてが機能しており、ハンドシェイク、接続、サーバー メッセージの取得ができます。私は多くの調査を行いましたが、この問題を抱えているのは私だけのようです。

私を助けてくれてありがとう!

4

3 に答える 3

2

問題が見つかりました。サーバー側とは異なるバージョンのsocket.io.jsを使用していました。

于 2012-04-12T22:47:46.923 に答える
1

socket.io モジュールをアタッチして表現すると、socket.io ルートがインターセプトされます。

したがって、「https://secure.mysite.com:8181/socket.io」をリクエストすると、「Socket.io へようこそ」という応答が返されます。

したがって、クライアント側の socket.io.js をリクエストすると、socket.io モジュールから直接取得されます。"https://secure.mysite.com:8181/socket.io/socket.io.js"

したがって、クライアント側ライブラリを変更したくない場合は、変更されたコピーを作成して高速でファイルを提供できますが、npm を介して socketio を更新すると、変更されたコピーも手動で更新する必要があります。

于 2013-01-17T23:34:44.170 に答える