c# - 在 Java 中读取 C# 字节数组

标签 c# java tcp bytearray

我正在使用 TCP 套接字将文件从 C# 客户端传输到 Java 服务器。在 C# 客户端上,我将文件转换为字节数组以进行传输并使用 NetworkStream 发送它。

在 Java 服务器上,我使用以下代码将接收到的字节数组转换回文件;

public void run()  {

       try {

            byte[] byteArrayJAR = new byte[filesize];
            InputStream input = socket.getInputStream();

            FileOutputStream fos = new FileOutputStream(
                    "Controller " + controllerNumber + ".jar");

            BufferedOutputStream output = new BufferedOutputStream(fos);

            int bytesRead = input.read(byteArrayJAR, 0, byteArrayJAR.length);
            int currentByte = bytesRead;

            System.out.println("BytesRead = " + bytesRead);

            do {

                bytesRead = input.read(
                        byteArrayJAR,
                        currentByte,
                        (byteArrayJAR.length - currentByte));

                if (bytesRead >= 0) {

                    currentByte += bytesRead;

                }
            }

            while (bytesRead > -1);

            output.write(byteArrayJAR, 0, currentByte);
            output.flush();
            output.close();
            socket.close();

        }

        catch (IOException e) {

            e.printStackTrace();

        }
}

如果接收到的字节数组来自使用 Java 编程的客户端,则上面的代码有效,但对于 C# 客户端,代码会卡在 bytesRead = input.read(...) 方法的 do-while 循环中。

有谁知道为什么此时代码对于 C# 客户端而不是 Java 客户端挂起?根据 println 消息的输出,数据肯定由 InputStream 接收,并在 bytesRead 变量初始化时读取一次,但在 do-while 循环期间不会读取。

欢迎提出任何克服此问题的解决方案或建议。

问候,

米达维。

最佳答案

您需要从 C# 中将字节作为 sbyte 而不是 byte 发送。

此外,您应该将 do/while 循环更改为常规 while 循环。如果您在第一次调用 input.read 时已经读取了流中的所有内容,那么您将在第二次调用时阻塞,因为 read 将等待输入。

关于c# - 在 Java 中读取 C# 字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8913998/

相关文章:

java - 使用 Apache POI 时某些单元格不可见 - Java

通过 TCP 的 Python 流数据

c# - 如何在 .NET Winforms 中显示自定义错误或警告消息框?

c# - 在 ASP.NET 4.5 中为 HiddenField 设置值

c# - 使用 Automapper 覆盖现有映射

javascript - 下拉列表的滚动条

c# - 将图像转换为 HEX 纯文本,与存储在 SQL Server 中的内容相同

java - 在 doFilter 调用后设置响应 header

multithreading - 在 Haskell 中使用共享套接字的多线程

c++ - 自动检测 TCP 连接是否使用 SSL/TLS?