Java Server-Client Connection reset












0















I have server and client applications running on my local machine.
Client takes file, changes it and sends to server, then server responds if the file is correct. Client does it multiple times, sending one file at a time.
I send two files from client and on the second file I get Connection reset



Server snippet:



private void initServer() throws IOException {
while (true) {
ServerSocket server = new ServerSocket(55555);
Socket fromclient = server.accept();

InputStream sin = fromclient.getInputStream();
OutputStream sout = fromclient.getOutputStream();

DataInputStream in = new DataInputStream(sin);
DataOutputStream out = new DataOutputStream(sout);

String line = in.readUTF();

if (line.equals("new file")) {
long fileSize = in.readLong();

tempSavedFile = new File("/home/evgeniy/Files/Downloads/temp");

tempSavedFile.createNewFile();
try (FileOutputStream fos = new FileOutputStream(tempSavedFile)) {
int t;
for (int i = 0; i < fileSize; i++) {
t = sin.read();
fos.write(t);
}
}

if (checkPadding(tempSavedFile)) {
out.writeInt(PADDING_OK_RESPONSE);
} else {
out.writeInt(PADDING_ERROR_RESPONSE);
}
out.flush();
}
out.close();
in.close();
sout.close();
sin.close();
fromclient.close();
server.close();
}
}


Client class that calls new thread in for loop



