Ne clôture le BufferedReader/PrintWriter fermer la connexion de socket?
J'ai une application qui utilise de simples sockets pour passer certains caractères entre les deux systèmes. J'ai mon application java s'exécutant en tant que serveur. - Je établir une connexion amende, et même passer un message. Cependant, après un message a été envoyé ma connexion se ferme.
De ce que je peux dire, il semble comme si à la clôture de la printWriter
et bufferedReader
le support lui-même est fermé?! Ce qui est mauvais, comme je l'ai plusieurs messages à envoyer sur la même connexion.
printWriter = new PrintWriter(theServer.getClientSocket().getOutputStream());
bufferedReader = new BufferedReader(new InputStreamReader(theServer.getClientSocket().getInputStream()));
printWriter.println("the line");
printWriter.close(); //Closing on these lines?
bufferedReader.close(); //Closing on these lines?
Je suis plein de lui? Comment puis-je conserver ce lien en Java?
OMI SoftwareMonk a la meilleure réponse, stackoverflow.com/a/486088/632951
OriginalL'auteur Alex | 2009-01-27
Vous devez vous connecter pour publier un commentaire.
Oui, la fermeture Writer/Reader va fermer tous les autres Écrivains et les Lecteurs, qu'ils s'enroulent. Ne pas le fermer jusqu'à ce que vous êtes prêt à fermer le socket sous-jacente.
Vous aurez besoin de rincer si vous souhaitez contrôler quand les lignes frappé le fil.
Rinçage fonctionne... la nature gracieuse messieurs...
Close est un implicite de la chasse d'eau. Si vous voulez vous rincer avant d'appeler à proximité, puis par tous les moyens, appeler flush.
Juste une remarque lors de l'utilisation de lecteurs/enregistreurs, si vous allez utiliser une constante ouvrir le socket de transmettre des données en arrière, je voudrais enregistrer une référence locale à la fois le lecteur et l'écrivain objets une fois qu'ils sont créés. J'ai été de les créer à chaque fois mais de référencement sur le même socket et avait une énorme fuite de mémoire. Mise à jour de n'en créer sur socket modifier et de réutiliser les objets, la fuite est allé. J'ai trouvé ce post suite à une fuite de mémoire et cela l'a aidé à le résoudre.
OriginalL'auteur
@Eddie dit (secondes avant moi! 🙂 ), la fermeture de l'auteur et/ou le lecteur va fermer le socket sous-jacente flux et la douille elle-même:
Cependant, je crois que le support lui-même ne sera pas fermé.Vous ne fermez pas l'auteur ni le lecteur. Juste rincer l'écrivain à assurez-vous que vos messages arrivent dans le temps. La fermeture de la socket, plus tard, sur la volonté de fermer le flux respectifs, de sorte que vous n'avez pas besoin de les fermer vous-même. Il suffit de laisser votre lecteur/graveur objets de la GC.
OriginalL'auteur
Une autre alternative est de vous créer un NoCloseInputStream et NoCloseOutputStream filtres qui tout simplement ne rien faire sur fermer, puis les utiliser pour envelopper votre demande de prise de cours d'eau (avant toute application wrappering comme un tampon).
Noter que si vous le faites, vous aurez besoin de garder une référence à la prise (ou la enveloppé cours d'eau), de sorte que vous pouvez fermer le socket lorsque vous êtes vraiment en finir avec ça.
Pour répondre à la remarque que c'est "trop avancé un concept pour l'OP": Le cas des OP problème, c'est que la fermeture du haut niveau de flux, il est également la fermeture de la socket sous-jacente, mais ce n'est pas bon car il veut créer un plus haut niveau les cours d'eau de la prise d'envoyer d'autres messages. En fonction de son architecture, le seul moyen d'y parvenir peut-être à encapsuler le flux NoClose wrappers - par exemple il peut être en train de passer le flux XML sérialiseur ou deserializer qui ferme le flux quand c'est fait, ce qui est proche en dehors de son contrôle.
Au lieu de faire quelque chose avec NoCloseInputStream, pourquoi ne pas simplement vider le flux et le laisser ouvert jusqu'à ce que le temps lorsque vous avez besoin de fermer la socket sous-jacente?
Parce que, comme je l'ai dit et, entre autres choses, de certains mal conçu bibliothèques, tels que le XML de mise en œuvre intégré dans Java, fermez tous les flux de donnée sans réserve. Vous pouvez aussi plusieurs couches de wrappering et à être en mesure de fermer la totalité de ceux-ci jusqu'à ce que le socle de continuer à utiliser le socket, mais pas les papiers d'emballage. Comme je l'ai dit, "une Autre alternative est de..."
OriginalL'auteur
Vous avez besoin de fermer le socket après la fermeture du flux.
Pas, selon Oracle: docs.oracle.com/javase/tutorial/networking/sockets/...
OriginalL'auteur