3

Javascript自体には、rawソケットを介して通信する機能がないため、Javaアプレットを使用することにしました。ユーザーがブラウザでJavaアプレットを無効にした場合は、Javascriptと統合するフラッシュソケットブリッジを使用します。同じ問題に直面するために、jsxmlsockethaxejssocketの両方を試してみました

現在、サーバーアプリケーションはJavaで記述されており、通信はJavaアプレット上で正常に機能します。しかし、フラッシュでは問題があるようです。

flashが受信する最初のテキストは、すべてのドメインとポートへのアクセスを許可する<policy-file-request/>への応答です。ソケットが通信を開始するため、これは正常に機能します

データを受信したときに実行されるJavascriptコードは次のとおりです。

socket.onData = function(data) {
    alert(data);
    parse(data);
}

さて、ここに問題があります。<policy-file-request />への応答が送信された後、さらに5行のテキストが送信されます。もちろん、テキストが送信された5つのアラートボックスが表示されることが期待されます。そうではないようです。代わりに、<policy-file-request/>への応答が含まれた5つのアラートボックスが表示されます。何かが送信されているようです。OnData関数が正しい時間に起動しているように見えますが、何らかの理由で、データは送信されたテキストの最初の行のようです。

データの送信を処理するJavaスレッド:

LinkedBlockingQueue<String> outQueue=new LinkedBlockingQueue<String>(1000);
public Thread checkSendLoop=new Thread(){ //this is done to cramp everything in one file. Also more neater
    public void run(){
        try{
            OutputStream out=socket.getOutputStream();
            while (true){
                String mes=outQueue.take();
                mes=mes.replace("\n", "").replace("\r", ""); //for safety
                mes=mes+"\0"; //append
                out.write(mes.getBytes());
                out.flush();
            }
        }
        catch (Exception e){
            System.out.println("FATAL : Data to a client will not be sent anymore."); //probably a socket close threw the exception
            outQueue.clear();
            outQueue=null;
        }
    }
};

データを送信するために、送信関数が呼び出されます。

public void send(String s){
    Queue<String> testQueue = outQueue;
    s=s+" "+getUnixTime();
    if (testQueue!=null){
        System.out.println("SENDING "+nick+" - "+s);
        testQueue.add(s); //just add to the queue , the check loop will make sure that its sent
    }
}

ご覧のとおり、送信されるすべてのデータはnullバイトまたは\0で終わります。多分これは責任がありますか?

注:ここで強調したいのは、私はWebSocketに精通しており、WebSocketが「はるかに適切」である方法に精通しているため、そのことを示唆しないでください。

前述のように、TelnetやJavaアプレットなどの他のクライアントでは正常に機能します。

更新:いいえ、これはこの質問の複製ではありません。私の問題は、<policy-file-request/>すべてのonData呼び出しで応答のみを返すスクリプトに関係しています。プロセスでスローされる「エラー」はありません。

4

3 に答える 3

1

私が見ることができることから、これはある種の内部互換性の問題のように見えます。あなたのコードは問題ないように見えるので、それはコードとそれを実行しているソフトウェアのバージョンとの間にある種の非互換性がなければならないことを意味し、したがって問題を引き起こします。

それはかなり遠い推測ですが、実際にそのエラーを引き起こす可能性があるのはここで唯一のもののようです

于 2012-05-27T08:53:30.253 に答える
0

Webソケットなので、データを2"\r"で終了することを強くお勧めします。データストリームが終了したことを他にどのように知ることができますか?

于 2012-05-26T14:50:10.433 に答える
0

フラッシュチャットを作成しようとすると、同じ問題が発生します。

これはFlash関連の問題だと思います。イベントハンドラーの実行時間が長すぎると、混乱して同じメッセージを何度も読み取ります。

私はJavascriptへのExternalInterfaceでFlashXMLSocketを使用しています。また、Flashから同期的に呼び出されるJavaScriptコードに関連付けられたアラートがあり、すぐにクリックしないと、異なる応答を送信したことがわかっていても、同じ応答が何度も返されます(C#サーバーすべてをデバッグモードでコンソールに出力します)。

私が見つけた唯一の方法は、イベントハンドラーが非常に高速に実行されることを保証することです(メッセージをdivに追加するのと同じように)、またはすべてのメッセージをキューに入れて次々に呼び出すことができるqueシステムを構築できる場合同期的に。

問題の原因はわかりませんが、少なくとも悪魔を遠ざける必要があります。たぶん、長い間「ブロック」しているイベントハンドラーがソースですか?知るか?Flashには本当に非同期ExternalInterfaceが必要です(私はそこにある解決策をよく知っていますが、それは追加のJSコードを必要とし、私はそれをきれいに保とうとしています)。

于 2012-07-17T12:12:34.930 に答える