title: Requesting specific file from a server via socket in java
body: <p>I found some code that transfers files between a client and a server. But the file location and port numbers are hard coded. I was wondering if there is a way in which a client can specify what file s/he needs from the server - so that when the server receives the request, it can send that particular file to the client. Thank you.</p>
  
  <hr>
  
  <p>Edit [1]: Code snippet and context description:</p>
  
  <p>I am adding the code I have so far, based on the feedbacks and comments. Hopefully, this answers some questions in the comment section. </p>
  
  <pre><code>import java.net.*;
  import java.io.*;
  import java.util.logging.Level;
  import java.util.logging.Logger;
  
  /**
   * Original coder adapted from:
   * http://www.rgagnon.com/javadetails/java-0542.html
   *
   * Best intentions:
   * This program runs both as server and client.
   * 
   * The client asks for a specific file from _
   * the server x number of times in a loop.
   * 
   * Server simply serves the file requested.
   */
  
  public class FileServer extends Thread {
  
      public static void server() throws IOException {
          ServerSocket servsock = new ServerSocket(13267);
          while (true) {
              System.out.println("Waiting...");
  
              Socket sock = servsock.accept();
              System.out.println("Accepted connection : " + sock);
  
              //Retrieve filename to serve
              InputStream is = sock.getInputStream();
              BufferedReader bfr = new BufferedReader(new InputStreamReader(is));
              String fileName = bfr.readLine();
              bfr.close();
  
              System.out.println("Server side got the file name:" + fileName);
  
              //Sendfile
              File myFile = new File(fileName);
              byte[] mybytearray = new byte[(int) myFile.length()];
              FileInputStream fis = new FileInputStream(myFile);
              BufferedInputStream bis = new BufferedInputStream(fis);
              bis.read(mybytearray, 0, mybytearray.length);
              OutputStream os = sock.getOutputStream();
              System.out.println("Sending...");
              os.write(mybytearray, 0, mybytearray.length);
              os.flush();
              sock.close();
          }
      }
  
      public static void client(int index) throws IOException {
          int filesize = 6022386; // filesize temporary hardcoded
  
          long start = System.currentTimeMillis();
          int bytesRead;
          int current = 0;
          //Localhost for testing
          Socket sock = new Socket("127.0.0.1", 13267);
  
          System.out.println("Connecting...");
  
          //Ask for specific file: source1
          String fileName = "source1";
          OutputStream os = sock.getOutputStream();
          PrintWriter pw = new PrintWriter(os);
          pw.println(fileName);
  
  
          //Receive file
          byte[] mybytearray = new byte[filesize];
          InputStream is = sock.getInputStream();
          FileOutputStream fos = new FileOutputStream("source1-copy" + index);
          BufferedOutputStream bos = new BufferedOutputStream(fos);
          bytesRead = is.read(mybytearray, 0, mybytearray.length);
          current = bytesRead;
  
          // thanks to A. Cádiz for the bug fix
          do {
              bytesRead =
                      is.read(mybytearray, 
                              current, (mybytearray.length - current));
              if (bytesRead &gt;= 0) {
                  current += bytesRead;
              }
          } while (bytesRead &gt; -1);
  
          bos.write(mybytearray, 0, current);
          bos.flush();
  
          long end = System.currentTimeMillis();
          System.out.println(end - start);
          os.flush();
  
          bos.close();
          sock.close();
      }
  
      public static void main(String[] args) throws IOException {
  
          FileServer fs = new FileServer();
          fs.start();
          try {
              Thread.sleep(1000);
          } catch (InterruptedException ex) {
              Logger.getLogger(
                     FileServer.class.getName()).log(Level.SEVERE, null, ex);
          }
  
          for (int i = 0; i &lt; 5; i++) {
              client(i);
          }
  
      }
  
      @Override
      public void run() {
          try {
              server();
          } catch (IOException ex) {
              Logger.getLogger(
                     FileServer.class.getName()).log(Level.SEVERE, null, ex);
          }
      }
  }
  </code></pre>
  
  <p>When I run this code, it is getting stuck at "Connecting ..." line. Here is the output:</p>
  
  <blockquote>
    <p>Waiting...<br>
    Accepted connection : Socket[addr=/127.0.0.1,port=44939,localport=13267]<br>
    Connecting...</p>
  </blockquote>