[ miros21k @ 03.04.2005. 18:36 ] @
Cao narode, opet ja sa problemcicem u vezi Java Sockets.

Ovako dali su nam simple UDP Echo Server, koji echos (vrati) 50% poruka sto mu UDP Echo Client (koji smo isto dobili) posalje.
E sad moramo da promenimo Client tako da bude "Reliable", sto znaci da moramo nekako da ugradimo TimeOut-and-Retransmission tehnologiju putem
setSoTimeout (1000) NAPRIMER
tako da ako Client ne dobije poruku nazad od servera u roku od 1000ms (ili ti 1 sekunde) da opet posalje poruku i tako opet i opet dok ju ne dobije nazad

E sad "receive" method od DatagramSocket daje timeout exception koji ja moram da "handle" koristeci try and catch
Isto tako kad god timeout se desi moram da izadje poruka na ekranu Clienta i da mu kaze da se timeout desio i tek onda da proba ponovo da posalje poruku.

Nadam se da ste razumeli sta trebam uradit, pa se nadam da ce te mi pomoci.

Client u trenutnom stanju ako ne dobije "reply" samo stoji i nista se ne desava, zato moramo da uradimo nesto da Client zna da se timeout desio i da pokusa da posalje poruku ponovo, znaci da pokusava da ju dostavi dok ne uspe i zato se zove "Reliable".

Evo Code Servera
SERVER:
Code:

import java.io.*;
import java.net.*;
public class LossyServer
{
     public static void main(String args[]) throws IOException
     {
           DatagramSocket ds = new DatagramSocket(10007);
           while (true)
           {
                byte[] buf = new byte[8192];
                DatagramPacket idp = new DatagramPacket(buf, buf.length);
                ds.receive(idp);
                if (Math.random() < 0.5)
                {
                      DatagramPacket odp = new DatagramPacket(idp.getData(),
                      idp.getLength(), idp.getAddress(), idp.getPort());
                      ds.send(odp);
                }
                else
                {
                     System.out.println("Packet dropped!");
                }
           }
     }
}


A evo i Klijenta
CLIENT
Code:

import java.io.*;
import java.net.*;
public class ReliableClient
{
      public static void main(String args[]) throws IOException
      {
           DatagramSocket ds = new DatagramSocket();
           String msg = new String("HELO\r\n");
           DatagramPacket req = new DatagramPacket(msg.getBytes(),
           msg.length(), InetAddress.getByName("127.0.0.1"), 10007);
           ds.send(req);
           System.out.println("Packet sent.");
           byte[] buf = new byte[8192];
           DatagramPacket res = new DatagramPacket(buf, buf.length);
           ds.receive(res);
           System.out.println("Packet received.");
      }
}



HVALA !!!
[ mucky @ 03.04.2005. 19:10 ] @
U Client kodu, umesto ds.receive(res); stavi

Code:

boolean received = false;
      
while (!received) {
    try {
          ds.receive(res);
          received = true;
      }
      catch (SocketTimeoutException) {
          System.out.println("Packet not received after 1s!");
      }
      catch (Exception) {
            System.out.println("Packet lost!");
      }
      
}


i trebalo bi da radi... Poenta je sto je metoda ds.receive(res)
blokirajuca, pa se received=true; nece izvrsiti ukoliko sve ne
prodje kako treba. Ukoliko nesto ne podje kako treba, pravi se Exception
pre menjanja promenljive received.

--
Until Eve arrived, this was a man's world. -- Richard Armour
[ miros21k @ 03.04.2005. 20:49 ] @
To sto si mi napisao nije ispalo tacno, ali mi je dalo ideje i uspeo sam.
Evo Code:

Code:

import java.io.*;
import java.net.*;
public class ReliableClient
{
     public static void main(String args[]) throws IOException
    {
         boolean received = false;
         while (received != true)
        {
    try
    {
                   DatagramSocket ds = new DatagramSocket();
                     String msg = new String("HELO\r\n");
                     DatagramPacket req = new DatagramPacket(msg.getBytes(),
                     msg.length(), InetAddress.getByName("127.0.0.1"), 10007);
                     ds.send(req);
                     System.out.println("Packet sent.");
                     byte[] buf = new byte[8192];
                     DatagramPacket res = new DatagramPacket(buf, buf.length);
                     ds.setSoTimeout (5000);
                     ds.receive(res);
                     received = true;
                     System.out.println("Packet received.");
    }
               catch (SocketTimeoutException X)
               {
          System.out.println("Packet not received after 5s!\n");
          received = false;
    }
        }
    }
}


P.S. Promenio sam sa 1s na 5s

HVALA MUCKY !!!
[ mucky @ 03.04.2005. 21:11 ] @
A zasto nije ispalo tacno?

Zato sto nisam gledao kod :) Prvo klijent posalje request serveru, pa
tek onda ocekuje
da dobije paket :) Ova moja implementacija radi kada stavis sledece

Code:

           catch (SocketTimeoutException ste) {
    
                   System.out.println("Packet not received after 1s!");
                   ds.send(req);
    
           }


Znaci poenta je da klijent ponovo posalje request ako pomisli da je
paket ispusten.

Moje subjektivno misljenje je da je ovako kod lepsi i citljiviji, iako
i na ovoj varijanti
ima da se poradi jos :)
--
"In Italy for thirty years under the Borgias they had warfare, terror,
murder and bloodshed but they produced Michelangelo, Leonardo da Vinci
and the Renaissance.
In Switzerland, they had brotherly love; they had five hundred years
of democracy and peace and what did they produce? The cuckoo clock."
-- Orson Welles (1915--1985).
[ miros21k @ 05.04.2005. 00:22 ] @
Upravu si, lepse je tako ali radi i tako i onako, sto znaci imam cak "dva" resenja i sad malo bolje razumijem sta se desava.

Hvala jos jednom.