Code Java
<ol class=" list-paddingleft-2"> <li><p>public void handleConnection(Socket connectionToHandle) { </p></li> <li><p>new Thread(new ConnectionHandler(connectionToHandle)).<br>start(); </p></li> <li><p>} </p></li> <li><p>public void handleConnection(Socket connectionToHandle) { </p></li> <li><p>new Thread(new ConnectionHandler(connectionToHandle)).<br>start(); </p></li> <li><p>} </p></li> </ol>
Les grands changements que nous avons apportés à RemoteFileServer se reflètent dans cette méthode. Nous appelons toujours handleConnection() une fois que le serveur a accepté une connexion, mais nous passons maintenant le Socket à une instance de ConnectionHandler, qui est Runnable. Nous créons un nouveau Thread avec ConnectionHandler et le démarrons. La méthode run() de ConnectionHandler contient le code pour la lecture/écriture de Socket et la lecture de fichier, qui se trouve à l'origine dans handleConnection() de RemoteFileServer.
4. Gestion des connexions : Partie 2
Voici la structure de la classe ConnectionHandler :
Code Java
import java.io.*; import java.net.*; public class ConnectionHandler implements Runnable{ Socket socketToHandle; public ConnectionHandler(Socket aSocketToHandle) { socketToHandle = aSocketToHandle; } public void run() { } } import java.io.*; import java.net.*; public class ConnectionHandler implements Runnable{ Socket socketToHandle; public ConnectionHandler(Socket aSocketToHandle) { socketToHandle = aSocketToHandle; } public void run() { }
Cette classe d'assistance est assez simple. Comme nos autres classes jusqu'à présent, nous importons java.net et java.io . Cette classe n'a qu'une seule variable d'instance, socketToHandle, qui contient le Socket géré par cette instance. Le constructeur de la classe prend une instance Socket comme paramètre et l'assigne à socketToHandle.
Veuillez noter que cette classe implémente l'interface Runnable. Les classes qui implémentent cette interface doivent implémenter la méthode run(), ce que fait notre classe. Nous explorerons les détails de run() plus tard. Sachez maintenant qu'il gérera réellement la connexion, en utilisant le même code que nous avons vu précédemment dans la classe RemoteFileServer.
Implémentation de run()
Ici, nous implémentons la méthode run(), qui récupérera le flux de notre connexion, l'utilisera pour lire et écrire la connexion, et la fermera une fois la tâche terminée :
Code Java
public void run() { try { PrintWriter streamWriter = new PrintWriter(socketToHandle.getOutputStream()); BufferedReader streamReader = new BufferedReader(new InputStreamReader(socketToHandle.getInputStream())); String fileToRead = streamReader.readLine(); BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead)); String line = null; while ((line = fileReader.readLine()) != null) streamWriter.println(line); fileReader.close(); streamWriter.close(); streamReader.close(); } catch (Exception e) { System.out.println("Error handling a client: " + e); } } public void run() { try { PrintWriter streamWriter = new PrintWriter(socketToHandle.getOutputStream()); BufferedReader streamReader = new BufferedReader(new InputStreamReader(socketToHandle.getInputStream())); String fileToRead = streamReader.readLine(); BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead)); String line = null; while ((line = fileReader.readLine()) != null) streamWriter.println(line); fileReader.close(); streamWriter.close(); streamReader.close(); } catch (Exception e) { System.out.println("Error handling a client: " + e); } }
ConnectionHandler La méthode run() fait ce que fait handleConnection() sur RemoteFileServer. Tout d’abord, nous encapsulons InputStream et OutputStream (en utilisant getOutputStream() et getInputStream() de Socket respectivement dans BufferedReader et PrintWriter. Nous utilisons ensuite ce code pour lire le fichier cible ligne par ligne :
Code Java
FileReader fileReader = new FileReader(new File(streamReader.readLine())); BufferedReader bufferedFileReader = new BufferedReader(fileReader); String line = null; while ((line = bufferedFileReader.readLine()) != null) { streamWriter.println(line); } FileReader fileReader = new FileReader(new File(streamReader.readLine())); BufferedReader bufferedFileReader = new BufferedReader(fileReader); String line = null; while ((line = bufferedFileReader.readLine()) != null) { streamWriter.println(line); }
N'oubliez pas que nous devons obtenir un chemin de fichier valide du client, alors construisez un nouveau fichier avec ce nom de chemin, enveloppez-le dans un FileReader pour gérer la lecture le fichier, puis l'enveloppe dans un BufferedReader qui nous permet de lire le fichier ligne par ligne. Nous appelons readLine() sur BufferedReader dans une instruction Java while jusqu'à ce qu'il n'y ait plus de lignes à lire. Veuillez noter que l'appel à readLine() se bloquera jusqu'à ce qu'un octet arrive. Après avoir récupéré quelques octets, nous les mettons dans la variable de ligne locale et les écrivons au client.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!