1

我在 C# 中将图像从 android 发送到 TCPClient,但是当接收图像时,这是无效图像。

我创建了一个方法来验证流但没有图像头。

任何人都可以帮助我吗?

这是我的ANDROID代码: 尝试{

        Socket sockTcp = new Socket(EnderecoSoftclinic, PORTATCP);

        while(sockTcp.isClosed()){

            Toast.makeText(contexto, "Tentando conectar ao SoftClinic", Toast.LENGTH_SHORT).show();

            sockTcp.connect(sockTcp.getRemoteSocketAddress(), PORTATCP);

        }

        OutputStream outputStream = sockTcp.getOutputStream();

        outputStream.write(imagem,0,imagem.length);

        outputStream.flush();

        sockTcp.close();

    } catch (IOException e) {
        e.printStackTrace();
    }

我收到 C# 代码:

        TcpListener tcpReceiver = new TcpListener(IPAddress.Any, 2553);

        tcpReceiver.Start(1);

        while (!finalizado)
        {
            TcpClient android = tcpReceiver.AcceptTcpClient();
            NetworkStream stream = android.GetStream();
            byte[] buffer = null;

            buffer = new byte[Convert.ToInt32(tamanho)];

            if (stream.CanRead)
            {
               while (stream.Read(buffer, 0, buffer.Length) > 0) {}
            }

            if (buffer == null || buffer.Length == 0)
            { return; }

            MemoryStream streamImg = new MemoryStream();
            streamImg.Write(buffer, 0, buffer.Length);

            if (!IsValidImage(streamImg))
            {
                finalizado = true;
                return;
            }

            if (File.Exists("C:/teste.bmp"))
            {
                File.Delete("C:/teste.bmp");
            }

            FileStream streamWriter = new FileStream("C:/teste.bmp", FileMode.CreateNew, FileAccess.Write);
            streamWriter.Write(buffer, 0, buffer.Length);
            streamWriter.Flush();
            streamWriter.Close();
            try
            {
                Image imagemGerada = Image.FromStream(streamImg);
                if (AoRetornarDadosEquipamento != null)
                {
                    AoRetornarDadosEquipamento(imagemGerada);

                }
            }
            catch (Exception ex)
            {
                Debug.Print(ex.Message);
            }

            stream.Close();
            android.Close();
            finalizado = true;
        }

        tcpReceiver.Stop();
4

2 回答 2

1

我做到了.. 以更简单的方式,我只需在我的 c# 程序中获取 NetworkStream 并 CopyTo 新 Stream。

并做了。

谢谢...........

只需要这个

        NetworkStream stream = android.GetStream();
        MemoryStream streamImg = new MemoryStream();
        stream.copyto(streamimg);
于 2012-05-05T12:33:11.253 回答
1

我看到一个问题。

在将 MemoryStream (streamImg) 保存到文件时,它会被读取一次。

然后你不要倒带它并尝试加载图像(因此读取文件末尾!)。利用

 streamImg.Seek(0, SeekOrigin.Begin)

行后

 streamWriter.Close();

这可以完成这项工作。

另一种方法是重新创建 streamImg(这实际上是相同的)。

于 2012-05-02T06:48:21.980 回答