Cet article décrit une application client simple côté serveur de programmation réseau Java. Partagez-le avec tout le monde pour votre référence. Les détails sont les suivants :
En Java, nous utilisons java.net.Socket et ses classes associées pour exécuter les fonctions liées au réseau. La classe Socket est très simple et facile à utiliser car la technologie Java cache le processus complexe d'établissement d'une connexion réseau et d'envoi de données via la connexion. Ce qui est dit ci-dessous s'applique uniquement au protocole TCP.
1. Connectez-vous au serveur
Nous pouvons utiliser le constructeur de la classe Socket pour ouvrir une socket, comme
Socket sk = nouveau Socket("210.0.235.14",13);
Parmi eux, 210.0.235.14 est un objet String décimal à points, représentant l'adresse IP (ou le nom d'hôte) de l'hôte de destination, et 13 représente le port 13 désigné pour se connecter à l'hôte de destination. Le 210.0.235.14 est ici un serveur de timing situé à Hong Kong. Le port par défaut du serveur de timing est généralement 13.
Notez que le programme se bloque jusqu'à ce qu'il se connecte avec succès au serveur.
Ensuite, vous pouvez utiliser la méthode getInputStream() de la classe Socket pour obtenir un objet InputStream. Grâce à cet objet, vous pouvez obtenir les informations qui nous sont envoyées par l'hôte cible :
InputStream inStream = sk.getInputStream();
De même, pour envoyer des données à l'hôte cible, vous pouvez appeler la méthode getOutputStream() pour obtenir un objet de flux de sortie.
L'exemple de fonction suivant consiste à se connecter au serveur de synchronisation et à imprimer les informations renvoyées sur la sortie standard :
try { Socket sk = new Socket("210.0.235.14",13); sk.setSoTimeout(3000); InputStream inStream = sk.getInputStream(); //Obtenir l'objet de flux d'entrée Scanner sc = new Scanner(inStream); / Imprimer les données sur la console while(sc.hasNextLine()) { String str = sc.nextLine(); System.out.println("Output : " + str); } sk.close(); } catch(SocketTimeoutException e) //Exception de délai d'attente { System.out.println("Time Out!"); ) { e.printStackTrace( }
La méthode setSoTimeout() dans le code peut définir le délai d'attente, c'est-à-dire que si les opérations de lecture et d'écriture ne sont pas terminées après le délai défini, une SocketTimeoutException sera levée et la connexion pourra être fermée en interceptant cette exception.
Il existe également un problème de délai d'attente qui doit être résolu, à savoir le constructeur de la classe Socket.
nouveau Socket (hôte, port);
Il se bloquera indéfiniment jusqu'à ce qu'une connexion à l'hôte cible soit établie avec succès. Ce n’est certainement pas ce que nous souhaitons. Nous pouvons résoudre ce problème en appelant :
Socket sk = new Socker();sk.connect(new InetSocketAddress(host,port),2000);//Définissez le délai d'attente sur 2 secondes
2. Obtenez l'adresse de l'hôte
La méthode statique getByName(hostname) de la classe InetAddress peut renvoyer un objet InetAddress représentant une adresse d'hôte. Cet objet renferme une séquence de 4 octets, qui est l'adresse IP de l'hôte. Appelez ensuite la méthode getHostAddress() pour renvoyer un objet String représentant l'adresse IP.
Certains noms d'hôtes avec un volume de trafic élevé correspondent généralement à plusieurs adresses IP pour réaliser l'équilibrage de charge. Nous pouvons obtenir toutes les adresses d'hôtes en appelant la méthode getAllByName(), qui renvoie un tableau d'objets InetAddress.
Ce qui suit est un petit programme simple. La fonction consiste à imprimer l'adresse IP locale si aucun paramètre n'est défini sur la ligne de commande. Si un nom d'hôte est spécifié, toutes les adresses IP de l'hôte sont imprimées :
package cls ; importer java.net.* ; public class ShowIP { public static void main(String[] args) { try { if(args.length > 0) { String hostName = args[0] ; ] addr = InetAddress.getAllByName(hostName); //Obtenir toutes les adresses de l'hôte //Imprimer la sortie sur la console pour (adresse InetAddress : addr) { System.out.println(address.getHostAddress()); } } else { System.out.println(InetAddress.getLocalHost().getHostAddress()); } } catch(Exception e) { e.printStackTrace(); }
3. Programme côté serveur
Les applications côté serveur utilisent la classe ServerSocket pour créer un socket et le lier au port local, tel que
Chaussette ServerSocket = new ServerSocker (8000);
La méthode sock.accept() permet au programme d'attendre une connexion en continu. Cette méthode ne renverra un objet Socket représentant une nouvelle connexion que lorsqu'un client est connecté, c'est-à-dire que cette méthode se bloquera.
Ici il faut généralement ouvrir un nouveau thread pour chaque connexion pour la servir.
Voici un exemple complet. Le serveur attend une connexion sur le port 8400. Chaque fois qu'une connexion arrive, un nouveau thread est ouvert pour la servir et les informations de connexion sont écrites dans le fichier journal :
package cls ; importer java.io.*; importer java.util.*; importer public class ServerDemo { /** * @param args */ public static void main(String[] args) { try { //ServerSocket servSocket = nouveau ServerSocket (8000); ServerSocket servSocket = nouveau ServerSocket (8400); while(true) { Socket client = servSocket.accept(); ++amount; Date time = new Date(); String prompt = time.toString() + ":th" + montant + "user" + client.getInetAddress ( ).getHostAddress() + "Connected/n"; System.out.print(prompt); //Afficher les informations sur la console ServerDemo.writeLog(prompt); //Écrire dans un fichier//démarrer un nouveau Thread Thread th = new Thread(new ServThread(client,amount)); th.start(); } } catch(Exception e) { e.printStackTrace(); Écrire dans le fichier journal public static void writeLog(String str) { File logFile = new File("server-log.txt"); try { FileWriter out = new FileWriter(logFile,true); out.append(str); out.close(); } catch(Exception e) { e.printStackTrace(); } } } /* * Classe de thread de service*/ class ServThread implémente Runnable { private Client de socket ; privé int ix ; public ServThread (Socket soc,int ix) { client = soc ; ix ; public void run() { try { InputStream inStream = client.getInputStream(); OutputStream outStream = client.getOutputStream(); Scanner recv = new Scanner(inStream); send = new PrintWriter(outStream,true); Quelques mots ! [Entrez 'bye' pour fermer la connexion]"); while(recv.hasNextLine()) { String str = recv.nextLine(); if(str.equals("bye")) { send.println("À bientôt plus tard ~ ^-^"); break; } send.println("Ceci est un programme de test, il n'a pas encore de fonctions"); } Date heure = new Date(); String prompt = time.toString() + ": user" + ix + "th" + client.getInetAddress().getHostAddress() + "Disconnected/n"; System.out.print(prompt); /Écrire dans le fichier client.close(); } catch(Exception e) { e.printStackTrace();
Ce programme a été placé sur le serveur. Vous pouvez utiliser la commande telnet tothol.tk 8400 pour découvrir les résultats d'exécution de ce programme.
J'espère que cet article sera utile à la programmation Java de chacun.