为什么我无法在 Android Studio 中查看我的 UDP 接收图像?

Why I can't view my UDP received Image in Android Studio?

我从 Android Studio Java UDP Client 发送成功

=31=]到 Visual Studio C# UDP 服务器,以及从服务器返回给客户端的响应。

现在我正在尝试从服务器发回 Image 而不是 string 响应。因此,在单击客户端按钮时,我应该从服务器取回图像。没有语法错误,也没有奇怪的行为。什么也没发生,我似乎无法在我的 ImageView 上看到接收到的图像,当我跨过它时,我的 final Bitmap ReceivedImagenull

我需要转换成 Bitmap 以外的东西吗?这是正确的方法吗?也许别的.. 谁能帮我指出我的错误?谢谢

C# 服务器:

    class UdpServer
{
    static void Main(string[] args)
    {
        byte[] dataReceived = new byte[1024];
        UdpClient serverSocket = new UdpClient(15000);

        string path = "C:\Users\kkhalaf\Desktop\Capture.PNG"; // image path
        FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read); // prepare
        BinaryReader br = new BinaryReader(fs); // prepare
        byte[] dataToSend = br.ReadBytes(Convert.ToInt16(fs.Length)); //Convert image to byte[]

        int i = 0;
        while (true) // this while for keeping the server "listening"
        {
            Console.WriteLine("Waiting for a UDP client..."); // display stuff
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); // prepare
            dataReceived = serverSocket.Receive(ref sender); // receive packet
            string stringData = Encoding.ASCII.GetString(dataReceived, 0, dataReceived.Length); // get string from packet
            Console.WriteLine("Response from " + sender.Address); // display stuff
            Console.WriteLine("Message " + i++ + ": " + stringData + "\n"); // display client's string

            // Here I am sending back
            serverSocket.Send(dataToSend, 8, sender);
        }
    }
}

Java 客户端: 单击按钮时调用此函数以发送-接收-显示

    public void SendUdpMsg(final String msg)
{
    Thread networkThread = new Thread() {

        // No local Host 127.0.0.1 in Android
        String host = "192.168.200.3"; // Server's IP
        int port = 15000;
        DatagramSocket dsocket = null;

        public void run() {
            try {
                // Get the Internet address of the specified host
                InetAddress address = InetAddress.getByName(host);

                // wrap a packet
                DatagramPacket packetToSend = new DatagramPacket(
                        msg.getBytes(),
                        msg.length(),
                        address, port);

                // Create a datagram socket, send the packet through it.
                dsocket = new DatagramSocket();
                dsocket.send(packetToSend);

                // Here, I am receiving the response
                byte[] buffer = new byte[1024]; // prepare
                DatagramPacket packetReceived = new DatagramPacket(buffer, buffer.length); // prepare
                dsocket.receive(packetReceived); // receive packet
                byte[] buff = packetReceived.getData(); // convert packet to byte[]
                final Bitmap ReceivedImage = BitmapFactory.decodeByteArray(buff, 0, buff.length); // convert byte[] to image

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        // this is executed on the main (UI) thread
                        final ImageView imageView = (ImageView) findViewById(R.id.imageView);
                        imageView.setImageBitmap(ReceivedImage);
                    }
                });
                dsocket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }//catch
        }//run
    };// Networkthread
    networkThread.start();//networkThread.start()
}

不是一个很好的答案,但因为我不能评论 yolo

你应该使用 TCP,它好多了。使用 UDP,我什至在 400 字节时丢失数据。

可能是

serverSocket.Send(dataToSend, 8, sender);

改为

serverSocket.Send(dataToSend, dataToSend.Length, sender);

此外,尝试先将图像的长度 (dataToSend.Length) 发送到客户端,然后让客户端使用您发送的长度来创建字节数组。喜欢

byte[] buffer = new byte[recievedLengthOfImage]