4

私はこの問題に何時間も費やしてきましたが、役に立ちませんでした。

編集:解決策が見つかりました(私の答えを見てください)

プロジェクトの背景

でプロジェクトを構築していますがSymfony2、これには大きなファイルをアップロードするためのモジュールが必要です。私はNode.jsandを選びましたSocket.IO(一から学ばなければならなかったので、基本的なことが抜けているかもしれません)。これらを HTML5 File および FileReader API と組み合わせて、クライアントからサーバーにファイルをスライスで送信します。予備テストでは、このアプローチは、すべてが によって処理および提供されるスタンドアロン アプリとしてうまく機能することが示されましたが、およびとNode.jsの統合には問題があるようです。ApacheSymfony2

アプリケーションには、保護されていないセクションと保護されたセクションがあります。私の目標はApache、ポート80で使用し、443組み込みのアプリの大部分を提供するために使用し、ファイルのアップロードのためにポートで使用することです。ソケットに接続するクライアント側のページは によって処理されますが、ソケットは 経由で実行されます。ページは認証されたユーザーがいる安全な環境にあるため、アップロード モジュールは HTTPS 経由で実行する必要があります。Symfony2Node.jsSocket.io8080ApacheNode.js

問題は、イベントを使用しているsocket.emitか、socket.send機能していないようです。クライアントからサーバーへ、またはサーバーからクライアントへ、違いはありません。何も起こりませんし、エラーもありません。

コード

示されているコードは、私のコードの単純化されたバージョンであり、混乱や機密データは含まれていません。

サーバ

var httpsModule = require('https'),
    fs = require('fs'),
    io = require('socket.io');

var httpsOptions = 
{
    key: fs.readFileSync('path/to/key'),
    cert: fs.readFileSync('/path/to/cert'),
    passphrase: "1234lol"
}

var httpsServer = httpsModule.createServer(httpsOptions);
var ioServer = io.listen(httpsServer);

httpsServer.listen(8080);

ioServer.sockets.on('connection', function(socket)
{
    // This event gets bound, but never fires
    socket.on('NewFile', function(data)
    {
        // To make sure something is happening
        console.log(data);

        // Process the new file...
    });

    // Oddly, this one does fire
    socket.on('disconnect', function()
    {
        console.log("Disconnected");
    });
});

クライアント

// This is a Twig template, so I'll give an excerpt
{% block javascripts %}
{{ parent() }}

<script type="text/javascript" src="https://my.server:8080/socket.io/socket.io.js"></script>
<script type="text/javascript">

    var socket = io.connect("my.server:8080",
                {
                    secure: true,
                    port: 8080
                });


    // Imagine this is the function initiating the file upload
    // File is an object containing metadata about the file like, filename, size, etc.
    function uploadNewFile(file)
    {
         socket.emit("NewFile", item);
    }

</script>
{% endblock %}

問題は...

もちろん、アプリケーションにはこれ以外にも多くの機能がありますが、ここで行き詰まっています。ページはエラーなしで完全に読み込まれますが、発行イベントが発生したり、サーバーに到達したりすることはありません (切断イベントを除く)。クライアントとサーバーの両方でメッセージ イベントを使用して、カスタム イベントのみに問題があるかどうかを確認しましたが、どちらも機能しませんでした。何かがクライアントとサーバーの通信をブロックしていると推測しています (ファイアウォールではないことを確認しました)。

ここで完全に途方に暮れているので、助けてください。

編集:解決策が見つかりました(私の答えを見てください)

4

1 に答える 1