2013-09-21 177 views
0

嗨我真的想创建一个多线程Web服务器 我已经提到 Link 1 Link 2多线程Web服务器

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请求和端口号,但这种情况只发生在第一个客户端,而不是其他的它显示非法线程访问异常和程序终止

将大大欣赏是否有任何页面告诉如何在Web浏览器中显示一些内容。

+0

将帮助,如果你添加异常的堆栈跟踪 –

+0

嗨,我使用trycatch块,所以我只得到异常的消息我们得到一个堆栈跟踪只有当程序执行停止由于没有被捕获仪式的异常仪式? – AAB

+0

我会从实施一个简单的生产者/消费者模式开始。不要粗鲁,但我认为一个网络服务器可能会超出你的能力。 –

回答

1

正如你可以在Thread类的文档中看到的方法start()抛出 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

您好faramir在上面的评论中,我提到我纠正了这个问题,因为鲍里斯也建议同样的谢谢,如果你能告诉我如何能在网页浏览器中显示ahtml页面 – AAB

+0

那么它在完成其运行方法后会终止? – AAB

+0

尝试在浏览器中打开http:// localhost:3000 /页面,但**请记住,浏览器使用HTTP协议进行通信,如果您想查看html内容,则需要回复正确的HTTP响应(标题和数据)。此外,你的“网络服务器”还需要更好的处理数据 - 你开始新的线程,并立即在你可以接受新的连接并启动新的线程后,但可以同时更改“br” - 两个线程将阻止数据读取... – faramir