2012-04-15 1 views
1

J'ai un cas où le client après avoir établi une connexion avec le serveur, reçoit un fichier et quand la même connexion a été utilisée (persistant), je reçois l'erreur mentionnée ci-dessus. est sous le code mis en œuvre:Abandon de la connexion causée par le logiciel: erreur d'écriture socket

Scanner in = new Scanner(file); 

this.clientSocket = new Socket(this.host,this.port); 

this.os = new DataOutputStream(this.clientSocket.getOutputStream()); 

this.is = this.clientSocket.getInputStream(); 

while(in.hasNextLine()){ 
    newFile = in.nextLine(); 
    System.out.println(newFile); 

    this.os.writeBytes(newFile + '\n'); 
    this.os.flush(); 
    scanFileList(); 
    writeFile(); 

} 

et la mise en œuvre du côté serveur est:

final class HttpRequest implements Runnable { 
    final static String CRLF = "\r\n"; 
    Socket socket; 
    static String dir; 
    BufferedOutputStream outToClient = null; 
    // Constructor 
    public HttpRequest(Socket socket) throws Exception { 
     this.socket = socket; 
     dir = "C:\\Users\\"; 
} 


     // Implement the run() method of the Runnable interface. 
public void run() { 
    try { 

     // Get a reference to the socket's input and output streams. 
     InputStream is = socket.getInputStream(); 
     outToClient = new BufferedOutputStream(socket.getOutputStream()); 
     processRequest(is,outToClient); 
     } catch (Exception e) { 
       System.out.println(e); 
     } 
} 

private void processRequest(InputStream is,BufferedOutputStream os) throws Exception { 

    // Set up input stream filters. 
    BufferedReader br = new BufferedReader(new InputStreamReader(is)); 

    // Get the request line of the HTTP request message. 
    String fileName = br.readLine(); 



    // Prepend a "." so that file request is within the current directory. 
    System.out.println(fileName); 
    // Open the requested file. 
    File myFile = null ; 

    boolean fileExists = true ; 

    myFile = new File(dir + fileName); 

    FileInputStream fis = null ; 
    try { 
     fis = new FileInputStream(dir + fileName); 
     System.out.println(fis); 
    } catch (FileNotFoundException e) { 
     fileExists = false ; 
    } 

    // Debug info for private use 
    System.out.println("Incoming!!!"); 


    // Send the entity body. 
    if (fileExists) { 
    sendBytes(myFile, os); 
    //fis.close(); 
    } 
    // Close streams and socket. 
    is.close(); 
    os.close(); 
    br.close(); 
    socket.close(); 
    } 

    private static void sendBytes(File myFile, 
    BufferedOutputStream os) throws Exception { 
     // Construct a 1K buffer to hold bytes on their way to the socket. 
     byte[] mybytearray = new byte[(int) myFile.length()]; 


     FileInputStream fis = null; 
     // Copy requested file into the socket's output stream. 
     try { 
      fis = new FileInputStream(myFile); 
     } catch (FileNotFoundException ex) { 
      // Do exception handling 
     } 
     BufferedInputStream bis = new BufferedInputStream(fis); 

     try { 
      bis.read(mybytearray, 0, mybytearray.length); 
      os.write(mybytearray, 0, mybytearray.length); 
      os.flush(); 

      // File sent, exit the main method 
      return; 
     } catch (IOException ex) { 
     // Do exception handling 
      } 
     } 

    } 

L'erreur se produit lorsque le programme sur le côté client tente d'écrire sur le serveur via: this.os. writebytes (nouveau fichier +/n);

Testfile01.bmp 

    writing 

    saved 

    Testfile02.bmp 

Exception in thread "main" java.net.SocketException: Socket closed 
at java.net.SocketOutputStream.socketWrite(Unknown Source) 
at java.net.SocketOutputStream.write(Unknown Source) 
at java.io.DataOutputStream.writeBytes(Unknown Source) 
at TCPClientPersistentNp.openSocket(TCPClientPersistentNp.java:53) 
at TCPClient.main(TCPClient.java:66) 
+1

Quelle est votre question? –

+0

Pourquoi est-ce que je ne peux pas envoyer de requête au serveur pour la deuxième exécution dans la boucle je reçois seulement un fichier. Et puis finir par obtenir cette erreur. – DesperateLearner

+0

duplication possible de [Abandon de la connexion causée par le logiciel: erreur d'écriture du socket] (http://stackoverflow.com/questions/10157669/software-caused-connection-abort-socket-write-error) – Mat

Répondre

1

Je ne vais pas essayer de lire votre code en détail (voir commentaire ci-dessus ...), mais il y a clairement quelque chose de très étrange/faux à ce sujet. En d'autres termes, si vous voulez parler à un serveur basé sur HTTP, vous ne pouvez pas simplement ouvrir un socket et écrire des choses. Votre client doit créer des requêtes HTTP bien formées et traiter les réponses HTTP qui reviennent.

L'exception côté client se produit car le côté serveur ... en fait VOTRE CODE ... a fermé la connexion à l'autre extrémité.

+0

Bonjour Stephen, j'ai formaté le code. Merci pour l'aide. Je vois l'erreur. Je ferme par défaut la socket sans vérifier le type de connexion. Est-ce vrai? – DesperateLearner

+0

Le problème est que vous fermez la connexion. Et je ne vois pas pourquoi vous avez appelé ce HTTP, car il ne ressemble en rien au vrai protocole HTTP. –

1

Qu'est-ce que cela fait dans votre code?

is.close(); 
os.close(); 
br.close(); 
socket.close(); 

Vous fermez tout explicitement après avoir traité chaque requête? Et c'est, vous dites, une mise en œuvre de la connexion persistante?

Questions connexes