【问题标题】:Write server response to browser : Java将服务器响应写入浏览器:Java
【发布时间】:2012-09-18 15:45:06
【问题描述】:

我有一个简单的 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();
        }
    }

}

【问题讨论】:

  • 您是否尝试过提供 HTTP 标头?这可能会有所帮助...
  • 您是如何通过浏览器拨打电话的? URI的格式是什么?

标签: java http browser httpresponse


【解决方案1】:

当您完成对流的写入或读取时,您应该怎么做? (我知道你的问题的答案,但我问这个问题是因为你将你的问题标记为“作业”)

【讨论】:

  • 如果他希望 HTML 被渲染而不只是作为文本打印,他还应该在内容之前写一些东西到套接字。阅读 RFC 或教科书可能会有所帮助。
  • 关闭它,感谢您提出我之前想到的建议,但我认为如果我关闭流,由于某种原因我无法继续收听更多请求。 @AlexGitelman 您指的是“HTTP/1.1 200 OK”状态行吗?
  • @AlexGitelman 如果您希望浏览器将响应呈现为 HTML 网页(而不仅仅是将 HTML 代码显示为纯文本),那么您必须在 HTTP 响应中添加标头:Content-type: text/html
  • 这正是我的观点。 @Chris 是对的,响应代码也必须编写。当您可以使用现有产品时,手动编写所有代码有点痛苦,但这必须是这里的功课。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
相关资源
最近更新 更多