Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android中UDP接收函数中数据报的奇怪行为_Java_Android_Udp_Datagram - Fatal编程技术网

Java Android中UDP接收函数中数据报的奇怪行为

Java Android中UDP接收函数中数据报的奇怪行为,java,android,udp,datagram,Java,Android,Udp,Datagram,我正在尝试实现一个UDP测试来了解它。我有一个适用于windows的c#服务器应用程序和一个适用于Android的客户端应用程序 我正在尝试实现一个自制的发现服务。服务器正在使用固定字符串(“LazyRemote”)持续侦听UDP包。当它收到该字符串时,会向客户端发送另一个字符串(“LazyRemote_192.168.1.17:2016”) 我已经向wireshark检查了两个方向发送的数据是否正确,但我在客户端应用程序中收到了一些不正确的信息 android的代码如下: buttonConn

我正在尝试实现一个UDP测试来了解它。我有一个适用于windows的c#服务器应用程序和一个适用于Android的客户端应用程序

我正在尝试实现一个自制的发现服务。服务器正在使用固定字符串(“LazyRemote”)持续侦听UDP包。当它收到该字符串时,会向客户端发送另一个字符串(“LazyRemote_192.168.1.17:2016”) 我已经向wireshark检查了两个方向发送的数据是否正确,但我在客户端应用程序中收到了一些不正确的信息

android的代码如下:

buttonConnect.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {

            progress.show();
            //This code is executed when user clicks connect button. As it could be a long running operation, it's executed in a new thread to avoid blocking UI
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {

                    String ipAddress = "";
                    SocketClass my_socketClass = new SocketClass();
                    InetAddress UDPaddress = my_socketClass.getBroadcastAddress();
                    int UDPport = 15000;

                    if(initializationDone == false){
                        initializationDone = true;

                        try {
                            socket_send = new DatagramSocket();
                            socket_send.setBroadcast(true);
                            socket_send.setSoTimeout(6000);
                            socket_receive = new DatagramSocket(UDPport, InetAddress.getByName("0.0.0.0"));
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }

                    try {

                        byte[] send_buff = "LazyRemote".getBytes();
                        DatagramPacket sendPacket = new DatagramPacket(send_buff, send_buff.length,UDPaddress,UDPport);
                        socket_send.send(sendPacket);

                    }catch (Exception ex){

                        showToast("Imposible enviar primer ack");
                    }


                    byte[] receive_buff = new byte[30];
                    DatagramPacket receivePacket = new DatagramPacket(receive_buff, receive_buff.length);

                    try {

                        socket_receive.receive(receivePacket);
                        String receivedData = new String(receivePacket.getData(), "UTF-8");
                        if (receivedData.contains("LazyRemote")) {


                            SocketClass my_socket = new SocketClass(receivePacket.getAddress().toString().substring(1), 2016);
                            SocketClass.ConnectionStatus connectionStatus = my_socket.establishConnection();

                            //Remove progressdialog after establishConnection finishes.
                            progress.dismiss();

                            //Check connection status.
                            if (connectionStatus.status == true) {

                                Thread.sleep(1000);
                                socket_receive.close();
                                socket_send.close();
                                Intent intent = new Intent(MainActivity.this, ActionPerformer.class);
                                startActivity(intent);
                                finish();
                            }
                        }
                    } catch (Exception ex) {
                        progress.dismiss();
                        showToast("No se han encontrado servidores");
                    }
                    //mLock.release();
                }
            });
            thread.start();
        }
    });
问题是接收功能正在工作,但它正在接收错误的数据。(它接收的字符串与客户端发送给服务器初始化descovery(“LazyRemote”)的字符串相同)


这一定是个愚蠢的错误,但我解决不了。非常感谢。

如果您在发送数据的同一端口上进行侦听,则客户端套接字也可以接收您的UDP发送数据包。您只需要从数据分析代码中过滤出这些数据。您应该能够看到源地址与客户端IP地址相同。

问题的可能重复不是长度。我收到了一些没有发送的东西。我想这和缓冲区有关,但我找不到。