2013-09-21 2 views
0

Привет I`m пытается создать многопоточный вебсервер я говорил Link 1 Link 2Multithreaded WebServer

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-запрос и номер порта, но это происходит только для первого клиента, а не для других, которые он показывает неактуально. Прерывание в ThreadAccess и завершение программы

В значительной степени оцените, есть ли там какие-либо страницы, которые рассказывают, как отображать некоторый контент в Webbrowser.

+0

поможет, если вы добавите stacktrace для исключения –

+0

Привет, я использую trycatch-блок, поэтому я получаю сообщение об исключении, мы получаем трассировку стека, только если выполнение программы прекращено из-за исключения, которое не поймано обрядом? – AAB

+0

Я бы начал с реализации простого шаблона производителя/потребителя. Не грубый, но я думаю, что веб-сервер может немного отличаться от ваших способностей. –

ответ

1

Как вы можете прочитать в документации старта метода Thread класса() бросает 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

Hi faramir В приведенных выше комментариях я упомянул, что исправил проблему, так как Boris также предложил такое же спасибо, я буду признателен, если вы сможете сказать, как я могу отобразить страницу ahtml в webbrowser – AAB

+0

, так ли она заканчивается после завершения метода запуска? – AAB

+0

Попробуйте открыть http: // localhost: 3000/page в браузере **, но ** помните, что браузеры используют протокол HTTP для связи, и если вы хотите просмотреть содержимое html, которое вам нужно, чтобы ответить на правильный ответ HTTP (заголовки и данные). Кроме того, ваш «веб-сервер» также нуждается в улучшенной обработке данных - вы начинаете новый поток и сразу после того, как сможете принять новое соединение и запустить новый поток, но вместо этого можно изменить «br», - два потока будут _fight_ для чтения данных ... – faramir