title: Adding authentication for an ftp server
body: <p>Hey im working on a project regarding using socket programming to design an ftp server-client application this is the code so far . What i need to do is add authenticity , i want users to be able to access certain files with a username and password and im really clueless D: </p>
  
  <p>FileServer        </p>
  
  <pre><code>  public class FileServer {
  
  private static ServerSocket serverSocket;
  private static Socket clientSocket = null;
  
  public static void main(String[] args) throws IOException {
  
      try {
          serverSocket = new ServerSocket(4444);
          System.out.println("Server started.");
      } catch (Exception e) {
          System.err.println("Port already in use.");
          System.exit(1);
      }
  
      while (true) {
          try {
              clientSocket = serverSocket.accept();
              System.out.println("Accepted connection : " + clientSocket);
  
              Thread t = new Thread(new CLIENTConnection(clientSocket));
  
              t.start();
  
          } catch (Exception e) {
              System.err.println("Error in connection attempt.");
          }
      }
  }
    }
  </code></pre>
  
  <p>Clientconnection</p>
  
  <pre><code>  public class CLIENTConnection implements Runnable {
  
    private Socket clientSocket;
    private BufferedReader in = null;
  
    public CLIENTConnection(Socket client) {
      this.clientSocket = client;
  }
  
  @Override
  public void run() {
      try {
          in = new BufferedReader(new InputStreamReader(
                  clientSocket.getInputStream()));
          String clientSelection;
          while ((clientSelection = in.readLine()) != null) {
              switch (clientSelection) {
                  case "1":
                      receiveFile();
                      break;
                  case "2":
                      String outGoingFileName;
                      while ((outGoingFileName = in.readLine()) != null) {
                          sendFile(outGoingFileName);
                      }
  
                      break;
                  default:
                      System.out.println("Incorrect command received.");
                      break;
              }
              in.close();
              break;
          }
  
      } catch (IOException ex) {
          Logger.getLogger(CLIENTConnection.class.getName()).log(Level.SEVERE, null, ex);
      }
  }
  
  public void receiveFile() {
      try {
          int bytesRead;
  
          DataInputStream clientData = new DataInputStream(clientSocket.getInputStream());
  
          String fileName = clientData.readUTF();
          OutputStream output = new FileOutputStream(("received_from_client_" + fileName));
          long size = clientData.readLong();
          byte[] buffer = new byte[1024];
          while (size &gt; 0 &amp;&amp; (bytesRead = clientData.read(buffer, 0, (int) Math.min(buffer.length, size))) != -1) {
              output.write(buffer, 0, bytesRead);
              size -= bytesRead;
          }
  
          output.close();
          clientData.close();
  
          System.out.println("File "+fileName+" received from client.");
      } catch (IOException ex) {
          System.err.println("Client error. Connection closed.");
      }
  }
  
  public void sendFile(String fileName) {
      try {
          //handle file read
          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);
  
          DataInputStream dis = new DataInputStream(bis);
          dis.readFully(mybytearray, 0, mybytearray.length);
  
          //handle file send over socket
          OutputStream os = clientSocket.getOutputStream();
  
          //Sending file name and file size to the server
          DataOutputStream dos = new DataOutputStream(os);
          dos.writeUTF(myFile.getName());
          dos.writeLong(mybytearray.length);
          dos.write(mybytearray, 0, mybytearray.length);
          dos.flush();
          System.out.println("File "+fileName+" sent to client.");
      } catch (Exception e) {
          System.err.println("File does not exist!");
      } 
  }
  </code></pre>
  
  <p>}  </p>
  
  <p>FileClient</p>
  
  <pre><code>      public class FileClient {
  
     private static Socket sock;
     private static String fileName;
    private static BufferedReader stdin;
   private static PrintStream os;
  
  public static void main(String[] args) throws IOException {
      try {
          sock = new Socket("localhost", 4444);
          stdin = new BufferedReader(new InputStreamReader(System.in));
      } catch (Exception e) {
          System.err.println("Cannot connect to the server, try again later.");
          System.exit(1);
      }
  
      os = new PrintStream(sock.getOutputStream());
  
      try {
            switch (Integer.parseInt(selectAction())) {
          case 1:
              os.println("1");
              sendFile();
              break;
          case 2:
              os.println("2");
              System.err.print("Enter file name: ");
              fileName = stdin.readLine();
              os.println(fileName);
              receiveFile(fileName);
              break;
      }
      } catch (Exception e) {
          System.err.println("not valid input");
      }
  
  
      sock.close();
  }
  
  public static String selectAction() throws IOException {
      System.out.println("1. Send file.");
      System.out.println("2. Recieve file.");
      System.out.print("\nMake selection: ");
  
      return stdin.readLine();
  }
  
  public static void sendFile() {
      try {
          System.err.print("Enter file name: ");
          fileName = stdin.readLine();
  
          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);
  
          DataInputStream dis = new DataInputStream(bis);
          dis.readFully(mybytearray, 0, mybytearray.length);
  
          OutputStream os = sock.getOutputStream();
  
          //Sending file name and file size to the server
          DataOutputStream dos = new DataOutputStream(os);
          dos.writeUTF(myFile.getName());
          dos.writeLong(mybytearray.length);
          dos.write(mybytearray, 0, mybytearray.length);
          dos.flush();
          System.out.println("File "+fileName+" sent to Server.");
      } catch (Exception e) {
          System.err.println("File does not exist!");
      }
  }
  
  public static void receiveFile(String fileName) {
      try {
          int bytesRead;
          InputStream in = sock.getInputStream();
  
          DataInputStream clientData = new DataInputStream(in);
  
          fileName = clientData.readUTF();
          OutputStream output = new FileOutputStream(("received_from_server_" + fileName));
          long size = clientData.readLong();
          byte[] buffer = new byte[1024];
          while (size &gt; 0 &amp;&amp; (bytesRead = clientData.read(buffer, 0, (int) Math.min(buffer.length, size))) != -1) {
              output.write(buffer, 0, bytesRead);
              size -= bytesRead;
          }
  
          output.close();
          in.close();
  
          System.out.println("File "+fileName+" received from Server.");
      } catch (IOException ex) {
          Logger.getLogger(CLIENTConnection.class.getName()).log(Level.SEVERE, null, ex);
      }
  }
  }
  </code></pre>