Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

UDP Datagrams help me!

[es] :: Java :: UDP Datagrams help me!

[ Pregleda: 2199 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

miros21k

Član broj: 22204
Poruke: 21
*.dsl.pipex.com.



Profil

icon UDP Datagrams help me!03.04.2005. u 18:36 - pre 239 meseci
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 !!!
 
Odgovor na temu

mucky
Aleksandar Mastilović
Freelancer
Novi Sad - Srbija

Član broj: 237
Poruke: 412
*.com
Via: [es] mailing liste



+1 Profil

icon Re: UDP Datagrams help me!03.04.2005. u 19:10 - pre 239 meseci
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
 
Odgovor na temu

miros21k

Član broj: 22204
Poruke: 21
*.dsl.pipex.com.



Profil

icon Re: UDP Datagrams help me!03.04.2005. u 20:49 - pre 239 meseci
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 !!!
 
Odgovor na temu

mucky
Aleksandar Mastilović
Freelancer
Novi Sad - Srbija

Član broj: 237
Poruke: 412
*.com
Via: [es] mailing liste



+1 Profil

icon Re: UDP Datagrams help me!03.04.2005. u 21:11 - pre 239 meseci
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).
 
Odgovor na temu

miros21k

Član broj: 22204
Poruke: 21
*.dsl.pipex.com.



Profil

icon Re: UDP Datagrams help me!05.04.2005. u 00:22 - pre 239 meseci
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.
 
Odgovor na temu

[es] :: Java :: UDP Datagrams help me!

[ Pregleda: 2199 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.