[英]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代碼來激發您的靈感, 一些示例已被充分記錄在案 。 另外,您可以考慮使用java.nio包,該包對於單個請求可能無效,但是在處理大量的多個連接時效率更高。 但是代碼更難。
您應該考慮閱讀有關可運行對象的更多信息,還應考慮閱讀有關同步關鍵字的一些知識,以確保您的Web服務器不會為同一客戶端啟動兩次連接或在同時請求的情況下感到困惑。
此致,Stéphane
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.