2

ソケットを介して Java アプリケーションと通信することになっている .NET アプリケーションを作成しています。.NET コードは次のとおりです。

string str = "  MSG1234";
TcpClient client = new TcpClient();
client.Connect("127.0.0.1", 8080);
byte[] msg = Encoding.UTF8.GetBytes(str);
client.Client.Send(msg);
StreamWriter sw = new StreamWriter(client.GetStream());
StreamReader sr = new StreamReader(client.GetStream());
while (true)
{
     Console.WriteLine(sr.Read());
}

問題は、Java アプリケーションが応答を送信しないことです。アプリケーションはサードパーティのソフトウェアであり、変更できませんが、逆コンパイラをダウンロードして、Java クラスで関連するコードを見つけました。

try {
   while (this.is.available() <= 0);
   body = new byte[this.is.available()];
   this.is.readFully(body);
   System.out.println("Message received");
} catch (Exception e) {
   System.out.println("Error: " + body);
}

この場合の「is」は DataInputStream です。1. ソケットを作成し、メッセージを送信します 2. 応答を待ちますが、何も起こりません 3. アプリを手動で閉じます - ソケットが期限切れになります 4. 突然、メッセージ全体が Java アプリケーションのログに表示されます. これは、例外が発生し、実際に体に何かがあることを意味します。

エラーの可能性がある場所を教えていただけないでしょうか。this.is.readFully(body) 行はそこにあるべきではないと思いますが、よくわかりません。C# コードから EOF を手動で送信する必要があるかもしれませんが、その方法を見つけることができませんでした。

このコードのもう 1 つの小さな問題は、メッセージの最初の 2 文字が取り除かれていることです。そのため、実際のメッセージの前に 2 つのスペースを含めました。

前もって感謝します。

編集

だから私はいくつかのランダムなデータでソケットを埋めようとしましたが、最終的に答えを得ました:

for (int i = 0; i < 600; i++) 
{
    sw.Write("some long random string"); 
    sw.Flush(); 
}

ただし、送信するメッセージは正確でなければならないため、これは良い解決策ではありません。次に、関連データが送信された後にソケットを閉じようとしましたsoc.Disconnect(false);。これにより、Java アプリケーションのログが適切なデバッグ情報でいっぱいになります。EOL をソケットに送信して、Java アプリがリッスンを停止し、データの送信を開始する方法はありますか? ありがとうございました。

編集 2 サーバーに接続する Java クライアントを作成しようとしましたが、同じことが起こりました。

次に、接続しているJavaアプリと同じポートでリッスンするダミーサーバーを作成しました.Javaアプリと同じように動作し、動作していました。

今では、EOT または EOF コマンドをストリームに送信するしか方法がないと感じていますが、.NET でそれを行う方法がわかりませんし、インターネットでも答えを見つけることができませんでした。

4

2 に答える 2

1

Java アプリケーションがサード パーティのものである場合、何か間違ったことをしている可能性があります。関数はDataInputStream.readFully(byte[])、バイト配列が保持できるバイト数を読み取るまでアプリケーションをブロックするため、コードのスニペットは読み取り操作からのものです。

関数を使用して Java アプリケーションと通信していることもわかりましたSocket.Send(byte[])。StreamWriter や BinaryWriter などのより高いレベルのものを使用することをお勧めします。

StreamWriter = new BinaryWriter(client.GetStream());
StreamWriter.Write(msg);
StreamWriter.Flush();
于 2013-02-26T00:44:39.937 に答える
0

(そのバッファをストリームオブジェクトに書き込む)と実際の(パケットがまだ「いっぱい」ではないにもかかわらず、パケットを送信する)の両方をフラッシュしようとすることはできますか?StreamWriterNetworkStreamclient.GetStream()

NetworkStream ns = client.GetStream();
StreamWriter sw = new StreamWriter(ns);
StreamReader sr = new StreamReader(ns);
// ...
sw.Flush();
ns.Flush();

ほとんどの場合、フラッシュする必要があるすべてをフラッシュしていません。たとえばwiresharkを使用したネットワーク通信を調べてみましたか?データは実際に送信されていますか? そうでない場合、問題は .NET コードにあります。

于 2013-02-26T09:32:30.827 に答える