2009-06-11 4 views
3

J'ai un simple serveur mal comportés (écrit en Groovy)java/groovy socket délai d'attente d'écriture

ServerSocket ss = new ServerSocket(8889); 
Socket s = ss.accept() 
Thread.sleep(1000000) 

Et un client qui je veux avoir délai d'attente (car le serveur ne consomme pas son entrée)

Socket s = new Socket("192.168.0.106", 8889) 
s.setSoTimeout(100); 
s.getOutputStream.write(new byte[1000000]); 

Cependant, ce client bloque pour toujours. Comment puis-je faire patienter le client?

MERCI !!

Répondre

3

Vous pouvez générer le client dans son propre thread et verrouiller le verrou/wait (timeout long) pour le renvoyer. Éventuellement en utilisant un objet Future pour obtenir la valeur de retour si le Socket a réussi. Je crois que le paramètre SO_TIMEOUT pour un Socket effectue uniquement les appels en lecture (..) à partir du socket, pas l'écriture.

Vous pouvez essayer d'utiliser un SocketChannel (plutôt que Stream) et de générer un autre thread qui a également un handle à ce canal. L'autre thread peut fermer ce canal de manière asynchrone après un certain délai de blocage.

1

Le délai d'attente de socket est au niveau TCP, pas au niveau de l'application. La machine source TCP met en mémoire tampon les données à envoyer et la pile réseau de la machine cible accuse réception des données reçues, il n'y a donc pas de temporisation. En outre, différentes implémentations TCP/IP gèrent ces délais différemment. Jetez un oeil à ce qui se passe sur le fil avec tcpdump (ou wireshark si vous êtes si malheureux :) Ce dont vous avez besoin est ACK au niveau de l'application, c'est-à-dire que vous devez définir le protocole entre le client et le serveur. Je ne peux pas commenter sur les paquets Java (vous voulez probablement regarder nio), mais recevoir le délai d'attente sur ce ACK serait habituellement manipulé avec poll/select.

0

Il n'existe aucun moyen d'obtenir le délai d'attente, mais vous pouvez toujours générer un thread qui ferme la connexion si l'écriture n'est pas terminée.