Параллельный многопоточный сервер через UDP в Java - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь создать сервер, который может обрабатывать несколько запросов одновременно на одном и том же номере порта через UDP.Ниже приведен Java-код для того же самого.

Runnable task = () ->
                {
                    DatagramSocket aSocket=null;
                    while(true)
                    { 
                        try
                        {  
                        aSocket= new DatagramSocket(2222);
                        byte[] buffer=new byte[1000]; 
                        DatagramPacket Reply=new DatagramPacket(buffer,buffer.length);

                        aSocket.receive(Reply);
                        String rec=new String(Reply.getData());
                        System.out.println("rec "+rec);

                        String[] splited = rec.split("\\s+");

                        System.out.println("Operation "+splited[0]);
                        if(splited[0].equalsIgnoreCase("Enroll"))
                        {
                            String ret=cs.enrollCourse(splited[1],splited[2],splited[3]);
                            byte[] temp=new byte[1000];
                            temp=ret.getBytes();
                            DatagramPacket se=new DatagramPacket(temp,temp.length,Reply.getAddress(),Reply.getPort());
                            aSocket.send(se);

                        }
                       if(splited[0].equalsIgnoreCase("Drop"))
                       {
                           String ret=cs.drop_external(splited[1],splited[2]);
                           byte[] temp=new byte[1000];
                           temp=ret.getBytes();
                           DatagramPacket se=new DatagramPacket(temp,temp.length,Reply.getAddress(),Reply.getPort());
                           aSocket.send(se);
                           aSocket.close();

                        }
                        if(splited[0].equalsIgnoreCase("list"))
                        {
                            String ret=cs.listCourseAvailability(splited[1],splited[2]);
                            byte[] temp=new byte[1000];
                            temp=ret.getBytes();
                            DatagramPacket se=new DatagramPacket(temp,temp.length,Reply.getAddress(),Reply.getPort());
                            aSocket.send(se);

                         }
                         if(splited[0].equalsIgnoreCase("Remove"))
                         {
                            String ret=cs.removeCourse(splited[1],splited[2]);
                            byte[] temp=new byte[1000];
                            temp=ret.getBytes();
                            DatagramPacket se=new DatagramPacket(temp,temp.length,Reply.getAddress(),Reply.getPort());
                            aSocket.send(se);

                         }

                    }catch(Exception e)
                    {
                        System.out.println(e.getMessage());
                    }
                    finally
                    {
                       if (aSocket != null)
                        {
                            aSocket.close();
                        }
                    }
                  }
            };
       Thread t=new Thread(task);
       t.start();

Когда два запроса поступают в одно и то же время, один из них не получен вышеуказанным кодом.

Правильна ли реализация?Есть ли другой способ реализовать то же самое с использованием UDP?

1 Ответ

0 голосов
/ 27 октября 2018

После обработки каждого входящего пакета и отправки ответа вы закрываете DatagramSocket, открывая новый. Это (вероятно) заставит ОС отбрасывать любые пакеты, которые были получены и не обработаны.

Решение: не делай этого. Используйте один DatagramSocket и закрывайте его только тогда, когда поток собирается выйти.

На самом деле поток здесь не служит никакой реальной цели ... хотя это не является причиной вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...