À la découverte du paquetage java.net
Composants essentiels
- Les adresses IP : classe InetAddress
- Les interfaces réseau : classe NetworkInterface
- Les sockets UDP : classes DatagramSocket et MulticastSocket (paquet UDP : classe DatagramPacket)
- Les sockets TCP : classes ServerSocket et Socket
- Connexions niveau applicatif : classe URLConnection (pour gérer par exemple une connexion HTTP)
Implantations compatibles
- OpenJDK (implantation de référence du JDK)
- API Android
Modèle OSI : ce qu'il est possible de faire (ou pas) avec l'API standard Java
- Physique
- Liaison : envoi des trames Ethernet brutes impossible
- Réseau : test de connectivité ICMP possible, envoi de paquets IP bruts impossible (pas de support des rawsockets)
- Transport : support de UDP, TCP, SCTP (non-officiel)
- Session, présentation : support de TLS sur TCP (SSLServerSocket, SSLSocket)
- Application : résolution DNS, connexions HTTP...
Remarque : le modèle des dernières couches OSI n'est plus pertinent actuellement (tendance à créer de nouveaux protocoles gérant à la fois les problématiques transport, session, présentation et application tel que HTTP/2.0)
Fonctionnement interne de l'API réseau
- Repose sur les appels systèmes POSIX : getaddrinfo, socket, recv, send, accept...
- Code compilé natif de liaison avec les appels systèmes pour chaque plate-forme supportée (Windows, Linux, FreeBSD...)
- Interfaçage avec le code natif avec Java Native Interface (JNI)
L'API Java est une surcouche pour les appels systèmes réseau (Java n'implante pas les protocoles UDP, TCP, DNS... c'est le noyau du système qui les gère)
Concurrence
Deux approches pour gérer de multiples communications réseau.
Approche bloquante multi-thread
- Un flot de communication = 1 thread
- Opérations d'E/S bloquantes (main redonnée à une autre thread pendant le blocage)
Approche non-bloquante évènementielle
- Une seule thread
- Utilisation d'un sélecteur indiquant les flots de communication disponibles
- Opérations d'E/S non-bloquantes : retour immédiat si rien ne peut être lu ou écrit
- Approche implantée depuis Java 1.4 dans java.nio