簡體   English   中英

適用於Android的多線程Web服務器

[英]Multithreaded Web Server for Android

我正在為Android應用程序開發多線程Web服務器,但使用外部.css文件和.js文件的頁面存在一些問題,但僅適用於Google Chrome瀏覽器! 使用Firefox和Opera時,頁面呈現得很好,使用Google Chrome時,有時會加載.css,有時會加載.js,有時兩者都加載或不加載。

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

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();。 我認為google chrome會同時發送更多請求,並且線程有問題...您能幫我嗎?

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

[編輯2]我剛嘗試過另一台電腦,但是Firefox也有問題。

您的代碼中普遍存在對線程機制的誤解。

可運行變量必須覆蓋運行。 無法啟動。 當嵌套線程啟動時,將調用runnable的run()方法。 換句話說,您的客戶端的start方法將永遠不會使用,並且會完全希望,因為它將在線程內創建一個線程。不是很有用。

重新設計您的Webser,以便:

  • 它的start方法像您一樣啟動一個新的嵌套線程
  • 它的運行方法執行以下操作
    • 您的網絡服務器綁定到端口
    • 循環:接受新連接並為每個連接啟動新的客戶端線程。
    • 可以由一個布爾標志來控制該循環,您可以上升該布爾標志來停止服務器(即使此變量的名稱不遵循Java命名約定並且從語義上來講也很差),ON仍然合適。

那么每個客戶端都將在運行中(不再需要start方法):

  • 從套接字輸入流讀取數據
  • 回復套接字輸出流
  • 簡要地,實現http協議。

您可以在網絡上找到一些Java代碼來激發您靈感, 一些示例已被充分記錄在案 另外,您可以考慮使用java.nio包,該包對於單個請求可能無效,但是在處理大量的多個連接時效率更高。 但是代碼更難。

您應該考慮閱讀有關可運行對象的更多信息,還應考慮閱讀有關同步關鍵字的一些知識,以確保您的Web服務器不會為同一客戶端啟動兩次連接或在同時請求的情況下感到困惑。

此致,Stéphane

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM