gpt4 book ai didi

c# - 从 C# TCP 服务器到 Android 设备的图像传输

转载 作者:行者123 更新时间:2023-12-01 15:38:55 29 4
gpt4 key购买 nike

我已成功使用 TCP 套接字从 C# 到 Java (Android) 建立连接。我可以毫无问题地发送和接收字符串消息。但是,当我尝试接收从 C# 服务器发送的 PNG 图像时,我在 Android Activity View 上只看到黑屏。

基本上,服务器监听并等待客户端发送消息。当服务器收到消息时,它将响应发送图像到客户端。

C# 服务器:

    private void HandleClientComm(object client)
{
TcpClient tcpClient = (TcpClient)client;
NetworkStream clientStream = tcpClient.GetStream();

byte[] message = new byte[4096];
int bytesRead;

while (true)
{
bytesRead = 0;

try
{
//blocks until a client sends a message
bytesRead = clientStream.Read(message, 0, 4096);
}
catch
{
//a socket error has occured
break;
}

if (bytesRead == 0)
{
//the client has disconnected from the server
break;
}

//message has successfully been received. Now let's send an image.

byte[] pic = new byte[5000*1024];
pic = ImageConverter.imageToByteArray(System.Drawing.Image.FromFile("C:\\ic_launcher.png"));
clientStream.Write(pic, 0, pic.Length);
clientStream.Flush();
}

Android 客户端:

Socket s = new Socket("192.168.1.154", 8888);

DataInputStream ins = new DataInputStream(s.getInputStream());

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

//Let's send output message

String outMsg = "TCP connecting to " + 8888 + System.getProperty("line.separator");

out.write(outMsg);

out.flush();


//Receive the image from server.
int bytesRead;
byte[] pic = new byte[5000*1024];
bytesRead = ins.read(pic, 0, pic.length);


//Decode the byte array to bitmap and set it on Android ImageView
Bitmap bitmapimage = BitmapFactory.decodeByteArray(pic, 0, bytesRead);
ImageView image = (ImageView) findViewById(R.id.test_image);
image.setImageBitmap(bitmapimage);

//Show in android TextView how much data in bytes has been received (for debugging)
String received;
received= Integer.toString(bytesRead);
test.setText(received);

//close connection

s.close();

现在收到的变量显示已传输约 3000 字节,而图像大小实际上为 4.147 字节(在 Windows 资源管理器中显示),这听起来不对。

那么为什么图像没有显示在 Android Activity 中呢?我在这里缺少什么?

最佳答案

首先。 TCP不发送消息,它发送字节流。 Receive() 的字节流可以包含从消息的一小部分到多条消息的任何内容。不要假设您将通过一个 Receive() 收到恰好一封消息。

如果您的服务器中有适当的错误处理,您会注意到这一点。不要只是忽略异常或断开连接。处理它们。

解决问题的最简单方法是发送一个指示长度的整数 header 。读取该 header ,然后继续调用 Read 直到整个图像已传输。

您的字符串起作用的原因是消息很小,并且您之后没有直接传输任何其他内容。从而给你一种发送消息的错觉。 (尝试直接连续发送两条消息,Nagle algorithm 应该将它们打包在一起,以便您可以在同一个 Read() 中接收它们)。

关于c# - 从 C# TCP 服务器到 Android 设备的图像传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8400090/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com