1

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();
4

2 に答える 2

1

1つの問題があります。

MemoryStream(streamImg)は、ファイルに保存するときに1回読み取られます。

次に、それを巻き戻さに画像を読み込もうとします(したがって、ファイルの終わりを超えて読み取ります!)。使用する

 streamImg.Seek(0, SeekOrigin.Begin)

行の後

 streamWriter.Close();

これは仕事をすることができます。

もう1つの方法は、streamImgを再作成することです(これは実質的に同じです)。

于 2012-05-02T06:48:21.980 に答える
1

私はそれをしました..もっと簡単な方法で、C#プログラムでNetworkStreamを取得し、新しいStreamにコピーします。

そして完了。

ありがとう...........

これが必要です

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