繁体   English   中英

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

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

我成功将string Android Studio Java UDP客户端 发送到 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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM