lpr-b:udpservercomm
no way to compare when less than two revisions
Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
— | lpr-b:udpservercomm [19/11/2007 alle 15:17 (18 anni fa)] (versione attuale) – creata Sonia Campa | ||
---|---|---|---|
Linea 1: | Linea 1: | ||
+ | <code java> | ||
+ | package nfs; | ||
+ | import java.io.IOException; | ||
+ | import java.io.InterruptedIOException; | ||
+ | import java.net.DatagramPacket; | ||
+ | import java.net.DatagramSocket; | ||
+ | import java.net.InetAddress; | ||
+ | |||
+ | /** | ||
+ | * this is used to call a server and wait for a response, taking into account that messages can be lost. | ||
+ | * The calling message is supposed to be in a datagram packet and the answer itself is given back as a datagram packet | ||
+ | | ||
+ | * @author marcod | ||
+ | * | ||
+ | */ | ||
+ | public class UDPServerComm { | ||
+ | |||
+ | /** | ||
+ | * parameters to reach the server | ||
+ | */ | ||
+ | InetAddress | ||
+ | int serverPort = 0; | ||
+ | DatagramSocket ds = null; | ||
+ | |||
+ | /** | ||
+ | * number of retries when a message fails to get an aswer | ||
+ | */ | ||
+ | int retries = 10; | ||
+ | |||
+ | /** | ||
+ | * timeout used to wait an answer from the server | ||
+ | */ | ||
+ | int timeoutSeconds = 5; | ||
+ | |||
+ | /** | ||
+ | * limit of the size of the datagram packet payload (just for this exercise) | ||
+ | */ | ||
+ | public static final int LIMIT = 8192; | ||
+ | |||
+ | /** | ||
+ | * constructor, | ||
+ | * @param serverName name of the machine running the server | ||
+ | * @param port port used by the server to listen messages | ||
+ | */ | ||
+ | |||
+ | public UDPServerComm(String serverName, int port) { | ||
+ | try { | ||
+ | serverAddress = InetAddress.getByName(serverName); | ||
+ | serverPort = port; | ||
+ | ds = new DatagramSocket(); | ||
+ | } catch(Exception e) { | ||
+ | e.printStackTrace(); | ||
+ | } | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * used to set the number of times we have to retransmit before actually failing | ||
+ | * @param n number of time to retransmit | ||
+ | */ | ||
+ | public void setRetries(int n) { | ||
+ | retries = n; | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * sets the seconds used before timeouting a request | ||
+ | * @param n the number of seconds the answer is awaited before getting the timeout | ||
+ | */ | ||
+ | public void setTimeoutSeconds(int n) { | ||
+ | timeoutSeconds = n; | ||
+ | } | ||
+ | |||
+ | |||
+ | /** | ||
+ | * this is the main method: sends the server the datagram packet and waits for an answer, setting proper timeouts | ||
+ | * and retransmitting, | ||
+ | * @param dp the datagram to be sent to the server | ||
+ | * @return the datagram aswered by the server | ||
+ | */ | ||
+ | public DatagramPacket call(DatagramPacket dp) { | ||
+ | DatagramPacket answer = new DatagramPacket(new byte[LIMIT], | ||
+ | // prepare the datagram to be sent | ||
+ | dp.setAddress(serverAddress); | ||
+ | dp.setPort(serverPort); | ||
+ | try { | ||
+ | // the start waiting for an answer | ||
+ | boolean done = false; | ||
+ | // set retries to default value | ||
+ | int nretry = retries; | ||
+ | // set timeout | ||
+ | ds.setSoTimeout(timeoutSeconds*1000); | ||
+ | do { | ||
+ | try { | ||
+ | // now send the datagram | ||
+ | ds.send(dp); | ||
+ | // wait for the answer | ||
+ | ds.receive(answer); | ||
+ | // got! we are done! | ||
+ | done = true; | ||
+ | } catch(InterruptedIOException e) { // if the receive timeouts ... | ||
+ | nretry--; | ||
+ | if(nretry == 0) // in case we reached the limit | ||
+ | return null; // just return a null | ||
+ | } | ||
+ | } while(!done); | ||
+ | } catch (IOException e) { | ||
+ | e.printStackTrace(); | ||
+ | } | ||
+ | return answer; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ |
lpr-b/udpservercomm.txt · Ultima modifica: 19/11/2007 alle 15:17 (18 anni fa) da Sonia Campa