2013-09-21 173 views
0

嗨我真的想創建一個多線程Web服務器 我已經提到 Link 1 Link 2多線程Web服務器

import java.net.*; 
import java.io.*; 
public class WebServer { 

    ServerSocket server; 
    public WebServer() { 
     try { 
      server=new ServerSocket(3000); 
     } catch (IOException ex) { 
      System.out.println("exc in const "+ex.getMessage()); 
     } 
    } 
    Socket client; 
    BufferedReader br; 
    Thread t=new Thread(new Runnable(){ 
       @Override 
       public void run() { 
        try{ 
         System.out.println(br.readLine());      
        } 
        catch(Exception e){ 
         System.out.println("exc is "+e); 
        } 
       } 
      }); 
    public void RUN(){ 

     while(true){ 
      try { 
       client=server.accept(); 
        System.out.println(client.getPort()); 
       if(client!=null){ 
        r=new BufferedReader(new InputStreamReader(client.getInputStream())); 
        t.start(); 
       } 
      } catch (IOException ex) { 
       System.out.println("ex is "+ex.getMessage()); 
      } 
     } 
    } 
    public static void main(String[] args) { 
     WebServer webserver=new WebServer(); 
     try { 
       webserver.RUN(); 
      } catch (Exception e) { 
      System.out.println("main "+e); 
     }   
    } 
} 

在上面的代碼中,我不斷收到一個線程非法訪問異常那就是爲什麼我不斷收到此異常 我想打開瀏覽器中的多個選項卡並打開本地主機:3000然後服務器必須打印http請求和端口號,但這種情況只發生在第一個客戶端,而不是其他的它顯示非法線程訪問異常和程序終止

將大大欣賞是否有任何頁面告訴如何在Web瀏覽器中顯示一些內容。

+0

將幫助,如果你添加異常的堆棧跟蹤 –

+0

嗨,我使用trycatch塊,所以我只得到異常的消息我們得到一個堆棧跟蹤只有當程序執行停止由於沒有被捕獲儀式的異常儀式? – AAB

+0

我會從實施一個簡單的生產者/消費者模式開始。不要粗魯,但我認爲一個網絡服務器可能會超出你的能力。 –

回答

1

正如你可以在Thread類的文檔中看到的方法start()拋出 IllegalThreadStateException如果線程已經啓動。

在您的代碼中,您只創建一次線程,並嘗試多次運行它。

如何解決?行前:

t.start(); 

您應該創建新的線程

Thread t=new Thread(new Runnable(){ 
      @Override 
      public void run() { 
       try{ 
        System.out.println(br.readLine());      
       } 
       catch(Exception e){ 
        System.out.println("exc is "+e); 
       } 
      } 
     }); 

編輯:有關意見的問題。當你開始線程時,它開始活着。你可以例如。通過在線程對象上調用join()方法等待終止。 Thread類的規範說明它是如何工作的,它說你不能重新運行它。

+0

您好faramir在上面的評論中,我提到我糾正了這個問題,因爲鮑里斯也建議同樣的謝謝,如果你能告訴我如何能在網頁瀏覽器中顯示ahtml頁面 – AAB

+0

那麼它在完成其運行方法後會終止? – AAB

+0

嘗試在瀏覽器中打開http:// localhost:3000 /頁面,但**請記住,瀏覽器使用HTTP協議進行通信,如果您想查看html內容,則需要回復正確的HTTP響應(標題和數據)。此外,你的「網絡服務器」還需要更好的處理數據 - 你開始新的線程,並立即在你可以接受新的連接並啓動新的線程後,但可以同時更改「br」 - 兩個線程將阻止數據讀取... – faramir