2011-08-18 57 views
1

我正在開發適用於android應用程序的多線程Web服務器,並且在使用外部.css文件和.js文件的頁面上遇到了一些問題,但只與Google Chrome瀏覽器有關!使用Firefox和Opera時,頁面呈現良好,Google Chrome有時會加載.css,有時會加載.js,有時甚至都不加載。適用於Android的多線程Web服務器

這是我的應用程序的結構:

WebServer.java

class WebServer implements Runnable{ 
protected boolean ON; 

public void start(){ 
      if(!ON){ 
      ON=true; 
      thread=new Thread(this,"WebServer"); 
      thread.start(); }} 

public void run(){ 
while(ON){ 
listenSocket = new ServerSocket(port); 
Socket connectionSocket = listenSocket.accept(); 
Thread t = new Thread(new Client(connectionSocket)); 
t.start(); 
listenSocket.close();} 
}} 

Client.java

class Client implements Runnable { 
public void start(){ 
     thread=new Thread(this,"Client"); 
     thread.start();} 

public void run(){ 
//parse the request and send a file 
} 
} 

myApp.java

public class myApp extends Activity{ 

onCreate(){ 
WebServer ws=new WebServer(8080); 
} 

onClick(){ 
... 
ws.start(); 
}} 

當我點擊活動按鈕時,它調用webserver.start();在我看來,谷歌瀏覽器同時發送更多請求,並且線程出現問題... 你能幫助我嗎?

[編輯] 我忘了寫在run()方法中的循環中的問題

[編輯2] 我只是想與其他電腦,有問題也與火狐..

+1

將ServerSocket創建移出循環。這是行不通的。 – ZeissS

+0

Thank'youuu !!!現在它的作品總是:) – supergiox

回答

3

有一個在您的代碼線程機制的一般誤解。

runnable必須覆蓋運行。不開始。 runnable的run()方法將在嵌套線程啓動時調用。換句話說,你的客戶端的啓動方法將永遠不會被使用,並且完全希望,因爲它會在一個線程中創建一個線程..不是非常有用的。

重新設計你的webser,使得:

  • 它的啓動方法開始像你一樣
  • 它的運行方法的新嵌套線程執行以下
    • 您的Web服務器綁定到一個端口
    • 在一個循環中:接受新的連接併爲每個連接啓動新的客戶端線程。
    • 迴路可以通過一個布爾標誌,你可以上升到停止服務器進行控制(ON會適合,即使這個變量的名稱不符合java naming conventions和比較差semanticly說)

然後每個客戶端將在它的運行(不啓動法):

  • 讀取從套接字輸入流數據
  • 上插座的OutputStream答覆
  • 簡單地說,執行http protocole。

你可以找到一些java代碼來激勵你on the web,some examples are well documented。另外,您可以考慮使用對於單個請求可能不太有效的java.nio包,但在處理大量多個連接時更有效。但代碼更難。

你應該考慮閱讀更多關於runnables,也可以閱讀一些東西有關synchronized關鍵字,以確保您的Web服務器不啓動兩次相同的客戶端連接或獲得的併發請求的情況下迷茫。

Regards, Stéphane

+1

我認爲你誤解了代碼。他使用'start()'啓動Web服務器線程。他的代碼實際上是「好的」,但他忘了將accept()函數放入循環中,因此可以接受多個連接。 – ZeissS

+1

我正在談論客戶端類的開始。 – Snicolas

+0

@ZeissS我編輯了答案,因爲我忘了寫一段時間,但我的代碼已經有一段時間了。 – supergiox