Многопоточный веб-сервер для Android - PullRequest
1 голос
/ 18 августа 2011

Я разрабатываю многопоточный веб-сервер для приложения для Android, и у меня есть некоторые проблемы со страницей, которая использует внешний файл .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 отправляет больше запросов одновременно, и есть проблема с потоками ... Вы можете мне помочь?

[EDIT] Я забыл написать цикл в методе run () в вопросе

[РЕДАКТИРОВАТЬ 2] Я только что попробовал с другим ПК, и есть проблемы также с Firefox ..

1 Ответ

3 голосов
/ 18 августа 2011

Существует общее недопонимание механизма потоков в вашем коде.

Runnable должен переопределить запуск. Не начинай. Метод run () объекта runnable будет вызван при запуске потока вложенности. Другими словами, метод запуска вашего клиента никогда не будет использован, и, надеюсь, полностью, так как он создаст поток внутри потока ... не очень полезный.

Перепроектируйте свой веб-браузер так, чтобы:

  • метод запуска запускает новый поток вложенности, как вы сделали
  • метод run делает следующее
    • ваш веб-сервер привязан к порту
    • в цикле: принимать новые подключения и запускать новый поток клиента для каждого.
    • цикл может управляться логическим флагом, который вы можете использовать для остановки сервера (подойдет ON, даже если имя этой переменной не соответствует соглашениям по именованию java и семантически довольно плохо говоря)

тогда каждый клиент в своем запуске (больше не метод запуска):

  • чтение данных из входного потока сокета
  • ответ на выходной поток сокета
  • Вкратце, реализуем протокол HTTP.

В Интернете вы можете найти java-код, который вдохновит вас , , некоторые примеры хорошо документированы . Кроме того, вы можете рассмотреть возможность использования пакета java.nio, который, возможно, менее эффективен для одного запроса, но гораздо более эффективен для обработки большого количества соединений. Но код сложнее.

Вам следует почитать больше о runnables , а также прочитать кое-что о синхронизированном ключевом слове, чтобы убедиться, что ваш веб-сервер не запускает дважды соединение для одного и того же клиента или запутаться в случае одновременных запросов.

С уважением, Stéphane

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...