2012-02-12 60 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(); 
    } 
} 

(請注意,我沒有嘗試過的代碼或任何東西,所以沒有保證其編譯爲是。)