ANDROID发送到C#TCPListener的图像无效

时间:2012-05-01 18:51:48

标签: android image sockets tcplistener

我将图像从android发送到C#中的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();

2 个答案:

答案 0 :(得分:1)

我看到一个问题。

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

然后你倒回它并尝试加载Image(因此读取文件的末尾!)。使用

 streamImg.Seek(0, SeekOrigin.Begin)
行后

 streamWriter.Close();

这可以胜任。

另一种方法是重新创建streamImg(这几乎一样)。

答案 1 :(得分:1)

我做到了.. 更简单的方法是,我只需要在我的c#程序中获取NetworkStream,然后在CopyTo中获取新的Stream。

完成了。

由于...........

只需要这个

        NetworkStream stream = android.GetStream();
        MemoryStream streamImg = new MemoryStream();
        stream.copyto(streamimg);