1

SOAPメッセージを送信し、応答を取得してから読み取るTCP / IPソケットを実行しています。

問題はそのシナリオにあります。最初はすべて問題なく、メッセージを送信し、swingworker を使用して応答を受け取ります。ソケットを閉じて再度接続しようとすると、swing ワーカーをブール値で停止します。再度接続するとスレッドが実行されますが、SOAP メッセージを送信してもソケットから出力が得られませんが、その時点でデバッグを行ってコードにステップダウンすると、応答が返されますそして出力!なぜそれが起こるのですか?

これが私のコードです:

protected Object doInBackground() throws Exception {

        Integer result = 1;
        while (true) {

            if (startReading && !this.server.isSocketClosed()) {
                // send the SOAP Message based on which message is selected
                SendSOAPRequestMessage();
                //Thread.sleep(5);
                String responseMessage = null;
                try {
                    // get the response from the client/server
                    responseMessage = Utils.convertStreamToString(this.server);
                    System.out.println(responseMessage);
                    // give the message without the header + and check the content length and if the header is corrupted
                    fullMsg = decoder.DecodeSoapHeader(new String(responseMessage.getBytes("UTF-8")));
                } catch (Exception ex) {
                    Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex);

                }


            }

        }
}
4

1 に答える 1

1

hereにあるように、「SwingWorker は 1 回だけ実行されるように設計されています」。さらに、ワーカーは へのアクセスを同期しないthis.serverため、外部の変更がワーカーのバックグラウンド スレッドに表示されない場合があります。いくつかの代替案:

  • リクエストごとにワーカーの新しいインスタンスを作成します。

  • ワーカーにソケットを管理させます。

補遺:解決策 1 については、新しいソケットも作成する必要がありますか?

いいえ。ここに記載されているように、「スレッドで開始する呼び出しは、開始されたスレッドのアクションの前に発生します。」たとえば、コンストラクターのパラメーターとしてソケットへの参照を渡す方が明確な場合があります。

一方、ソケットのオーバーヘッドは無関係かもしれません。プロフィールは念のため。

于 2013-04-11T11:44:26.917 に答える