web-dev-qa-db-fra.com

Pourquoi un "Java.net.SocketException: pipe cassée" va-t-il se produire?

J'ai écrit un programme de socket simple, cela fonctionne bien, mais mon ami utilise un outil d'analyse de port. Lorsqu'il numérise vers le port que j'utilise, il encaisse avec l'erreur "Java.net.SocketException: Broken pipe", que se passe-t-il? et comment le résoudre?

providerSocket = new ServerSocket(portNum);
connection = providerSocket.accept();
if (connection.getOutputStream() != null) {
    //this line crash!!!
    out = new ObjectOutputStream(connection.getOutputStream());
    out.flush();

}

Erreur de détail de la console:

Java.net.SocketException: Broken pipe
    at Java.net.SocketOutputStream.socketWrite0(Native Method)
    at Java.net.SocketOutputStream.socketWrite(SocketOutputStream.Java:92)
    at Java.net.SocketOutputStream.write(SocketOutputStream.Java:136)
    at Java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.Java:1847)
    at Java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.Java:1756)
    at Java.io.ObjectOutputStream.<init>(ObjectOutputStream.Java:230)
7
DNB5brims

Certains scanners de ports fonctionnent en commençant par ouvrir une connexion puis en y mettant immédiatement fin. Votre serveur n'est pas programmé pour traiter un échec de connexion car vous n'avez pas codé pour cette possibilité. Vous devrez utiliser un essai/attraper pour piéger cette condition et récupérer. De plus, vous devriez probablement transférer la connexion à un thread séparé pour le traitement, afin que votre programme principal puisse continuer à recevoir de nouvelles connexions (et les envoyer aux threads à gérer).

8
Jim Garrison

Je pense que cela se produit lorsque l'extrémité distante a fermé la connexion;

2

La raison de votre problème peut être ici:

JavaDoc:

La longueur maximale de la file d'attente pour les indications de connexion entrantes (demande de connexion) est définie sur 50. Si une indication de connexion arrive lorsque la file d'attente est saturée, la connexion est refusée.

Et vous devriez augmenter le paramètre "backlog" de votre ServerSocket, par exemple

int backlogSize = 50 ;
providerSocket = new ServerSocket(portNum, backlogSize);
0
TheSecond