title: Software caused connection abort: socket write error
body: <p>I have a case where the client after establishing a connection with the server, receives one file and when the same connection was used ( persistent ) I end up getting this error mentioned above. 
  Below is the implemented code: </p>
  
  <pre><code>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();
  
   }
  </code></pre>
  
  <p>and the server side implementation is:</p>
  
  <pre><code> 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
             }
          }
  
     }
  </code></pre>
  
  <p>The error happens when the program on the client side tries to write to the server through: this.os.writebytes(newFile + /n);</p>
  
  <pre><code>  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)
  </code></pre>