Java 为什么我能';在Android Studio中查看我的UDP接收图像?

Java 为什么我能';在Android Studio中查看我的UDP接收图像?,java,c#,android,imageview,udp,Java,C#,Android,Imageview,Udp,我成功地将字符串从Android Studio Java UDP客户端发送到Visual Studio C#UDP服务器,并从服务器向客户端返回响应 现在,我尝试从服务器发送一个图像,而不是字符串响应。所以在客户端按钮点击时,我应该从服务器获取一个图像。没有语法错误,也没有奇怪的行为。只是什么都没有发生,我似乎无法在ImageView上看到接收到的图像,当我跨过它时,我的最终位图ReceivedImage为null 我是否需要转换为位图以外的内容?这条路对吗?也许还有别的。。谁能帮我指出我的错误

我成功地将
字符串
Android Studio Java UDP客户端发送到Visual Studio C#UDP服务器,并从服务器向客户端返回响应

现在,我尝试从服务器发送一个
图像
,而不是
字符串
响应。所以在客户端按钮点击时,我应该从服务器获取一个图像。没有语法错误,也没有奇怪的行为。只是什么都没有发生,我似乎无法在ImageView上看到接收到的图像,当我跨过它时,我的
最终位图ReceivedImage
null

我是否需要转换为位图以外的内容?这条路对吗?也许还有别的。。谁能帮我指出我的错误吗?谢谢

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()
}

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

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

可能是

serverSocket.Send(dataToSend, 8, sender);
换成

serverSocket.Send(dataToSend, dataToSend.Length, sender);
另外,尝试先将图像的长度(dataToSend.length)发送到客户端,然后让客户端使用您发送的长度创建字节数组。有点像

byte[] buffer = new byte[recievedLengthOfImage]

UDP不是为需要保持有序并完整到达的数据的批量传输而设计的。以某种顺序发送的UDP数据包不能保证以该顺序到达,甚至不能保证全部到达(例如,如果发送数据包A、B、C、D、E,则可能会得到A、B、D、E、C甚至A、E、C、D)。您的字符串可以放入一个数据包中,但对于图像,一个丢失的数据包可能意味着灾难。改用TCP(使用普通套接字而不是DatagramSocket)。@Hexafrance我想我知道这一点,但这里我用900字节的图像进行测试。哪个应该适合我的字节[]缓冲区=新字节[1024]否?然而,我的结果是一个空值,没有错序,或者比我被告知的更少,TCP。我真的是一个noob的学生,努力实现伟大的事情,这就是为什么我很兴奋和动机。你愿意分享你的目标吗?你是如何实现的?也许是代码的一部分?任何有助于我学习或前进的东西。谢谢你路过,反正你帮了我。也许现在你可以评论:)事实上,这是有效的。我收到的图像没有发送图像长度。我只是想告诉你抓住它干得不错。然而,在一次新的点击中,我没有收到新的图像。你知道为什么吗?