ソケットを介して 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 でそれを行う方法がわかりませんし、インターネットでも答えを見つけることができませんでした。