Tôi đang lưu trữ một trang web từ nhà. Tôi đã tạo máy chủ HTTP của riêng mình bằng cách sử dụng Java. Đây là một SSCCE:Máy chủ Java HTTP không hoạt động
if(command.startsWith("GET"))
{
//client is a socket on which I reply.
PrintWriter pw = new PrintWriter(client.getOutputStream(), true);
String commule = command.split(" ");
if(commule[0].equals("GET"))
{
if(commule[1].contains("."))
{
File file = new File(GEQO_SERVER_ROOT + commule[1].substring(1).replaceAll("%20", " "));
if(file.exists())
{
OutputStream out = client.getOutputStream();
InputStream stream = new FileInputStream(file);
String response = new String();
response += "HTTP/1.1 200 OK\r\n";
response += "Date: Thu, 08 Aug 2013 08:49:37 GMT\r\n";
response += "Content-Type: text/html\r\n";
response += "Content-Length: " + file.length() + "\r\n";
response += "Connection: keep-alive\r\n";
response += "\r\n";
pw.write(response); //Assume I already initialized pw as a PrintWriter
pw.flush();
copy(stream, out);
stream.close();
out.close();
}
else
{
pw.write("<html><h1>The request 404ed.</h1>");
pw.write("<body>The requested URL <b>" + commule[1] + "</b> could not be found on this server.</body></html>");
pw.flush();
}
}
else
{
BufferedReader br = new BufferedReader(new FileReader(GEQO_SERVER_ROOT + commule[1].substring(1) + "main.html"));
String sCurrentLine;
while ((sCurrentLine = br.readLine()) != null)
{
pw.print(sCurrentLine);
}
br.close();
}
}
else
{
pw.println("Unrecognized HTTP command.");
}
}
Đây là nguồn gốc main.html:
<html>
<title>Geqo Server</title>
<body>Geqo server online and functioning!</body>
</html>
Vấn đề là khi tôi cố gắng truy cập trang này bằng Chrome, nó hiển thị chính xác (Ít nhất là khi sử dụng 127.0.0.1). Nhưng khi tôi thử truy cập nó trên Firefox trên 127.0.0.1, nó hoạt động, nhưng chỉ cho tôi nguồn html. IE cũng chỉ cung cấp cho tôi nguồn. Bất cứ ai có thể cho tôi biết tại sao Firefox và IE chỉ hiển thị nguồn, thay vì phân tích nó?
Tôi nghĩ rằng đây có chứa một số manh mối (Firebug ảnh chụp màn hình):
nguồn của tôi dường như được sắp tới trong một thẻ <pre>
. Tôi donno tại sao, nhưng không phải là loại vấn đề?
Tôi chuyển tiếp cổng. Dưới đây là các trang của trang: http://110.172.170.83:17416/
(Xin lỗi, Stackoverflow không cho phép liên kết số.)
EDIT: Tôi đã tìm thấy sự cố. Nhưng trước khi tôi giải thích, nhờ có Bart cho SSCCE, mà tôi đã sử dụng để so sánh với mã của tôi. Đây là vấn đề: Tuyên bố if
trên dòng thứ tám if(commule[1].contains("."))
làm cho mã bỏ qua hầu hết mã ở đây. Trong khối else
tương ứng, thậm chí không có lệnh để gửi tiêu đề. Cảm ơn artbristol vì đã chỉ ra điều đó.
Xin cảm ơn trước.
Có vẻ là tốt. Có thể là các tiêu đề không chính xác trên nền tảng hệ điều hành của bạn như đối với '\ r \ n' và Chrome đưa ra một số giả định. – PeterMmm
Tôi không nghĩ vậy. Tôi đang sử dụng Windows 7 và hơn nữa, nó hoạt động trên Chrome. – Hele
Sử dụng firebug trong Firefox, loại nội dung mà phản hồi có cho google.com là 'text/html; charset = UTF-8', hãy thử thêm bộ ký tự, chỉ để xem điều gì xảy ra – morgano