2013-04-08 150 views
0

我想寫一個簡單的Java程序使用ServerSockets,將發送一些HTML代碼到瀏覽器。這裏是我的代碼:Java服務器:套接字發送HTML代碼到瀏覽器

 ServerSocket serverSocket = null; 
     try { 
      serverSocket = new ServerSocket(55555); 
      } catch (IOException e) 
      { 
      System.err.println("Could not listen on port: 55555."); 
      System.exit(1); 
     } 

     Socket clientSocket = null; 
     try { 
      clientSocket = serverSocket.accept(); 

      if(clientSocket != null)     
       System.out.println("Connected"); 

     } catch (IOException e) { 
      System.err.println("Accept failed."); 
      System.exit(1); 
     } 

    PrintWriter out = new PrintWriter(clientSocket.getOutputStream()); 


    out.println("HTTP/1.1 200 OK"); 
    out.println("Content-Type: text/html"); 
    out.println("\r\n"); 
    out.println("<p> Hello world </p>"); 
    out.flush(); 

    out.close(); 

    clientSocket.close(); 
    serverSocket.close(); 

然後我在我的瀏覽器中去localhost:55555,什麼也沒有顯示。我知道連接正在工作,因爲程序在if語句中輸出「已連接」。我也嘗試從inputStream輸出數據,並且工作。但我試圖在瀏覽器中輸出的文本根本沒有顯示,程序運行完畢,並且在瀏覽器中出現「問題加載頁面 - 連接已重置」,但沒有顯示文本。

我已經搜索了互聯網,似乎每個人都用這種方式編碼,他們的文本顯示正常,他們有其他問題。 我該如何解決這個問題?

+0

你考什麼瀏覽器?此代碼爲我在Chrome和Firefox中工作 – fmodos 2013-04-08 21:33:39

+0

我在Firefox中測試 – ALR 2013-04-08 21:37:40

+0

在Chrome中,我甚至沒有從inputStream獲得任何結果 – ALR 2013-04-08 21:39:44

回答

3

我在Chrome,Firefox,IE和Opera上測試了你的代碼,它工作正常。

但是,我建議你使用多線程,並且基本上產生一個新的線程來處理每個新的請求。

您可以創建一個實現runnable並在構造函數中接受clientSocket的類。這基本上會使您的自定義Web服務器能夠同時接受多個請求。

如果您想要處理多個總請求,您還需要一個while循環。

一個良好的閱讀展示上述:http://www.prasannatech.net/2008/10/simple-http-server-java.html

享受!

+0

感謝您的建議。 – ALR 2013-04-08 22:11:36

+0

我已將Chrome和Firefox與防火牆關閉。它已經工作了大約15次,這是在鉻。我不明白髮生了什麼問題。 – ALR 2013-04-08 22:12:16

+0

嘗試在所有代碼中添加一段時間(true)。也許你的應用程序正在關閉,因爲有多個請求正在進行。 – 2013-04-08 22:17:02

1
  1. 在HTTP線路終端是\r\n.這意味着,你不應該使用println(),你應該使用print()和自己添加一個明確\r\n到每一行。

  2. HTTP GET的結果應該是HTML文檔,而不是片段。瀏覽者有權忽略或投訴。發送:

    <html> 
    <head/> 
    <body> 
    <p> Hello world </p> 
    </body> 
    </html> 
    
0

您需要需要設置的PrintWriter它打印時自動刷新。

PrintWriter out = new PrintWriter(clientSocket.getOutputStream());

應該

PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

相關問題