Написать ответ сервера в браузер: Java - PullRequest
2 голосов
/ 20 октября 2011

У меня есть простая программа сервера HTML, которая прослушивает порт 8000 для запроса.Я хочу иметь возможность запросить файл HTML из серверной программы и отправить запрашиваемый HTML обратно в браузер.В настоящее время сервер получает запрос и анализирует запрашиваемое имя файла из запроса и даже выводит содержимое html-файла на консоль.Однако, когда я пытаюсь распечатать содержимое HTML-файла в сокет соединения (обратно в браузер), ничего не происходит;браузер просто продолжает загружаться.

Мой класс сервера относительно прост и просто создает экземпляры этого исполняемого класса RequestHandler для каждого соединения:

package server;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class RequestHandler extends Thread {

    Object block;
    ServerSocket serverSocket;
    BufferedReader socketReader;
    PrintWriter socketWriter;

    public RequestHandler(Object block, ServerSocket serverSocket){
        this.block = block;
        this.serverSocket = serverSocket;
    }

    @Override
    public void run() {
        try{
            System.out.println("Waiting for request...");
            Socket clientSocket = serverSocket.accept();
            System.out.println("Connection made.");

            synchronized(block){
                System.out.print("Notifying server thread...");
                block.notify();
                System.out.println("...done");
                System.out.println();
            }

            socketReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));            
            socketWriter = new PrintWriter(clientSocket.getOutputStream(), true);

            String input;
            while((input = socketReader.readLine()) != null){
//              System.out.println(input);

                if(input.startsWith("GET")){
                    getResource(input);
                }
            }
        }catch(IOException e){
            System.out.println("IOException!");
            e.printStackTrace();
        }
    }

    public void getResource(String getRequest){
        String[] parts = getRequest.split("\\s+");
        String filename = parts[1].substring(1);

        System.out.println(filename);
        File resource = new File(filename);             
        sendResponse(resource);
    }

    public void sendResponse(File resource){
        System.out.println(resource.getAbsolutePath());

        Scanner fileReader;
        try {
            fileReader = new Scanner(resource);

            while(fileReader.hasNext()){
                String line = fileReader.nextLine();
                System.out.println(line);
                socketWriter.println(line);
            }
        } catch (FileNotFoundException e) {
            System.out.println("File not found!");
            e.printStackTrace();
        }
    }

}

1 Ответ

3 голосов
/ 20 октября 2011

Что вы всегда должны делать, когда заканчиваете писать или читать из потока? (Я знаю ответ на ваш вопрос, но я задаю этот вопрос, потому что вы пометили свой вопрос как «домашнюю работу»)

...