Как правильно отправить имя файла, который мне нужен для получения GET через GET-метод на локальный сервер? - PullRequest
0 голосов
/ 19 декабря 2018

Я написал простой HTTP-сервер и клиент.Мне нужно реализовать простой GET-метод и передать имя файла, которое я хочу напечатать на своей странице сервера и в моей консоли.Я написал это, но это не работает.

Я передаю строку на сервер, который затем анализирует сервер, пытаюсь выяснить имя файла.Я использовал substring.У меня есть простая html-страница под названием «site.html», которую мне нужно распечатать.

public class Client {
     public static void main(String[] args) throws IOException{
        System.out.println("Enter IP and port: ");

        Scanner in = new Scanner(System.in);
        String ip = in.next();

        int port = in.nextInt();
        System.out.println("Enter name of the file");
        String name_of_File = in.next();

        System.out.println(name_of_File);       //no usage

        Socket clientSocket = new Socket(InetAddress.getByName(ip), port);
        Client client = new Client(clientSocket);

        client.writeOutputStream(name_of_File);
        client.readInputStream();
    }

    private Socket socket;
    private InputStream inputStream;
    private OutputStream outputStream;

    public Client(Socket socket) throws IOException {
        this.socket = socket;
        this.inputStream = socket.getInputStream();
        this.outputStream = socket.getOutputStream();
    }

    public void writeOutputStream(String fileName) throws IOException {             //getter
        String getter = "GET / HTTP/1.1\n" +"File: " + fileName + ":"+"\n\n";
        outputStream.write(getter.getBytes());
        outputStream.flush();

    }

    public void readInputStream() throws IOException {      //console output from server
        Scanner scan = new Scanner(inputStream);
        String str;
        while (scan.hasNextLine()){
            str = scan.nextLine();
            System.out.println(str);
        }

    }
}

И СЕРВЕР ЗДЕСЬ

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8080);

        while (true) {
            System.out.println("Waiting for a client connection...");

            Socket clientSocket = serverSocket.accept();
            Server server = new Server(clientSocket);
            System.out.println("Client has connected successfully");
            server.readInputStream();
            server.writeOutputStream();
            server.clientSocket.close();
        }
    }
    public Socket clientSocket;
    private InputStream inputStream;
    private OutputStream outputStream;
    private String fileName;

    public Server(Socket clientSocket) throws IOException {
        this.clientSocket = clientSocket;
        this.inputStream = clientSocket.getInputStream();
        this.outputStream = clientSocket.getOutputStream();
       // this.fileName = "site.html";
    }

    public void readInputStream() throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
        StringBuilder sb = new StringBuilder();

        sb.append(in.readLine());       //first line is a method(GET-method here)
        while (in.readLine() != null || in.readLine().trim().length() != 0) {
            String str = in.readLine();
            sb.append(str);
            if(str.contains(".html")) {
                fileName = str.substring(str.indexOf("File:") + 5, str.length() - str.lastIndexOf("html") + 4);
                System.out.println(fileName);
            }
        }

    }
    //String name_of_File = in.findInLine(Pattern.compile(".....html"));
    public void writeOutputStream() throws IOException {
        File file = new File(fileName);

        if (file.exists()) {        //reading "site.html"
            String s = new String(Files.readAllBytes(Paths.get(fileName)));
            String response = "HTTP/1.1 200 OK\n" +
                    "Type: text/html\n" +
                    "Length: " + s.length() + "\n" +
                    "Closing connection\n\n" + s;
            outputStream.write(response.getBytes());
            outputStream.flush();
        }
        else {
            outputStream.write("<html><h2>404:file not found</h2></html>".getBytes());
            outputStream.flush();
        }

    }
}

Я ожидал увидеть распечатанную страницу, но это не такне бывает.

1 Ответ

0 голосов
/ 19 декабря 2018

Проблема в методе readLine () на вашем сервере, в методе readInputStream ().Он не читает после символа новой строки (\n) в вашей строке после «HTTP / 1.1 \ n».

Здесь я изменил ваш код для метода readInputStream().Я использую метод read(), и я также изменил индексы подстроки.До этого ваш код пытался отобразить подстроку в start index: 21 и end index: 8, потому что вы вычитали конечный индекс из длины строки.Модифицированный метод:

public void readInputStream() throws IOException {
    BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
    StringBuilder sb = new StringBuilder();
    int i;
    // read the inputStream character by character
    while ((i = in.read()) != -1) {
        char ch = (char)i;
        String str = Character.toString(ch);
        sb.append(str);
        str = sb.toString();
        if(str.contains(".html")) {
            // modified substring indices
            fileName = str.substring(str.indexOf("File:") + 6, str.lastIndexOf("html") + 4);
            System.out.println("\n"+fileName);
            break;
        }
    }
}

Выход на стороне SERVER выглядит так:

Waiting for a client connection...
Client has connected successfully
Entered the readInputStream() method.

site.html
Waiting for a client connection...

Выход на стороне CLIENT выглядит так:

Enter IP and port: 
127.0.0.1
8080
Enter name of the file
site.html
GET / HTTP/1.1
File: site.html:


<html><h2>404:file not found</h2></html>

Process finished with exit code 0

Путь к файлу должен работать в вашей системе, если он создан в правильном месте.

Вы также можете взглянуть на этот ответ здесь , который предлагает использовать read () вместо этого, чтобы читать вашу строку символ за символом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...