смущен тем, почему клиентский сервер UDP делает это

Я создаю клиент-серверное приложение с использованием UDP. Прежде чем кто-нибудь спросит, почему я использую UDP вместо TCP, позвольте мне ответить, заявив, что это для задания. Хорошо к вопросу!

Я создал клиентский класс, который порождает поток для отправки пакетов на сервер UDP. Основной поток прослушивает входящие пакеты. Класс сервера действует как служба отправки приветственных сообщений, а также как посредник для передачи сообщений клиентов всем.

Когда я создал двух клиентов, вывод первого клиента выглядит следующим образом:

Please enter your name for the server: 
James
Welcome to the server James
Hi all // User james types this
James: Hi all // Outputs his message to him once - that's fine
Hi mate // Output from another user

Вот как я хочу, чтобы все клиенты отправляли и получали сообщения. Но когда второй клиент делает то же самое, я получаю следующий вывод:

Please enter your name for the server: 
Owen
Welcome to the server Owen
Hi all         // Client one (James wrote this)
Hi mate
Owen: Hi mate
Hi mate

Обратите внимание, что здесь я получил одно и то же сообщение дважды, но на первом клиенте я получил его только один раз. Вот моя логика в классе сервера для отправки сообщений клиенту:

// Get the response
                String response = new String(packet.getData());

                // Test - send a message from the server to each user
                if( ports.size() > 1 )
                {
                    for( int i = 0; i < ports.size(); i++ )
                    {
                        System.out.println( "Values in port arraylist: "+ports );

                        if( packet.getPort() == ports.get(i) )
                        {

                        } else 
                        {
                            // String toSend = names.get(i).concat( ": "+response );
                            // System.out.println( toSend );
                            buf = response.getBytes();

                            System.out.println( "Packet Receieved from Port: "+packet.getPort()+"\nPorts.get: "+ports.get(i) );

                            // Could store all address in own arraylist for outside local host networking
                            int thisPort = ports.get(i);
                            packet = new DatagramPacket( buf, buf.length,packet.getAddress(),thisPort );
                            socket.send(packet);
                            System.out.println( "Sending message to port "+ports.get(i) );
                        }
                    }
                    System.out.println( "\n" );
                    packet = null;
                }

Чтобы проверить это, я добавил несколько выходных строк, чтобы увидеть, что здесь происходит, и получил это:

Values in port arraylist: [61493, 61494]
Values in port arraylist: [61493, 61494]
Packet Receieved from Port: 61493
Ports.get: 61494
Sending message to port 61494


Values in port arraylist: [61493, 61494]
Packet Receieved from Port: 61494
Ports.get: 61493
Sending message to port 61493
Values in port arraylist: [61493, 61494]
Packet Receieved from Port: 61493
Ports.get: 61494
Sending message to port 61494

person Katana24    schedule 17.04.2012    source источник
comment
Если это домашнее задание, вы должны добавить тег домашнего задания!   -  person Colin D    schedule 18.04.2012


Ответы (1)


Я не знаю, почему он это делал, но я исправил это, поместив в код глобальную переменную для хранения временного значения порта для сравнения:/

person Katana24    schedule 18.04.2012