for (byte i = 0; i < 2; i++) {
Callable callable = new FileSender(tempFile);
FutureTask<Integer> ftask = new FutureTask<>(callable);
Thread thread = new Thread(ftask);
thread.start();

int response = 3244;
try {
response = ftask.get();
} catch (InterruptedException | ExecutionException ex) {
Logger.getLogger(FXMLController.class.getName()).log(Level.SEVERE, null, ex);
}
putMessage(String.valueOf(response));


Client Callable thread:



public Integer call() throws Exception {
Socket socket = new Socket(address, serverPort);
InputStream sin = socket.getInputStream();
OutputStream sout = socket.getOutputStream();
DataInputStream in = new DataInputStream(sin);
DataOutputStream out = new DataOutputStream(sout);

out.writeUTF("new file");
out.flush();

out.writeLong(file.length);
out.flush();

sout.write(file);
sout.flush();

System.out.println(socket.isConnected());
int response = in.readInt();
System.out.println("--------RESP="+response);

out.close();
in.close();
sin.close();
sout.close();
socket.close();
return response;
}


As you can see I send two files, and get this console output on client app:



true
--------RESP=200
true
ноя 20, 2018 5:16:36 PM com.evgeniy_mh.paddingoracle.FXMLController SendFileToServer
SEVERE: null
java.util.concurrent.ExecutionException: java.net.SocketException: Connection reset


Also, I don't understand why socket is ok, but



int response = in.readInt();


raising Connection reset exception.










share|improve this question



























    0















    I have server and client applications running on my local machine.
    Client takes file, changes it and sends to server, then server responds if the file is correct. Client does it multiple times, sending one file at a time.
    I send two files from client and on the second file I get Connection reset



    Server snippet:



    private void initServer() throws IOException {
    while (true) {
    ServerSocket server = new ServerSocket(55555);
    Socket fromclient = server.accept();

    InputStream sin = fromclient.getInputStream();
    OutputStream sout = fromclient.getOutputStream();

    DataInputStream in = new DataInputStream(sin);
    DataOutputStream out = new DataOutputStream(sout);

    String line = in.readUTF();

    if (line.equals("new file")) {
    long fileSize = in.readLong();

    tempSavedFile = new File("/home/evgeniy/Files/Downloads/temp");

    tempSavedFile.createNewFile();
    try (FileOutputStream fos = new FileOutputStream(tempSavedFile)) {
    int t;
    for (int i = 0; i < fileSize; i++) {
    t = sin.read();
    fos.write(t);
    }
    }

    if (checkPadding(tempSavedFile)) {
    out.writeInt(PADDING_OK_RESPONSE);
    } else {
    out.writeInt(PADDING_ERROR_RESPONSE);
    }
    out.flush();
    }
    out.close();
    in.close();
    sout.close();
    sin.close();
    fromclient.close();
    server.close();
    }
    }


    Client class that calls new thread in for loop



    for (byte i = 0; i < 2; i++) {
    Callable callable = new FileSender(tempFile);
    FutureTask<Integer> ftask = new FutureTask<>(callable);
    Thread thread = new Thread(ftask);
    thread.start();

    int response = 3244;
    try {
    response = ftask.get();
    } catch (InterruptedException | ExecutionException ex) {
    Logger.getLogger(FXMLController.class.getName()).log(Level.SEVERE, null, ex);
    }
    putMessage(String.valueOf(response));


    Client Callable thread:



    public Integer call() throws Exception {
    Socket socket = new Socket(address, serverPort);
    InputStream sin = socket.getInputStream();
    OutputStream sout = socket.getOutputStream();
    DataInputStream in = new DataInputStream(sin);
    DataOutputStream out = new DataOutputStream(sout);

    out.writeUTF("new file");
    out.flush();

    out.writeLong(file.length);
    out.flush();

    sout.write(file);
    sout.flush();

    System.out.println(socket.isConnected());
    int response = in.readInt();
    System.out.println("--------RESP="+response);

    out.close();
    in.close();
    sin.close();
    sout.close();
    socket.close();
    return response;
    }


    As you can see I send two files, and get this console output on client app:



    true
    --------RESP=200
    true
    ноя 20, 2018 5:16:36 PM com.evgeniy_mh.paddingoracle.FXMLController SendFileToServer
    SEVERE: null
    java.util.concurrent.ExecutionException: java.net.SocketException: Connection reset


    Also, I don't understand why socket is ok, but



    int response = in.readInt();


    raising Connection reset exception.










    share|improve this question

























      0












      0








      0








      I have server and client applications running on my local machine.
      Client takes file, changes it and sends to server, then server responds if the file is correct. Client does it multiple times, sending one file at a time.
      I send two files from client and on the second file I get Connection reset



      Server snippet:



      private void initServer() throws IOException {
      while (true) {
      ServerSocket server = new ServerSocket(55555);
      Socket fromclient = server.accept();

      InputStream sin = fromclient.getInputStream();
      OutputStream sout = fromclient.getOutputStream();

      DataInputStream in = new DataInputStream(sin);
      DataOutputStream out = new DataOutputStream(sout);

      String line = in.readUTF();

      if (line.equals("new file")) {
      long fileSize = in.readLong();

      tempSavedFile = new File("/home/evgeniy/Files/Downloads/temp");

      tempSavedFile.createNewFile();
      try (FileOutputStream fos = new FileOutputStream(tempSavedFile)) {
      int t;
      for (int i = 0; i < fileSize; i++) {
      t = sin.read();
      fos.write(t);
      }
      }

      if (checkPadding(tempSavedFile)) {
      out.writeInt(PADDING_OK_RESPONSE);
      } else {
      out.writeInt(PADDING_ERROR_RESPONSE);
      }
      out.flush();
      }
      out.close();
      in.close();
      sout.close();
      sin.close();
      fromclient.close();
      server.close();
      }
      }


      Client class that calls new thread in for loop



      for (byte i = 0; i < 2; i++) {
      Callable callable = new FileSender(tempFile);
      FutureTask<Integer> ftask = new FutureTask<>(callable);
      Thread thread = new Thread(ftask);
      thread.start();

      int response = 3244;
      try {
      response = ftask.get();
      } catch (InterruptedException | ExecutionException ex) {
      Logger.getLogger(FXMLController.class.getName()).log(Level.SEVERE, null, ex);
      }
      putMessage(String.valueOf(response));


      Client Callable thread:



      public Integer call() throws Exception {
      Socket socket = new Socket(address, serverPort);
      InputStream sin = socket.getInputStream();
      OutputStream sout = socket.getOutputStream();
      DataInputStream in = new DataInputStream(sin);
      DataOutputStream out = new DataOutputStream(sout);

      out.writeUTF("new file");
      out.flush();

      out.writeLong(file.length);
      out.flush();

      sout.write(file);
      sout.flush();

      System.out.println(socket.isConnected());
      int response = in.readInt();
      System.out.println("--------RESP="+response);

      out.close();
      in.close();
      sin.close();
      sout.close();
      socket.close();
      return response;
      }


      As you can see I send two files, and get this console output on client app:



      true
      --------RESP=200
      true
      ноя 20, 2018 5:16:36 PM com.evgeniy_mh.paddingoracle.FXMLController SendFileToServer
      SEVERE: null
      java.util.concurrent.ExecutionException: java.net.SocketException: Connection reset


      Also, I don't understand why socket is ok, but



      int response = in.readInt();


      raising Connection reset exception.










      share|improve this question














      I have server and client applications running on my local machine.
      Client takes file, changes it and sends to server, then server responds if the file is correct. Client does it multiple times, sending one file at a time.
      I send two files from client and on the second file I get Connection reset



      Server snippet:



      private void initServer() throws IOException {
      while (true) {
      ServerSocket server = new ServerSocket(55555);
      Socket fromclient = server.accept();

      InputStream sin = fromclient.getInputStream();
      OutputStream sout = fromclient.getOutputStream();

      DataInputStream in = new DataInputStream(sin);
      DataOutputStream out = new DataOutputStream(sout);

      String line = in.readUTF();

      if (line.equals("new file")) {
      long fileSize = in.readLong();

      tempSavedFile = new File("/home/evgeniy/Files/Downloads/temp");

      tempSavedFile.createNewFile();
      try (FileOutputStream fos = new FileOutputStream(tempSavedFile)) {
      int t;
      for (int i = 0; i < fileSize; i++) {
      t = sin.read();
      fos.write(t);
      }
      }

      if (checkPadding(tempSavedFile)) {
      out.writeInt(PADDING_OK_RESPONSE);
      } else {
      out.writeInt(PADDING_ERROR_RESPONSE);
      }
      out.flush();
      }
      out.close();
      in.close();
      sout.close();
      sin.close();
      fromclient.close();
      server.close();
      }
      }


      Client class that calls new thread in for loop



      for (byte i = 0; i < 2; i++) {
      Callable callable = new FileSender(tempFile);
      FutureTask<Integer> ftask = new FutureTask<>(callable);
      Thread thread = new Thread(ftask);
      thread.start();

      int response = 3244;
      try {
      response = ftask.get();
      } catch (InterruptedException | ExecutionException ex) {
      Logger.getLogger(FXMLController.class.getName()).log(Level.SEVERE, null, ex);
      }
      putMessage(String.valueOf(response));


      Client Callable thread:



      public Integer call() throws Exception {
      Socket socket = new Socket(address, serverPort);
      InputStream sin = socket.getInputStream();
      OutputStream sout = socket.getOutputStream();
      DataInputStream in = new DataInputStream(sin);
      DataOutputStream out = new DataOutputStream(sout);

      out.writeUTF("new file");
      out.flush();

      out.writeLong(file.length);
      out.flush();

      sout.write(file);
      sout.flush();

      System.out.println(socket.isConnected());
      int response = in.readInt();
      System.out.println("--------RESP="+response);

      out.close();
      in.close();
      sin.close();
      sout.close();
      socket.close();
      return response;
      }


      As you can see I send two files, and get this console output on client app:



      true
      --------RESP=200
      true
      ноя 20, 2018 5:16:36 PM com.evgeniy_mh.paddingoracle.FXMLController SendFileToServer
      SEVERE: null
      java.util.concurrent.ExecutionException: java.net.SocketException: Connection reset


      Also, I don't understand why socket is ok, but



      int response = in.readInt();


      raising Connection reset exception.







      java server connection client file-transfer






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 20 '18 at 14:50









      Evgeniy MhEvgeniy Mh

      31




      31
























          1 Answer
          1






          active

          oldest

          votes


















          0














          Your code creates a new ServerSocket and later closes the created server socket for every single request that it processes. The code does not use the same ServerSocket instance to serve multiple requests.




          The connection reset failure appears to be because of this, as when the second request is creating a socket connection with the server, the existing ServerSocket is closed and recreated on the same port leading to the connection being reset. For a start try taking out the ServerSocket creation outside the while loop.



          private void initServer() {
          try (ServerSocket server = new ServerSocket(5555)) {
          while (true) {
          Socket fromclient = server.accept();

          ... // remaining code

          fromclient.close();
          }
          } catch (IOException ioe) {
          // handle failures
          }
          }


          The try-with-resources handles the .close() call on the AutoCloseable server socket.





          Also, note that the requests would be processed serially on a single thread in your code. Usually the Socket obtained for a connection from the ServerSocket#accept() (or the streams derived from it) is passed to a separate thread for processing unlike your code that processes the requests serially.






          share|improve this answer
























          • Thank you Pranjal, your solution is rigth!

            – Evgeniy Mh
            Nov 21 '18 at 10:43











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53395606%2fjava-server-client-connection-reset%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          0














          Your code creates a new ServerSocket and later closes the created server socket for every single request that it processes. The code does not use the same ServerSocket instance to serve multiple requests.




          The connection reset failure appears to be because of this, as when the second request is creating a socket connection with the server, the existing ServerSocket is closed and recreated on the same port leading to the connection being reset. For a start try taking out the ServerSocket creation outside the while loop.



          private void initServer() {
          try (ServerSocket server = new ServerSocket(5555)) {
          while (true) {
          Socket fromclient = server.accept();

          ... // remaining code

          fromclient.close();
          }
          } catch (IOException ioe) {
          // handle failures
          }
          }


          The try-with-resources handles the .close() call on the AutoCloseable server socket.





          Also, note that the requests would be processed serially on a single thread in your code. Usually the Socket obtained for a connection from the ServerSocket#accept() (or the streams derived from it) is passed to a separate thread for processing unlike your code that processes the requests serially.






          share|improve this answer
























          • Thank you Pranjal, your solution is rigth!

            – Evgeniy Mh
            Nov 21 '18 at 10:43
















          0














          Your code creates a new ServerSocket and later closes the created server socket for every single request that it processes. The code does not use the same ServerSocket instance to serve multiple requests.




          The connection reset failure appears to be because of this, as when the second request is creating a socket connection with the server, the existing ServerSocket is closed and recreated on the same port leading to the connection being reset. For a start try taking out the ServerSocket creation outside the while loop.



          private void initServer() {
          try (ServerSocket server = new ServerSocket(5555)) {
          while (true) {
          Socket fromclient = server.accept();

          ... // remaining code

          fromclient.close();
          }
          } catch (IOException ioe) {
          // handle failures
          }
          }


          The try-with-resources handles the .close() call on the AutoCloseable server socket.





          Also, note that the requests would be processed serially on a single thread in your code. Usually the Socket obtained for a connection from the ServerSocket#accept() (or the streams derived from it) is passed to a separate thread for processing unlike your code that processes the requests serially.






          share|improve this answer
























          • Thank you Pranjal, your solution is rigth!

            – Evgeniy Mh
            Nov 21 '18 at 10:43














          0












          0








          0







          Your code creates a new ServerSocket and later closes the created server socket for every single request that it processes. The code does not use the same ServerSocket instance to serve multiple requests.




          The connection reset failure appears to be because of this, as when the second request is creating a socket connection with the server, the existing ServerSocket is closed and recreated on the same port leading to the connection being reset. For a start try taking out the ServerSocket creation outside the while loop.



          private void initServer() {
          try (ServerSocket server = new ServerSocket(5555)) {
          while (true) {
          Socket fromclient = server.accept();

          ... // remaining code

          fromclient.close();
          }
          } catch (IOException ioe) {
          // handle failures
          }
          }


          The try-with-resources handles the .close() call on the AutoCloseable server socket.





          Also, note that the requests would be processed serially on a single thread in your code. Usually the Socket obtained for a connection from the ServerSocket#accept() (or the streams derived from it) is passed to a separate thread for processing unlike your code that processes the requests serially.






          share|improve this answer













          Your code creates a new ServerSocket and later closes the created server socket for every single request that it processes. The code does not use the same ServerSocket instance to serve multiple requests.




          The connection reset failure appears to be because of this, as when the second request is creating a socket connection with the server, the existing ServerSocket is closed and recreated on the same port leading to the connection being reset. For a start try taking out the ServerSocket creation outside the while loop.



          private void initServer() {
          try (ServerSocket server = new ServerSocket(5555)) {
          while (true) {
          Socket fromclient = server.accept();

          ... // remaining code

          fromclient.close();
          }
          } catch (IOException ioe) {
          // handle failures
          }
          }


          The try-with-resources handles the .close() call on the AutoCloseable server socket.





          Also, note that the requests would be processed serially on a single thread in your code. Usually the Socket obtained for a connection from the ServerSocket#accept() (or the streams derived from it) is passed to a separate thread for processing unlike your code that processes the requests serially.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 20 '18 at 17:09









          PranjalPranjal

          1363




          1363













          • Thank you Pranjal, your solution is rigth!

            – Evgeniy Mh
            Nov 21 '18 at 10:43



















          • Thank you Pranjal, your solution is rigth!

            – Evgeniy Mh
            Nov 21 '18 at 10:43

















          Thank you Pranjal, your solution is rigth!

          – Evgeniy Mh
          Nov 21 '18 at 10:43





          Thank you Pranjal, your solution is rigth!

          – Evgeniy Mh
          Nov 21 '18 at 10:43


















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53395606%2fjava-server-client-connection-reset%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          The term 'EXEC' is not recognized as the name of a cmdlet Powershell

          NPM command prompt closes immediately [closed]

          Error binding properties and functions in emscripten