Resume Sockets JAVA ====================== Resume de Java Examples in a Nutshell de Flanagan, O'reilly http://www.oreilly.com/catalog/jenut/examples/ SOCKET CLIENT STREAM (TCP) =========================== Socket socket = new Socket(host, port); host: String, port: int - socket.getInputStream() - socket.getOutputStream() Lecture d'octets: ---------------- InputStream from_server = socket.getInputStream(); byte[] buffer = new byte[4096]; int bytes_read; while((bytes_read = from_server.read(buffer)) != -1) Sysout.out.write(buffer, 0, bytes_read); Lecture ligne par ligne (BufferedReader): ----------------------------------------- BufferedReader in = new BufferedReader(new InputStreamReader( client.getInputStream())); String line; while((line = in.readLine()) != null) { if (line.length() == 0) break; out.println(line); } Ouput avec "print": -------------------- PrintWriter out = new PrintWriter(new OutputStreamWriter(client.getOutputStream())); out.println("HTTP/1.0 200 "); // Version & status code out.println(); // End of response headers out.flush(); // Essentiel !!! SERVEUR STREAMS ================ ServerSocket ss = new ServerSocket(port); // Port disp. si "port"=0 System.out.println("Receving on Port: " + ss.getLocalPort()); Socket client = ss.accept(); InetAddress origin = client.getInetAddress(); System.out.println("Connection from: " + origin.getHostName()); Addresses INTERNET: =================== InetAddress localAdr = InetAddress.getLocalHost(); String host = "derby"; InetAddress address = InetAddress.getByName(host); address.getHostName() ==> derby.jsp.umontreal.ca address.getHostAddress() ==> 132.204.45.26 DATAGRAMS ========= DatagramSocket dsock1 = new DatagramSocket(), // Port libre octroye dsock2 = new DatagramSocket(5555), // sur Port 5555 System.out.println("Server Port: " + dsock1.getLocalPort()); Packet : base sur tableau d'octets. Pour output, on ajoute 'adr' ======= du destinataire DatagramPacket packet = new DatagramPacket( buffer, buffer.length); DatagramPacket packetout = new DatagramPacket( buffer, buffer.length, address, port); Expedition: dsock1.send(packetout); Reception: dsock2.receive(packet); String contenu = new String(dsock2.getData()); Host Name: packet.getAddress().getHostName() ); Internet address: packet.getAddress().getHostAddress() ); Sender Port: packet.getPort()); Reponse: dsock2.send( new DatagramPacket( "OK".getbytes(), "OK".length(), packet.getAddress(),packet.getPort()); MULTICAST DATAGRAMS (Host: 224.0.1.0 - 239.255.255.255) ========================================================= Exemple avec Host:port "225.0.0.66:4441" Expediteur: InetAddress group = InetAddress.getByName("225.0.0.66"); DatagramSocket sock = new DatagramSocket(); byte [] buf = "Allo".getBytes(); DatagramPacket pk = new DatagramPacket(buf, buf.length, group, 4441); sock . send( pk ); Reception: DatagramSocket sock = new DatagramSocket( 4441); sock.joinGroup( InetAddress.getByName("225.0.0.66") ); byte [] buf = new byte[256]; DatagramPacket pk = new DatagramPacket(buf, buf.length); sock . receive( pk ); System.out.println( new String( pk.getData() ); String reponse = new String( buf,0,pk.getLength()) ; // alternative Conversion: String, Bytes & Chars ================================== Les methodes de telecommunication de JAVA sont basees sur le transfert d'octets (byte) et il y a incompatibilite avec l'utilisation de String de caracteres UNICODE (char) dans le reste du langage. Voici comment convertir: byte[] buffer = new byte[2048]; String msg = "Ceci est une chaine"; byte[] byteMsg ; byteMsg = msg.getBytes(); // conversion String a byte[] String s1 = new String( byteMsg ), // conversion byte[] a String s2 = new String( buffer, 0, 10 ); // partie d'un buffer ======================================================== Communication avec des serveurs HTTP (WWW) ======================================================== Lecture de fichiers WWW par URL =============================== Comment decouper un URL: URL u = new URL("http://www.iro.umontreal.ca:800/fred/xxx.html#a"); URL u = new URL(args[0]); u.getHost() ==> www.iro.umontreal.ca u.getProtocol() ==> http u.getPort() ==> 800 (ou -1) si non specifie...= 80 u.getFile() ==> fred/xxx.html Obtenir information sur le fichier (HTTP: "HEAD") -------------------------------------------------- URLConnection c = u.openConnection(); c.connect(); Content Type: c.getContentType() Content Encoding: c.getContentEncoding() Content Length: c.getContentLength() Date: c.getDate() Last Modified: c.getLastModified() Expiration: c.getExpiration() Acces au contenu du fichier (HTTP: "GET") ------------------------------------------- URL url = new URL(urlString); // Create the URL 1) .openStream() -> Stream ------------------------------ InputStream in = url.openStream(); // Open a stream to it // Now copy bytes from the URL to the output stream byte[] buffer = new byte[4096]; int bytes_read; while((bytes_read = in.read(buffer)) != -1) System.out.write(buffer, 0, bytes_read); 2) . getInputStream() -> Stream --------------------------------------------- URLConnection link = url.openConnection(); BufferedReader inStream = new BufferedReader(new InputStreamReader(link.getInputStream())); while ((line = inStream.readLine()) != null) System.out.print(line);