2010-08-25 10 views
15

J'essaie de lire des éléments d'une socket et je remarque que s'il n'y a rien sur le flux de la socket, il restera à la lecture et sauvegarder mon application. Je voulais savoir s'il y avait un moyen de définir un délai de lecture ou de mettre fin à la connexion après un certain laps de temps de rien dans le socket.Comment temporiser une lecture sur Java Socket?

Répondre

-6

Oui, il doit y avoir un remplacement de Read() qui accepte une valeur de délai d'expiration. En "override" je ne suggère personne écrire un, je souligne que l'un des substitutions des méthodes de socket qu'il utilise prend une valeur de délai.

+0

Et vous ne lisez pas directement à partir d'une socket de toute façon, vous obtenez un 'InputStream' de la socket, puis lisez à partir de cela. Faites ce que @erikson dit, utilisez 'setSoTimeout()'. – krock

+4

non il ne devrait pas. Cela rendrait l'API 'SocketInputStream' différente des autres flux. Il existe déjà un moyen de le faire qui ne rompt pas la substituabilité 'InputStream'. –

0

Si cette prise a été créé par un URLConnection pour effectuer une requête Web, vous pouvez régler la lecture et connecter les délais d'attente directement sur la URLConnection avant de lire le flux:

InputStream createInputStreamForUriString(String uriString) throws IOException, URISyntaxException { 
    URLConnection in = new URL(uriString).openConnection(); 
    in.setConnectTimeout(5000); 
    in.setReadTimeout(5000); 
    in.setAllowUserInteraction(false); 
    in.setDoInput(true); 
    in.setDoOutput(false); 
    return in.getInputStream(); 
} 
+0

'setReadTimeout' ne provoquera une exception, si le délai expire * avant * la réception des premières données. Après la réception des premières données, aucune exception de dépassement de délai ne se produira même si la connexion se bloque à l'infini. – ooxi

+0

@ooxi C'est complètement faux. Le délai d'attente de lecture s'applique à chaque lecture, pas seulement au premier. – EJP