Altri tipi di connessione Francesca Martelli f.martel@di.unipi.it
Socket Un socket è una connessione a una porta su un computer remoto, che è usata per scambiare informazioni con comandi HTTP Supponiamo che la nostra applicazione voglia ricevere uno stream di dati da un particolare file memorizzato su un server remoto Si apre una connessione socket Si spedisce un comando GET seguito dal nome del file, come HTTP request Si legge lo stream ricevuto come HTTP response
Socket (2) Si chiama il metodo open() passando la stringa contenente lo schema del socket: socket identifier seguito dall URL del server remoto, completo di numero di porta Esempio: socket://www.mioserver.com:80 Si usa il metodo println() di PrintStream per spedire stringhe contenenti comandi HTTP per il server remoto Si usa il metodo read() di InputStream per ricavare la HTTP response spedita dal server remoto attraverso la connessione socket
Metodi utili getaddress(): ritorna l'indirizzo remoto a cui il socket si è connesso getlocaladdress(): ritorna l'indirizzo locale getlocalport(): ritorna la porta locale getport(): ritorna la porta remota getsocketoption(byte option): ritorna un'opzione del socket setsocketoption(byte option, int value): imposta un valore per il socket Le opzioni sono: DELAY, ritardo per la scrittura,keepalive, per mantere attiva la socket,linger, tempo di attesa prima di chiudere la connessione con dati di output pendenti, RCVBUF/SNDBUF, per impostare la dimensione del buffer in entrata/uscita
ServerSocketConnection Interfaccia che definisce come accettare connessioni in entrata Estende javax.microedition.io.streamconnectionnotifier, che ascolta per connessioni incoming Si chiama il metodo open() passando una stringa tipo "socket://:7" che definisce un server socket sulla porta 7 (porta echo) Se si omette il numero di porta, il dispositivo ne seleziona automaticamente una disponibile Se la stringa non è valida, viene lanciata IllegalArgumentException. Quando l applicazione necessita di connettersi al socket (per es. per gestire una richiesta entrante), invoca il metodo della server socket connection acceptandopen() che ritorna un istanza di SocketConnection La MIDlet deve essere attiva; conviene costruire tipo SMS MIDlet, basata su Wireless Messaging API (JSR 120) che alla ricezione di un sms lancia la ServerSocket MIDlet
Esempio // Crea il server socket che ascolta sulla porta 80 ServerSocketConnection scn=(serversocketconnection) Connector.open("socket://:80"); // Attende una connessione boolean attendi = true; while (attendi) { SocketConnection sc = (SocketConnection)scn.acceptAndOpen(); // Gestisce la connessione sc } Esempio: Socket Client, Socket Server
Connessione datagram Si basa sull'invio in rete di "messaggi" (datagram), senza garanzie sull'integrità dei dati giunti al destinatario, sull'istante di arrivo sulla consegna dei dati stessi. CONNECTIONLESS: non esiste tra mittente e destinatario del messaggio un percorso dedicato (neppure logico) i dati inviati contengono le informazioni necessarie per individuare il destinatario (indirizzo IP e porta) Adatta a reti di comunicazione wireless a commutazione di pacchetto, mentre può non essere supportata da reti a commutazione di circuito che si basano su stream
Connessione datagram (2) L'utilizzo delle connessioni di tipo datagram impone, solitamente, questi sei passi: 1.il mittente stabilisce una connessione datagram 2.il mittente costruisce un oggetto datagram da inviare contenente indirizzo e porta del destinatario e naturalmente le informazioni da inviare 3.invio del datagram costruito attraverso la connessione aperta 4.costruzione di un oggetto datagram (vuoto) per la ricezione di eventuali dati in risposta 5.attesa di una eventuale risposta. I dati ricevuti vengono scritti nel datagram vuoto pre-allocato 6.chiusura della connessione datagram aperta
Esempio UdpClient.java, UdpServer.java
Esercizio Scrivere 2 MIDlets che realizzano una connessione socket client-server Il server implementa un record store di indirizzi (tipo una rubrica) Il client si connette al server per avere informazioni riguardo ad uno specificato record (per esempio specificando il nome)
Esercizio Scrivere una MIDlet che implementa un server UDP che interagisce col client UDP appena visto, per realizzare una chat a 3 o più utenti. Ogni messaggio dei client è rivolto al server, mentre i messaggi del server devono arrivare a tutti i client. Inoltre si faccia uso di TextBox o TextField al posto di StringItem, in modo da tenere traccia dei messaggi ricevuti. File da usare (modificare SOLO UdpServer): UdpClient.java, UdpServer.java, UdpSender.java