1

クライアントのネットワーク環境に非常に苛立たしい問題があり、誰かがこれを理解するのを手伝ってくれることを願っています...

彼らは、今のところ完全に VBA for Excel 内に記述されているアプリを持っています。(笑いません。)

製品とユーザー エクスペリエンスの向上を支援するために、UI を VBA フォーム要素から、Excel とサーバー間で通信するリッチ Web アプリを格納する単一の WebBrowser 要素に変換する必要がありました。これは、主に socket.io サーバー/接続を介して行われます。

ユーザーがログインすると、ソケット サーバー上のルームに接続されます。

最初の「所有者」は次のように呼ばれます。

socket.on('create', function (roomName, userName) {
    socket.username = userName;
    socket.join(roomName);
});

フォローアップの「参加者」は次のように呼ばれました。

socket.on('adduser', function (userName, roomName){

    socket.username = userName;
    socket.join(roomName);
    servletparam = roomName;
    var request = require('request');

    request(bserURL + servletparam, function (error, response, body) {
        io.sockets.to(roomName).emit('messages', body);
    });

    servletparam = roomName + '|' +  userName;
    request( baseURL + servletparam, function (error, response, body) {
        io.sockets.to(roomName).emit('participantList', body);
    });
});

VBAコードがすべてをロックしてソケット接続が失われるまで、これはすべてうまく機能しました. クライアントが VBA による強制的な一時停止 (20 秒から 3 分間続く) から表示されると、スクリプトの再参加をトリガーする HTML 要素に onclick を渡して、再度ルームに参加しようとします。奇妙なことに、それはうまくいきません。ただし、数秒待ってオブジェクトを手でクリックすると、部屋に再び参加します。はい、クリックは Excel ファイルから受信されています... ソケット サーバーへのメッセージが表示されますが、その呼び出しがルームに再参加することは許可されません。

これがデバッグを本当に難しくしている理由です。VBA の WebBrowser オブジェクトでコンソールを表示する機能がないため、リモート デバッガーとして weinre を使用しますが、a) コンソールで発生するようにトリガーしない限り、ログとエラーをコンソールに出力しないようです。b) socket.io が接続を失うと接続が失われ、私は水の中で死んでしまいます。

ここで、完全を期すために、.join() 呼び出しと .to() 呼び出しを削除すると、プライベートではない大きな部屋に書き込まれるすべてのメッセージが差し引かれると予想されるように、すべてが機能します。そのため、部屋に再参加する際の問題です。

StackOverflow の長年のユーザーとして、コードがほとんどない長い質問は嫌われることを知っていますが、このセットアップには特別なことは何もありません (問題の一部である可能性があります)。それは単純なエミットとブロードキャスト (クライアントから) です。フォローアップの質問に基づいて、何でもご記入いただければ幸いです。

4

1 に答える 1

3

将来これに遭遇する可能性のある人へ...

答えは、サーバー側で部屋の再接続を管理することです。クライアントが信頼できる接続を確立できない場合、または頻繁に切断される場合は、サーバー側でルームを追跡し、接続時にルームに参加するようにします。

これのもう 1 つの難点は、チャット サーバーと Web UI が同じドメイン上になかったため、Cookie を共有して誰が接続しているかを知ることができなかったことです。彼らの場合、それらを 2 つの異なる場所でホストする必要はなかったので、それらをマージし、Express に UI を提供させ、強制切断後にクライアントが表示されたときに、ユーザー ID Cookie を確認しました。私がサーバー上で追跡していた彼らがいた部屋にそれらを一致させ、それらに再び参加しました.

于 2014-09-30T17:25:52.673 に答える