Manipulez java.net.SocketException: le socket est fermé lors du multithreading?

Je fais un projet d’école où nous sums censés créer un système de réservation d’hôtel simple, puis l’utiliser avec une communication serveur / client. Puisque je voulais pousser le projet un peu et faire un programme multithread, j’ai une exception de socket que je ne sais pas comment gérer. J’ai cherché partout une réponse et je sais que l’exception se produit parce que j’essaie d’utiliser un socket qui a été fermé. Mais d’après ce que j’ai lu sur Oracle-docs, leur exemple le fait également.

Donc, est-ce que ça va, juste que je dois gérer l’exception? Parce que mon code fonctionne correctement, je vois juste les exceptions depuis que j’ai mis e.printStackTrace (); dans mes sockets.

Ma classe de client:

package client; import java.io.*; import java.net.Socket; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Scanner; public class Client { public static void main(Ssortingng[] args) { Scanner sc = new Scanner(System.in); try { Socket client = new Socket("localhost", 6066); //System.out.println("Just connected to " + client.getRemoteSocketAddress()); OutputStream outToServer = client.getOutputStream(); DataOutputStream out = new DataOutputStream(outToServer); InputStream inFromServer = client.getInputStream(); DataInputStream in = new DataInputStream(inFromServer); LocalDate localDate = LocalDate.now(); Ssortingng date = DateTimeFormatter.ofPattern("yyy/MM/dd").format(localDate); System.out.println(in.readUTF()); System.out.print("Namn: "); Ssortingng name = sc.nextLine(); System.out.print("Ålder: "); Ssortingng age = sc.nextLine(); out.writeUTF(name); out.writeUTF(age); out.writeUTF(date); System.out.println(in.readUTF()); client.close(); }catch(IOException e) { e.printStackTrace(); } } } 

Et ma classe de serveur:

 package server; import java.io.IOException; import java.net.*; public class Server { public static void main(Ssortingng [] args) throws IOException { int port = 6066; ServerSocket server = new ServerSocket(port); while(true) { System.out.println("Listening for client.."); try { Socket connectedClient = server.accept(); ClientHandle ch = new ClientHandle(connectedClient); Thread t = new Thread((Runnable) ch); t.start(); }catch (IOException e) { } } } } 

Et puis ma classe ClientHandle qui a le run () pour le côté serveur:

 package server; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.EOFException; import java.io.IOException; import java.net.*; import resources.*; public class ClientHandle implements Runnable{ Socket connectedClient; DataInputStream in; DataOutputStream out; public ClientHandle(Socket connectedClient) { this.connectedClient = connectedClient; try{ this.in = new DataInputStream(this.connectedClient.getInputStream()); this.out = new DataOutputStream(this.connectedClient.getOutputStream()); }catch(IOException ex) { } } Hotel hotel = new Hotel(); Ticket yourTicket = new Ticket(); Server server = new Server(); @Override public void run() { while (true) { try { InetAddress host = InetAddress.getLocalHost(); System.out.println("Client " + host + " has connected."); out.writeUTF("Välkommen till Hotel Gisslevik!\nVänligen fyll i nedan information för att slutföra din bokning.\n"); Ssortingng yourName = in.readUTF(); Ssortingng age = in.readUTF(); int yourAge = Integer.parseInt(age); Ssortingng date = in.readUTF(); yourTicket.setDate(date); Person guest = new Person(yourName, yourAge); hotel.setRooms(); Integer room = hotel.getRoom(); Ssortingng rent = "J"; if (rent.indexOf("J") >= 0) { yourTicket.setId(yourName); if (hotel.checkIn(guest, room, yourTicket.getId(), yourTicket.getDate())) { Ssortingng yourId = yourTicket.getId(); out.writeUTF("\nDitt rum är nu bokat den " + date + ". \nBokningsnummer: " + yourId); } } out.flush(); connectedClient.close(); }catch (EOFException e) { } catch (IOException e) { e.printStackTrace(); break; } } } } 

Si je viens de commenter e.printStackTrace (); les exceptions ne sont pas visibles, mais j’aimerais savoir comment les gérer (si elles doivent être traitées). J’ai fait des recherches sur Internet pendant des jours et j’ai suivi des didacticiels, mais je ne trouve pas de réponse appropriée à cela.

J’apprécie vraiment toute aide que vous pouvez apporter.

Gérer java.net.SocketException: socket fermé

Ne fermez pas le support et continuez à l’utiliser.

en multithreading?

Sans importance.

Vous avez connectedClient.close() dans votre boucle while (true) . Solution: déplacez-le à l’extérieur.