2012-02-12 55 views
0

几个小时前我已经开始学习java socket通信。现在我试图让服务器应用程序将数据返回给webbrowser。 我的代码:Java简单服务器错误

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的作品!”在控制台但在web浏览器打印我得到这个错误:

My error.

是否anobody知道如何修复它,并得到文本“喜”,在网页浏览器?谢谢。

编辑: 我试过把它添加到telnet。这是结果: Telnet result

+2

您现在收听的80端口上,而是通过HTTPS连接其中默认为端口443.这是一个问题,当然? – rodion 2012-02-12 16:09:12

+0

我正在处理80.这是我在谷歌上发现的第一个图像。 – user35443 2012-02-12 16:24:29

回答

2

你不能只是发送原始数据到浏览器,并期望它处理它 - 你必须遵循HTTP(协议),这在RFC1945描述。

具体而言,您必须首先发送一些标题,然后按照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(); 
    } 
} 

请注意,我还包裹在一个PrintStream您的OutputStream,因为这是比手动处理的OutputStream容易得多。

+0

我已经尝试过了,但它仍然不起作用... – user35443 2012-02-12 15:53:49

+1

使用'\ n'作为换行符在这里不起作用。 HTTP协议指定必须使用'\ r \ n'。不要忘记响应主体写完后的那些。 – fivedigit 2012-02-12 15:54:19

+0

错误101(net :: ERR_CONNECTION_RESET):连接已被重置 – user35443 2012-02-12 16:03:01

0

Web浏览器使用HTTP protocol与Web服务器进行通信。如果您希望浏览器正确显示页面,则您的服务器必须根据此协议响应浏览器的请求。

0

看起来像是Chrome的一个问题。也许this one?

尝试摆弄IPv6设置。

0

除了没有发出正确的回复外,正如Kristian Antonsen指出的那样,问题可能是您在回复之前没有真正等待并阅读请求。可以说,这不应该成为一个问题,因为缓冲,但即使如此,它很可能是你的服务器“太快”,发送响应并关闭套接字之前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(); 
    } 
} 

(请注意,我没有尝试过的代码或任何东西,所以没有保证其编译为是。)