0

Java から C# にバイト配列を送信してから、C# から Java に別のバイト配列を送信しようとしています。

バイト配列の流れ Java -> c# Java <- c#

send java -> c# を正常に動作させることができますが、send c# -> を試すとハングします。私はウェブ上で見つけることができるほぼすべてを試しましたが、同じ結果を得続けています. Java から C# への送信をコメント アウトすると、Java と C# の両方が正常に動作しますが、Java から C# への送信を試みるとすぐに、Java と C# の両方がそれぞれの読み取りおよび送信行に配置されます。

public void test()
{
    //1. READ
    System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
    string input = enc.GetString(ReadNetworkStream(netStream));
    Console.WriteLine(DecryptData(input, ""));

    //2. SEND
    string output = "This is the c# client!!!";
    sendNetworkStream(output, netStream);
}
private void sendNetworkStream(string infoToSend, NetworkStream netStream)
{
    UTF8Encoding encoding = new UTF8Encoding();
    byte[] byteDataToSend = encoding.GetBytes(infoToSend);
    Console.WriteLine(netStream.CanWrite);
    Console.WriteLine(byteDataToSend.Length);
    netStream.Write(byteDataToSend, 0, byteDataToSend.Length);
    netStream.Flush();
}

private static byte[] ReadNetworkStream(NetworkStream netStream)
{
    byte[] buffer = new byte[1024];
    using (MemoryStream ms = new MemoryStream())
    {
        int read;
        while ((read = netStream.Read(buffer, 0, buffer.Length)) > 0)
        {
            ms.Write(buffer, 0, read);
        }
        return ms.ToArray();
    }
 }

助けていただきありがとうございます。

4

2 に答える 2

0

問題は方法にあると思いますsendNetworkStream。ストリームをフラッシュしていますが、閉じていません。最後に.close()メソッドを使用すると、ストリームを閉じる必要があります。一方、Java アプリケーションはストリームが閉じられるのを待っているため、「ハング」します。

于 2012-04-17T05:48:09.310 に答える
0

Readでメソッドを使用しています。このメソッドはNetworkStream、利用可能なデータがない場合にブロックします。ここのコメントを参照してください: http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.read.aspx

デフォルトでは、データがない場合に Read がブロックされますが、ReadTimeout プロパティを使用してタイムアウトをミリ秒単位で指定できます。ただし、タイムアウトすると Read は 0 を返さず、例外をスローします。

また、ストリームが Java または .NET アプリケーションによって閉じられていないため、ストリームの最後まで読み取ろうとしています。つまり、読み取りと書き込みの両方に同じストリームを使用しています。

読み込まれた Java プログラムがコメント アウトされると、プログラムが終了し、ネットワーク ストリームが閉じられます。したがって、C# プログラムはRead呼び出しのブロックを正常に解除し、正常に完了します。

ただし、Java プログラムが送信後に読み取ろうとすると、ネットワーク ストリームは開いたままになり、C# プログラムもそこから読み取ろうとします。現在、2 つのプログラムが読み取りを試みており、両方がブロックしており、もう一方を待機しています。

通常、これを解決する方法は、何らかのプロトコルを使用することです。プロトコルは、さまざまな交換の各ポイントで読み取るデータの量を各プログラムに指示するため、待機することはありません。特殊な魔法の文字を使用して行われることもあれば、最初に読み取るバイト数を送信することなどによって行われることもあります。

これを行いたくない場合は、次のことができます。

  • Readしばらくするとタイムアウトになるようにします (そして、そこから何をするかを決定します) 。および/または
  • 2 つのクライアントからの読み取りと書き込みには別々のストリームを使用しますが、各アプリケーションがブロックするポイントに注意してください。
于 2012-04-17T06:09:30.727 に答える