2009-08-06 10 views
0

Je veux écrire un proxy web simple, pour l'exercice. Voici le code que j'ai jusqu'à présent:Socket client lu "se fige"


def g = new Proxy() 
g.serverPort = 9000 
println "starting" 
g.eachClient { Socket client -> 
    println "got a client" 
    try { 
     client.withStreams { input,output -> 
      String text = input.text 
      println "received $text from client" 
      client.close() 
     } 
    } catch(IOException io) { 
     println "IO error. Probably client disconnected" 
     //io.printStackTrace() 
    } 
} 

la chose est, la ligne:

String text = input.text

consume toutes les données disponibles dans InputStream du Socket. Si le client ne ferme pas la connexion, cette méthode attendra jusqu'à ce qu'il puisse lire un caractère de fin de fichier (si je me souviens bien). Que dois-je faire pour éviter que cela se produise et que la chaîne du client soit disponible dès que possible?

Répondre

2

Je pense que vous voudrez vérifier la documentation sur ObjectInputStream. Ne length = input.available pour obtenir le nombre d'octets disponibles à l'heure actuelle, puis utiliser input.read(buffer, offset, length) pour lire exactement autant d'octets sont disponibles. Vous souhaiterez probablement lancer un nouveau thread pour chaque nouvelle connexion qui gère ce buffer de manière transparente en arrière-plan, sauf si vous créez un proxy monothread pour commencer.

+0

Cela a fonctionné! Merci! Une autre question s'il vous plaît, comment Java sait combien d'octets sont disponibles? – Geo

+0

Il s'agit plus d'une question de la bibliothèque de socket du système d'exploitation sous-jacent, que Java résume pour vous. Vous pouvez voir un exemple de la façon de faire cela en utilisant C dans un système d'exploitation * nix ici: http://www.dholm.com/2008/05/13/available-socket-bytes/ –

Questions connexes