Как постоянно получать растровые изображения с Android на C # Socket? - PullRequest
0 голосов
/ 22 октября 2018

Я работаю в инструменте удаленного администрирования для собственного использования, и проект остановлен из-за ошибки в функции приемника на стороне сервера, а именно .:

В результате арифметической операциив переполнении.(Добавление целых чисел)

в этой строке:

var imageData = new byte[length];

enter image description here

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;
    }
}

код дляПриемник я взял из этой ссылки (см. код клиента) и был адаптирован к моим потребностям, как вы можете видеть выше.

Вот как я отправляю растровое изображение на 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();
            }

Тогда, я хочу знать, что можно сделать, чтобы решить эту проблему?

Заранее спасибо.

1 Ответ

0 голосов
/ 23 октября 2018

Решение было вставлено:

Array.Reverse(lengthData);

до:

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