0

学校のプロジェクトでは、WSDL へのサービス参照を持つ .NET クライアントにサービスを提供できる Java サーバーを作成する必要があります。私は.NETクライアントコードを持っています:

        using (var client = new MathServiceWSDLClient())
        {
            Console.WriteLine("Multiplying " + Num1 + " and " + Num2 + ": " + client.Multiply(Num1, Num2));
            Console.WriteLine("Adding" + Num1 + " and " + Num2 + ": " + client.Add(Num1, Num2));
        }

Java サーバーも作成しました。

Scanner sc = new Scanner(socket.getInputStream());

boolean clientExpectContinue = false;
            int contentLength = -1;
            String line;
            while (!(line = sc.nextLine()).isEmpty()) {
                System.out.println(line);
                if (line.startsWith("Content-Length")) {
                    String[] elements = line.split(": ");
                    contentLength = Integer.parseInt(elements[1]);
                } else if (line.startsWith("Expect")) {
                    clientExpectContinue = true;
                }
            }
            int notEmpties = 0;

            byte[] soapEnvelopeData = new byte[contentLength];
            char[] soapChars = new char[contentLength];
            for (int i = 0; i < contentLength; i++) {
                soapChars[i] = (char) socket.getInputStream().read();
                if (i == 0)
                    System.out.println("DFSDFSDf");
            }

            // System.out.println(socket.getInputStream().read(soapEnvelopeData));
            System.out.println(soapEnvelopeData.length);
            File file = new File("tempEnvelope.txt");
            FileOutputStream fileOut = new FileOutputStream(file);
            // fileOut.write(soapEnvelopeData);
            System.out.println("Content!");
            System.out.println(new String(soapChars));
            fileOut.write(new String(soapChars).getBytes());
            fileOut.flush();
            fileOut.close();
            /* Some fancy SOAP and Reflection stuff that works */

サーバーの要点は次のとおりです。着信要求を取得し、ヘッダーを読み取り、コンテンツの長さを見つけます。これを解析して保存します。ここから2つのバージョンがあります。1 つ目は、コンテンツの長さと同じサイズのバイト配列を作成し、その配列をパラメーターとして socket.getInputStream().read() メソッドに渡します。2 番目は、コンテンツと同じ長さの char 配列を作成し、ストリームから個々のバイトを読み取り、それらを char にキャストします。

示されているように、1 回の実行で複数の要求を使用して .NET クライアントを実行しようとすると、問題が発生します。最初のリクエストは、何の識別可能な問題もなく行われます。2 番目のものを受信すると、サーバーはヘッダーを読み取り、コンテンツの長さを取得して、配列を構築します。ただし、ソケットから読み取るときが来ると、プログラムはただ待機します。char 配列メソッドを使用して、最初の値を読み取るときに待機することを学習できました。1 分が経過すると、.NET がタイムアウトになり、プログラムの残りの部分が中断されます。

ただし、サーバーを実行したままにし、.NET クライアントの実行ごとに 1 つの要求しかない場合は、すべて問題ありません。応答は正常に返されます。

私はすでにいくつかの解決策を試しました:

  • リクエストごとに新しい MathServiceWSDLClient を作成する
  • すべてのリクエストを独自の using() ブロックに入れます。
  • 一度に 2 つの同じリクエストを実行する: 2 つの Multiply() または Add() リクエスト。

どんな助けでも大歓迎です。よろしくお願いします。〜リノ・ヤンセ・ヴァン・レンズバーグ

4

1 に答える 1

0

.netは、後続の要求のためにソケットを開いたままにしている可能性があります。これに関連するJavaコードのようなサーバーにバグがある可能性があります。

Javaサーバーコードの代わりにフレームワークを使用できますか?私はこれを強くお勧めし、ためらうことなくrmbeddedJettyをお勧めします。これは、Javaのソケットレベルで作業する必要がないことを意味します。Jettyにそのすべての複雑さを処理させることができます。

于 2012-06-12T05:36:46.990 に答える