10

ガイドに従って、Node.jsとSocket.IOを使用して、ブラウザーとクライアント間のメッセージングを容易にしようとしています。

ただし、Apacheの背後に逆プロキシされたNodeをセットアップする必要がありました。したがって、ノードのexample.com:8080の代わりに、example.com /nodejs/を使用しています。

これにより、Socket.IOはそれ自体の感覚を失うようです。これが私のノードアプリです

var io = require('socket.io').listen(8080);

// this has to be here, otherwise the client tries to 
// send events to example.com/socket.io instead of example.com/nodejs/socket.io
io.set( 'resource', '/nodejs/socket.io' );

io.sockets.on('connection', function (socket) {

  socket.emit('bar', { one: '1'});

  socket.on('foo', function( data )
  {
    console.log( data );
  });

});

そして、これが私のクライアントファイルがどのように見えるかです

<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>Socket.IO test</title>

  <script src="http://example.com/nodejs/socket.io/socket.io.js"></script>

  <script>

  var socket = io.connect('http://example.com/nodejs/');

  console.log( socket );

  socket.on( 'bar', function (data)
  {
    console.log(data);
    socket.emit( 'foo', {bar:'baz'} );
  });

  socket.emit('foo',{bar:'baz'});

  </script>
</head>
<body>
  <p id="hello">Hello World</p>
</body>
</html>

ここでの問題は、http://example.com/nodejs/socket.io/socket.io.jsへのスクリプト参照です。期待されるjavasscriptコンテンツを返しません。代わりに、 http: //example.com/nodejs/を押したかのように「Welcometosocket.io」を返します。

どうすればこれを機能させることができますか?

4

3 に答える 3

9

これは結局、多面的なソリューションになりました。

まず、サーバー側で、このようなエンドポイントを設定する必要がありました

var io = require('socket.io').listen(8080);

var rootSockets = io.of('/nodejs').on('connection', function(socket)
{
  // stuff
});

var otherSockets = io.of('nodejs/other').on('connection', function(socket)
{
  // stuff
});

次に、クライアント側では、正しく接続するには次のようになります

var socket = io.connect(
    'http://example.com/nodejs/'
  , {resource: 'nodejs/socket.io'}
);

// The usage of .of() is important
socket.of('/nodejs').on( 'event', function(){} );
socket.of('/nodejs/other').on( 'event', function(){} );

この後、それはすべてうまくいきました。このサーバーでは、Apacheがexample.com/nodejsをポート8080に内部的にプロキシしていることを忘れないでください。

于 2012-05-09T14:04:34.147 に答える
4

これはApacheプロキシとは何の関係もないと思いますが、socket.ioがサブディレクトリでリクエストを処理する方法に関するいくつかの「癖」があります。ここで私の答えを参照してください。Socket.IOで動作するNGINX構成

基本的に、代わりに次のconnectステートメントを使用する必要があります。

var socket = io.connect('http://example.com', {resource:'nodejs/socket.io'});

于 2012-05-04T05:01:50.297 に答える
0

誰かが興味を持っているなら、これだけが私のために働いた。ポート3000をNodejsポートに置き換えます

VirtualHost内のApache2.2.14

    <IfModule mod_proxy.c>
      <Proxy *>
        Order allow,deny
        allow from all
      </Proxy>
    </IfModule>

    RewriteEngine on

    RewriteCond %{QUERY_STRING} transport=polling
    RewriteRule /(.*)$ http://localhost:3001/$1 [P]

    ProxyRequests off
    ProxyPass /socket.io/ ws://localhost:3001/socket.io/
    ProxyPassReverse /socket.io/ ws://localhost:3001/socket.io/

クライアント側の接続:

  var myIoSocket = io.connect($location.protocol() + '://' + $location.host(), {path: '/socket.io'});

Node.js側で何も変更する必要はありません。

于 2016-04-21T11:22:05.387 に答える