几个小时前,我已经开始学习java套接字通信。现在,我正在尝试使服务器应用程序惠奇应该将我的数据返回到Now浏览器。我的代码:
try{
ServerSocket socket = new ServerSocket(80);
Socket response = socket.accept();
String lol = "<html>hi</html>";
OutputStream str = response.getOutputStream();
str.write(lol.getBytes("US-ASCII"));
str.flush();
response.close();
System.out.println("LOL works!");
}catch(IOException ex)
{
System.out.println(ex.toString());
}
}我在服务器应用程序中没有错误,消息"LOL工作!“在控制台中打印,但在webbrowser中,我得到了以下错误:

阳极知道如何修复它并在网页浏览器中获取文本"hi“吗?谢谢。
编辑:,我尝试过将它添加到telnet中。其结果是:

发布于 2012-02-12 15:49:56
您不能只向浏览器发送原始数据并期望它处理它--您必须遵循RFC1945中描述的HTTP (协议)。
具体来说,您必须发送几个标头,然后是一个新行,如RFC1945第4.1节所述。
try{
ServerSocket socket = new ServerSocket(80);
Socket response = socket.accept();
String lol = "<html>hi</html>";
writer = new PrintStream(response.getOutputStream());
writer.println("HTTP/1.1 200 OK");
writer.println("Content-Type: text/html");
writer.println();
writer.println(lol);
writer.flush();
response.close();
System.out.println("LOL works!");
}catch(IOException e)
{
e.printStackTrace();
}
}请注意,我还将您的OutputStream封装在一个PrintStream中,因为这比手动处理OutputStream要容易得多。
发布于 2012-02-12 17:51:15
除了没有像克里斯蒂安·安东森()指出的那样,发送适当的回复之外,问题很可能是,在你回复之前,你实际上并不等待和阅读请求。可以说,这不应该是一个问题,因为缓冲,但即使这样,你的服务器很可能只是“太快”,发送响应和关闭插座之前,Chrome有机会发送请求,从而触发“连接重置”问题,它报告。
尝试实现一个稍微完整一点的服务器。下面是一个简单的例子:
public void readRequest(Socket client) throws IOException {
Reader raw = new InputStreamReader(client.getInputStream(), "US-ASCII");
BufferedReader reader = new BufferedReader(raw);
while(true) {
String line = reader.readLine().trim();
if(line.equals(""))
break;
}
}
public void writeResponse(Socket client) throws IOException {
String lol = "<html>hi</html>";
PrintStream writer = new PrintStream(client.getOutputStream());
writer.println("HTTP/1.1 200 OK");
writer.println("Content-Type: text/html");
writer.println();
writer.println(lol);
writer.flush();
}
public void serveClient(Socket client) throws IOException {
try {
readRequest(client);
writeResponse(client);
System.out.println("LOL works!");
} finally {
client.close()
}
}
public void serve() {
try{
ServerSocket socket = new ServerSocket(80);
while(true) {
Socket client = socket.accept();
serveClient(client);
}
}catch(IOException e) {
e.printStackTrace();
}
}(请注意,我没有尝试代码或其他任何东西,因此不能保证它按原样编译。)
发布于 2012-02-12 15:50:26
web浏览器使用HTTP协议与web服务器通信。如果希望浏览器正确显示页面,则服务器必须根据此协议响应浏览器的请求。
https://stackoverflow.com/questions/9250097
复制相似问题