Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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客户端服务器UDP获取错误的包_Java_Sockets_Udp_Client - Fatal编程技术网

Java客户端服务器UDP获取错误的包

Java客户端服务器UDP获取错误的包,java,sockets,udp,client,Java,Sockets,Udp,Client,对于一个小的大学项目,我必须编写一个服务器和客户端UDP通信代码 如果客户端发送数据,而服务器只读取数据,则一切正常。一旦我开始从服务器向客户端发送数据,我的程序就会出现一些小错误 public class Sensors { private static List<Produkt> allSensors = new ArrayList<Produkt>(); public static void main(String[] args) throws Exception

对于一个小的大学项目,我必须编写一个服务器和客户端UDP通信代码

如果客户端发送数据,而服务器只读取数据,则一切正常。一旦我开始从服务器向客户端发送数据,我的程序就会出现一些小错误

public class Sensors {
private static List<Produkt> allSensors = new ArrayList<Produkt>();

public static void main(String[] args) throws Exception {
    //Preparing Our Data
    initSensors();
    //Server Config
    String serverIP = new String();
    BufferedReader eingabe = new BufferedReader(new InputStreamReader(System.in));
    System.out.print("IP Eintragen:");
    serverIP = eingabe.readLine();
    System.out.println("");

    //Preparing Data to Send

    try{
        DatagramSocket serverSocket = new DatagramSocket(1234);
        byte[] receiveData = new byte[4];
        DatagramPacket receivePacket = new DatagramPacket(receiveData,
                       receiveData.length);

        for(;;){

            //Sending
            for (Produkt s : allSensors) {
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                ObjectOutputStream os = new ObjectOutputStream(outputStream);
                os.writeObject(s);
                byte[] sendData = outputStream.toByteArray();
                InetAddress ia = InetAddress.getByName(serverIP);
                DatagramPacket sendPacket= new DatagramPacket(sendData,sendData.length,ia,1223);
                serverSocket.send(sendPacket);
                outputStream.close();
            }
            for (Produkt s : allSensors) {
                System.out.println(s);
            }
            //Empfangen
            try{
            serverSocket.receive(receivePacket);
            String sentence = new String( receivePacket.getData(), 0,
                             receivePacket.getLength() );
            System.out.println("RECEIVED: " + sentence);

            }catch(IOException e){

            }
            Thread.sleep(1000);
            reduceValue();
        }

    }catch (IOException e) {
          System.out.println(e);
  }



}

static public void initSensors() {

    allSensors.add(new Produkt("Äpfel", 0, 100, ""));
    allSensors.add(new Produkt("Birnen", 0, 100, ""));
    allSensors.add(new Produkt("Kiwis", 0, 100, ""));
    allSensors.add(new Produkt("Bananen", 0, 100, ""));
    for (Produkt s : allSensors) {
        System.out.print(s.p_name + " : " + s.p_quant + "\n");
    }
}

static public void reduceValue() {
    for (Produkt s : allSensors) {
        if (s.p_quant > 0) {
            s.p_quant -= 20;
        }
    }

}

static public void fillValue() {
    for (Produkt s : allSensors) {
        s.p_quant = 100;
    }
}
}

}

因此,当我从Sensordata获得的数量为0时,我就开始向我的客户端发送填充字符串。客户端只获取NOT包。这将持续大约50个包,直到客户机收到填充包。在此之后,服务器将发送一个NOT包,因为数量返回到100。但是客户仍然收到大约50个包的填充包。我有不同的方法,比如打开两个插座,一个用于阅读,一个用于写作。但这仍然是同样的问题


我真的不明白为什么它不起作用。在互联网上也找不到任何解决方案。也许你们能帮我

我发现了我的问题。我向服务器发送了4个包。服务器正在发回4个数据包。对于每个循环,我的客户机读取一个数据包,他发送4个新数据包,得到4个新数据包。因此,数据包的堆栈只是在增长


我将我的客户的读写分为两个线程。现在它工作得很好

