我将图像从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();
答案 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);