【问题标题】:How receive bitmap's continuously from android on C# Socket?如何在 C# Socket 上从 android 连续接收位图?
【发布时间】:2019-03-26 12:00:55
【问题描述】:

我正在使用自己使用的远程管理工具,项目已停止,因为服务器端的接收器功能出错。:

算术运算导致溢出。 (添加整数)

在这一行:

var imageData = new byte[length];

void server_Received(Listener l, Info i, string received) {

    string[] cmd = received.Split('|');

    switch (cmd[1])
    {

        case "PRINT":

            //MessageBox.Show("print");

            Thread threadPrint;

            threadPrint = new Thread(() =>
            {
                var lengthData = new byte[4];
                var lengthBytesRead = 0;

                while (lengthBytesRead < lengthData.Length)
                {
                    var read = i.sock.Receive(lengthData, lengthBytesRead, lengthData.Length - lengthBytesRead, SocketFlags.None);
                    if (read == 0) return;
                    lengthBytesRead += read;
                }
                var length = BitConverter.ToInt32(lengthData, 0);
                var imageData = new byte[length];
                var imageBytesRead = 0;

                while (imageBytesRead < imageData.Length)
                {
                    var read = i.sock.Receive(imageData, imageBytesRead, imageData.Length - imageBytesRead, SocketFlags.None);
                    if (read == 0) return;
                    imageBytesRead += read;
                }

                using (var stream = new MemoryStream(imageData))
                {
                    var bitmap = new Bitmap(stream);
                    Invoke(new ImageCompleteDelegate(ImageComplete), new object[] { bitmap });
                }

            });

            threadPrint.Start();

            break;
    }
}

我从this 参考中获取的接收器代码(请参阅客户端代码)并根据我的需要进行了调整,如您在上面看到的那样。

这是我在 android (Java) 上发送位图的方式:

try {
                dos = new DataOutputStream(SocketBackgroundService.xclientSocket.getOutputStream());
                PrintWriter out = new PrintWriter(
                        new BufferedWriter(
                                new OutputStreamWriter(dos)
                        )
                );
                out.println("|PRINT|");
                out.flush();
                dos.writeInt(array.length);
                dos.write(array, 0, array.length);
                dos.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }

那么,我想知道有什么办法可以解决这个问题?

提前致谢。

【问题讨论】:

  • 你不能创建一个负长度的数组(这似乎是你得到的例外)。因此,您获取长度并将其转换为 int 的方式是问题所在。由于您传入的图像的大小,您得到了否定。我首先建议尝试使用较小的位图,看看它是否适用于您保证长度小于 2^32 的东西。我不知道如何在不使用更多数组的情况下解决这个问题。基本上是一个字节数组列表,每个字节数组都保存图像数据,然后用一个由图像数据列表组成的内存流更新一个位图。
  • @DubDub,感谢您的建议,但任何尺寸的图像(位图)都会出现错误。
  • 没问题,这个Info类你指的是参数,你能编辑一下吗?或者提供指向它的文档的链接。我很好奇你是如何设置套接字的。
  • @DubDub,你可以找到我最近的另一个question
  • @DubDub,我测试了你的建议"change 'lengthData.Length - lengthBytesRead' to 'lengthBytesRead' ",上面的异常已经解决了,但还是不行(无法接收位图)。尽管如此,还是谢谢你。

标签: c# android sockets visual-studio-2013


【解决方案1】:

解决方案是插入:

Array.Reverse(lengthData);

之前:

var length = BitConverter.ToInt32(lengthData, 0);

【讨论】:

    猜你喜欢
    • 2018-02-17
    • 1970-01-01
    • 2023-04-04
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2012-08-05
    相关资源
    最近更新 更多