2010-02-05 3 views
3

J'écris un serveur basé sur socket sous Java. Un client s'y connecte (un navigateur Web) et le serveur renvoie un code html simple et définit un cookie pour reconnaître le prochain client se connecte à nouveau. J'utilise PrintStream pour écrire sur le socket, mais le flush ne fonctionne pas. La seule façon que je peux vider est d'utiliser shutdownoutput ou close et tous les deux ferment le flux socket. Mais je ne le veux pas parce que je suis en train de le lire/écrire plusieurs fois dans plusieurs endroits du code. Que peut faire? Impossible d'obtenir de l'aide des tags. J'ai également essayé d'autres classes d'écrivain tamponné, même problème.Java Socket OutputStream ne purge pas

+0

Pouvez-vous publier un exemple de code de votre serveur? – Kylar

+2

Ceci est vraiment ancien, mais pour la postérité, 'ps.flush()' est inutile car un flush se produit quand '" \ n "' est imprimé - c'est-à-dire 'println()' est appelé. De plus, dans 'SocketOutputStream', la méthode' flush() 'est de toute façon non-op. – Gray

Répondre

0

Je voudrais essayer d'appeler cette méthode au lieu de flush:

public boolean checkError() 
Returns: 
    True if and only if this stream has encountered an IOException other than InterruptedIOException, or the setError method has been invoked 

Voir si elle échoue pour une raison de faire la chasse d'eau (checkError appelle en interne affleurant et se souvient de l'état d'erreur). Il est également intéressant d'essayer de se connecter au serveur à l'aide de telnet et de voir si les données retournent immédiatement, ou d'écrire un simple programme de socket client java à vérifier (couper/coller un sur le net).

Il se peut que le navigateur ait décidé d'attendre délibérément plus d'entrées avant d'afficher votre code HTML (surtout si le code HTML n'est pas parfaitement formé). Je me souviens d'avoir moi-même eu ce problème par le passé.

4

Ah oui, sillyproblem, il suffit d'utiliser pstream.writeln (""); puisque breader.readLine() lit jusqu'à ce qu'il trouve le caractère '\ n'. alors write() ne fonctionnera pas.