UDP没有可靠性特性。如果你想要可靠性,你必须自己编写代码。注意:在本上下文中,单词是“packet”而不是“package”Datagram’会更好。在调用wrapped ByteArrayOutputStream的toByteArray方法之前,需要关闭或至少刷新ObjectOutputStream。这就是我在代码中得到的。实现可靠性的最佳方法是什么?有没有办法只在我收到数据包后才发送数据包?我是UDP和数据包发送的新手。你需要一个基于ACK或NACK的协议。太宽了。使用TCP。
public class Fridge extends Thread {

private static int port;
private static String htmlInsert = "";
private static DataShare ds;

public Fridge(int port, DataShare ds) {
    this.port = port;
    this.ds = ds;
}

@Override
public void run() {

    System.out.println("Start Fridge Server");

    try {
        handleRequest();
    } catch (Exception ex) {
        Logger.getLogger(Fridge.class.getName()).log(Level.SEVERE, null, ex);
    }

}

static public void handleRequest() throws Exception {
    try{
        DatagramSocket serverSocket = new DatagramSocket(port);
        byte[] recivingData = new byte[512];

        DatagramPacket receivePacket = new DatagramPacket(recivingData, recivingData.length);


        for(;;)
        {
            if(!ds.produkte.isEmpty()){
                if(ds.produkte.get(0).p_quant == 0){
                    ds.reOrder = true;
                }else{
                    ds.reOrder = false;
                }
            }
            //Empfangen
            serverSocket.receive(receivePacket);
            //prepare Data for conversion into Produkt
            recivingData = receivePacket.getData();
            ByteArrayInputStream in = new ByteArrayInputStream(recivingData);
            ObjectInputStream is = new ObjectInputStream(in);
            Produkt reveivedProdukt = (Produkt) is.readObject();
            //Decoding Produkt into DataShare
            //System.out.println(reveivedProdukt);
            decodeData(reveivedProdukt);
            writeHTML();

            //Senden
            String reorder = new String();
            if(ds.reOrder){
                reorder = "FILL";
            }else{
                reorder ="NOT";
            }
            System.out.println(reorder);
            byte[] sendingDate = reorder.getBytes("UTF-8");
            DatagramPacket sendingPacket = new DatagramPacket(sendingDate, sendingDate.length,
                    receivePacket.getAddress(),receivePacket.getPort());
            serverSocket.send(sendingPacket);

        }

    }catch(IOException e){
        System.out.println(e);
    }catch(ClassNotFoundException e){
        e.printStackTrace();
    }


}

static public void writeHTML() throws Exception {
    List<String> lines = new ArrayList<String>(Arrays.asList("<!DOCTYPE html>\n",
            "<html>\n",
            "   <head>\n",
            "       <meta charset=\"utf-8\">\n",
            "       <title>Test</title>\n",
            "   </head>\n",
            "   <body>\n",
            "\n",
            "       <h1 style=\"color:red;\">Das ist ein Test</h1>\n",
            "\n",
            "   </body>\n",
            "</html>"));
    htmlInsert += "<p>";
    for(Produkt p : ds.produkte){
        htmlInsert+= p.p_name +" Preis: " + p.p_price + " Shopname: "+
                     p.shop_name + " Quantity: " + p.p_quant + "</br>";
    }

    htmlInsert+=  "</p></br>";              
    lines.add(6, htmlInsert);

    /* WINDOWS Path file = Paths.get(".\\src\\HttpServer\\data.html");*/ 
    /* LINUX*/ Path file = Paths.get("/home/debian/GitRepo/VSSS17/Fridge/src/HttpServer/data.html");
    Files.write(file, lines, Charset.forName("UTF-8"));

}

static public void decodeData(Produkt data) {

    Produkt comp = ds.getProduktByName(data.p_name);
    if (!comp.p_name.equals("Fail")) {
        //System.out.println("Changed" + data.p_name + "for amount: " + data.p_quant);
        ds.setQuant(data.p_name, data.p_quant);
    } else {
        ds.addProdukt(data);
    }

    //System.out.println("---");
    if (ds.getLegnth() != 0) {
    //    ds.print();
    }
    //System.out.println("---");

}