Java HTTP服务器不工作

Java HTTP服务器不工作,java,http,Java,Http,我在家里主持一个网页。我使用Java创建了自己的HTTP服务器。这是一个SSCCE: if(command.startsWith("GET")) { //client is a socket on which I reply. PrintWriter pw = new PrintWriter(client.getOutputStream(), true); String commule = command.split(" "); i

我在家里主持一个网页。我使用Java创建了自己的HTTP服务器。这是一个SSCCE:

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.");
    }
}
if(command.startsWith(“GET”))
{
//客户机是一个套接字,我在其上进行回复。
PrintWriter pw=新的PrintWriter(client.getOutputStream(),true);
字符串逗号=command.split(“”);
if(逗号[0].equals(“GET”))
{
if(逗号[1]。包含(“.”)
{
File File=new File(GEQO_SERVER_ROOT+commule[1]。子字符串(1).replaceAll(“%20”和“);
if(file.exists())
{
OutputStream out=client.getOutputStream();
InputStream=新文件InputStream(文件);
字符串响应=新字符串();
响应+=“HTTP/1.1 200正常\r\n”;
响应+=“日期:2013年8月8日星期四08:49:37 GMT\r\n”;
响应+=“内容类型:text/html\r\n”;
响应+=“内容长度:”+file.Length()+“\r\n”;
响应+=“连接:保持活动\r\n”;
响应+=“\r\n”;
write(response);//假设我已经将pw初始化为PrintWriter
pw.flush();
复制(流式输出);
stream.close();
out.close();
}
其他的
{
写(“请求404ed”);
write(“在此服务器上找不到请求的URL”+逗号[1]+”);
pw.flush();
}
}
其他的
{
BufferedReader br=新的BufferedReader(新的文件阅读器(GEQO_服务器_根+逗号[1]。子字符串(1)+“main.html”);
弦电流线;
而((sCurrentLine=br.readLine())!=null)
{
打印(当前行);
}
br.close();
}
}
其他的
{
println(“无法识别的HTTP命令”);
}
}
这是main.html的源代码:


Geqo服务器

Geqo服务器在线运行

问题是,当我尝试使用Chrome访问此页面时,它会正确显示(至少在使用127.0.0.1时)。但是,当我尝试在127.0.0.1的Firefox上访问它时,它工作了,但只提供了html源代码。IE也只给了我来源。有人能告诉我为什么Firefox和IE只显示源代码,而不解析它吗

我认为这包含了一些线索(Firebug截图):

我的源代码似乎是一个
标签。我不知道为什么,但这不是问题吗

nc 110.172.170.83 17416
GET /

<html><title>Geqo Server</title><body>Geqo server online and functioning!</body></html>
我把港口转寄了。这里是页面:
http://110.172.170.83:17416/
(很抱歉,Stackoverflow不允许数字链接。)

编辑:我发现了问题。但在我解释之前,感谢SSCCE,我用它与我的代码进行比较。这就是问题所在:第八行
if(逗号[1]。包含(“.”)的
if
语句导致代码跳过此处的大部分代码。在相应的
else
块中,甚至没有发送头的命令。谢谢你指出这一点


提前感谢。

缓冲可能存在一些潜在问题。您可以将部分输出写入
PrintWriter
包装器,然后将其他输出直接写入
out
。我肯定会在
pw.write()
调用之后添加对
pw.flush()
的调用。

您不会发送任何响应头


我在您的源代码中找不到
pw
的定义?

您的printwriter没有刷新(正如Ernest指出的),因此没有发送HTTP头。看看直接连接的结果——它只返回原始数据,没有标题

new PrintWriter(client.getOutputStream(), true)
nc 110.172.170.83 17416
得到/
Geqo服务器Geqo服务器在线且正常运行!
编写HTTP服务器是一项艰巨的工作。除非是为了练习,否则应该使用轻量级的现有服务器,如Jetty或JDK中内置的Sun HTTP服务器


编辑-A
PrintWriter
确实不适合执行HTTP。它被设计用来处理逐行数据,比如写入磁盘的文件。它还取决于特定于平台的文本编码和行尾设置。有关正确的HTTP服务器应该如何工作的更多详细信息,请查看。

您使用第二个参数启用了
autoFlush

pw.write(response);

与PrintStream类不同,如果启用了自动刷新,则仅在调用println、printf或format方法之一时,而不是在输出换行符时,才会执行自动刷新。这些方法使用平台自己的行分隔符概念,而不是换行符

因此,基本上您的
pw.write()
没有刷新到输出流。所以你所需要做的就是更换

pw.println(response);


看起来很好。可能是由于
\r\n
的标题在您的操作系统平台上不正确,Chrome做出了一些假设。我不这么认为。我在Windows7上,而且它在Chrome上工作。在Firefox中使用firebug,google.com的响应内容类型是
text/html;charset=UTF-8
,尝试添加该字符集,以查看发生了什么。尝试仅在标题中使用
200
进行响应。同时将日期固定为:
“日期:”+new Date()
:d之后有一条注释说明它已初始化。请检查这个问题,是我的错。不过,看看PrintWriter是如何初始化的还是不错的。是的,这只是一个练习。:)+事实上,我也试过了。我不相信你加入了我建议的“同花顺”电话!检查更新的代码。我加了同花顺。如果您现在尝试连接到我的IP,您可以看到结果。我脸红了,是的,你的解决方案包含了答案,我只是没注意到。请检查我更新的问题。我创建了一个