[英]Printwriter not writing to outputStream
我正在尝试用Java实现基本的Web服务器。 当我将网络浏览器定向到127.0.0.1:8020/webpage.html时,服务器接收到请求标头,但是当它尝试将网页发送回时,它不会显示在浏览器上。
有人可以帮忙吗?
public class WebServer
{
public static void main(String[] args)
{
try
{
ExecutorService scheduler = Executors.newCachedThreadPool();
ServerSocket server = new ServerSocket(8020);
while (true)
{
Socket client = server.accept();
Runnable r = new HTTPThread(client.getInputStream(), client.getOutputStream());
scheduler.execute(r);
System.out.println("LOG: New Thread Created");
}
}
catch (IOException e)
{
System.out.println("ERROR: Cannot listen on socket");
e.printStackTrace();
}
}
}
public class HTTPThread implements Runnable {
InputStream in;
OutputStream out;
private String fileName;
private String fileLoc;
private static final String rootLoc = "C:\\Users\\myName\\workspace\\HTTPServer\\src\\";
HTTPThread(InputStream in, OutputStream out) {
this.in = in;
this.out = out;
}
public void run() {
try {
// show request headers and store http header
System.out.println("LOG: Preparing to read request");
String header = readInput(in);
System.out.println("LOG: Request read successfully!");
System.out.println(header);
// get file name from request header
fileLoc = rootLoc + header.substring(5, header.indexOf("H") - 1);
System.out.println(fileLoc);
PrintWriter writer = new PrintWriter(new OutputStreamWriter(out));
//send response header and body
writer.print("HTTP/1.0 200 OK\nContent-Type: text/html\n\n" + fileReader(fileLoc));
System.out.println("LOG: Response Sent");
out.close();
in.close();
}
catch (IOException e) {
System.out.println("ERROR: Could not listen on socket");
System.exit(-1);
}
}
//Returns content of webpage as a string (html)
public String fileReader(String file) {
StringBuilder text = new StringBuilder();
String NL = System.getProperty("line.separator");
Scanner scanner;
try {
scanner = new Scanner(new FileInputStream(file));
while (scanner.hasNextLine()) {
text.append(scanner.nextLine() + NL);
}
return text.toString();
} catch (FileNotFoundException e) {
System.out.println("ERROR: File Not Found");
System.exit(-1);
return null;
}
}
//Reads bytestream from client and returns a string
private String readInput(InputStream is) {
BufferedReader in = new BufferedReader(new InputStreamReader(is));
try
{
String current;
String header = "";
while (!(current = in.readLine()).isEmpty())
{
header += current + System.getProperty("line.separator");
}
return header;
}
catch (IOException e)
{
e.printStackTrace();
return null;
}
}
}
添加writer.close();
在out.close();
之前out.close();
会解决它。
http响应具有非常特定的格式。 该协议非常明确地说明了哪些字符将标题与内容分开。 您输入的字符错误。
作为附带说明,切勿在网络流顶部使用PrintWriter,因为它会隐藏IOExceptions(通常避免使用PrintWriter)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.