数据包问题一条成功消息后,包长度变为15字节(udp、java)

v440hwme  于 2021-07-11  发布在  Java
关注(0)|答案(0)|浏览(383)

这个问题很简单,但我还没有找到解决办法(对不起,英语不好,我没有很多机会用英语写作。。。所以坏英语预期,警告)。
我有一个简单的udp java代码(客户端),它通过datagrampacket将消息发送到另一个java代码(服务器)并打印收到的消息。问题是,第一个发送的消息运行良好(它打印我发送的数据),但其他数据包从26字节转换为15字节,这不是变量的问题,也不是客户机的问题(我猜),因为当我打印数据时,我发送的消息的长度总是26(就像它应该的那样)。
这是我的密码:
客户:

import java.io.IOException;      import java.net.DatagramPacket;
import java.net.DatagramSocket;     import java.net.InetAddress;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.TimeUnit;

public class cliente {
    public static final void main(final String[] args) {
        InetAddress  direccion;        DatagramPacket p;        byte[] data = new byte[5024];
        DatagramPacket recibido = new DatagramPacket(data, data.length);

    while(true){
        for(int i=0, k=5; i<k;i++) {

            String[] SensoresId = new String[] {"001", "002", "003", "004", "005"};

            try {
              direccion = InetAddress.getByName("localhost"); //get local host address

              //Grabbing ID of sensor
              String Sen_Id = SensoresId[i];
              //Taking Date of execution and hour
              DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
              Date date = new Date();
              String fecha_ahora = new String(dateFormat.format(date));
              //random parameter
              Random random = new Random();
              int numero_rand = random.nextInt(101);
              String medicion = String.valueOf(numero_rand);

              //joining all variables in the message to send
              String mensaje = Sen_Id + "," + medicion + "," + fecha_ahora;

                  try(DatagramSocket client = new DatagramSocket()) {  
                    data = mensaje.getBytes(); //allocating the data
                    p = new DatagramPacket(data, data.length, direccion, 9984); //create package
                    System.out.println("enviando la data...");//sending the data...
                    client.send(p);  //send message
                    client.setSoTimeout(5000); //waiting a to a timeout 

                    while(true) {
                        try {
                            //getting the respond message
                            client.receive(recibido);
                            String mensaje_de_vuelta = "recibiendo de:" + recibido.getAddress() + "," + "mensaje:" + new String(recibido.getData());
                            String respuesta =  new String(recibido.getData());
                            System.out.println(mensaje_de_vuelta + "\n");
                            //Not so important code (work in process)
                            if(respuesta == "duplicados" || respuesta == "OK") {
                                break;
                            }
                            client.close(); //I tried to close the client in hope that will fix it but no
                            break;
                        }catch(SocketTimeoutException e) {
                            System.out.println("Se acabo tu tiempo!" + e);
                            client.close();
                        }
                    }

                } 

            } catch (SocketException e1) {
                System.out.println("Error en socket" + e1);
            }catch (IOException e2) {
                e2.printStackTrace();
            }
      }
          try {

            System.out.println("Esperando 5 segundos...");
            TimeUnit.SECONDS.sleep(5);
            }catch(InterruptedException ex) {
                 Thread.currentThread().interrupt();
            }
    } 

    }

}

服务器:

import java.io.IOException;      import java.net.DatagramPacket;
import java.net.DatagramSocket;   import java.net.InetAddress;
import java.net.SocketException;

public class servidor {
    public static final void main(final String[] args) {
        DatagramPacket  p;      byte[] data = new byte[5024];

    try(DatagramSocket server = new DatagramSocket(9984)) { 
     while(true) {
        p = new DatagramPacket(data, data.length); //create package
        server.receive(p); //wait for and receive package 
        System.out.println("Se recibio tu mensaje");
        //System.out.println("New message " + p.getSocketAddress());
        String mensaje_cliente = new String(p.getData(),0,p.getLength()); 
        System.out.println(p.getLength());
            //Make a print to see recieve message 
            System.out.println(mensaje_cliente); 
            //Obtaining adresses
            int puertoCliente = p.getPort();
            InetAddress direccion = p.getAddress();

            //preparing the respond 
            String mensaje_vuelta = "Hola como esta?";
            data = mensaje_vuelta.getBytes();
            DatagramPacket respuesta = new DatagramPacket(data, data.length, direccion, puertoCliente);
            //sending respond
            System.out.println("Enviando respuesta al cliente...");
            server.send(respuesta);

     }

    } catch (SocketException e) {
      e.printStackTrace();
    } catch(IOException e1) {
        e1.printStackTrace();
    }
  }

}

结果:

Se recibio tu mensaje
26
001,18,2020/11/18 09:35:30
Enviando respuesta al cliente...
Se recibio tu mensaje
15
002,14,2020/11/
Enviando respuesta al cliente...
Se recibio tu mensaje
15
003,36,2020/11/
Enviando respuesta al cliente...
Se recibio tu mensaje
15
004,59,2020/11/
Enviando respuesta al cliente...
Se recibio tu mensaje
15
005,84,2020/11/
Enviando respuesta al cliente...

如您所见,消息长度从26减少到15,这使得消息被一分为二<--那是我的问题。
提前感谢您的回复。
祝你有美好的一天。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题