为ftp服务器添加身份验证

时间:2014-12-21 20:51:36

标签: java multithreading authentication ftp

嘿我正在研究一个关于使用套接字编程来设计ftp服务器 - 客户端应用程序的项目,这是迄今为止的代码。我需要做的是添加真实性,我希望用户能够使用用户名和密码访问某些文件,我真的很无能D:

FileServer

  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.");
        }
    }
}
  }

Clientconnection

  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 > 0 && (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!");
    } 
}

}

FileClient

      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 > 0 && (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);
    }
}
}

0 个答案:

没有答案