Я создаю клиент-серверное приложение с использованием 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