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# 程序也会尝试从中读取。现在两个程序正在尝试读取,并且都阻塞并等待另一个。

通常如何解决这个问题是通过使用某种协议。协议告诉每个程序在各个交换中的每个点要读取多少数据,因此它们不会坐在那里等待。有时它是通过使用特殊的魔术字符来完成的,有时是通过首先发送要读取的字节数等来完成的。

如果您不想这样做,您可以:

  • 让它Read在一段时间后超时(并决定从那里做什么);和/或
  • 使用单独的流从两个客户端读取和写入,但仍要注意每个应用程序阻塞的点。
于 2012-04-17T06:09:30.727 回答