【问题标题】:Multithreaded WebServer多线程网络服务器
【发布时间】:2013-09-21 18:30:47
【问题描述】:

您好,我正在尝试创建多线程 Web 服务器 我已经提到 Link 1 Link 2

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);
        }          
    }
}

在上面的代码中,我不断收到线程非法访问异常,那么为什么我不断收到此异常 我想在浏览器中打开多个选项卡并打开 localhost:3000 然后服务器必须打印 http 请求和端口号,但这仅发生在第一个客户端而不是其他客户端,它显示非法线程访问异常并且程序终止

如果有任何页面说明如何在网络浏览器中显示某些内容,将不胜感激。

【问题讨论】:

  • 如果您添加异常的堆栈跟踪会有所帮助
  • 您好,我正在使用 trycatch 块,所以我只收到异常消息,只有当程序执行由于未捕获的异常而停止时,我们才会获得堆栈跟踪?
  • 我将从实现一个简单的生产者/消费者模式开始。不是粗鲁,但我认为网络服务器可能有点超出你的能力。
  • @Boris 那么我如何接受来自多个客户端的连接呢?我是新手,所以必须完成
  • @Boris 超能力与否我一定要试一试

标签: java client-server


【解决方案1】:

正如您在 Thread 类方法 start() throws 的文档中看到的那样 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);
                }
            } 
        });

编辑:关于 cmets 中的问题。当您启动线程时,它开始过自己的生活。你可以例如。等待通过在线程对象上调用join() 方法来终止。 Thread 类的规范说明了它是如何工作的,并且它说你不能重新运行它。

【讨论】:

  • 嗨 faramir 在上面的 cmets 中我提到我纠正了这个问题,因为 Boris 也提出了同样的建议,谢谢如果你能告诉我如何在 webbrowser 中显示 ahtml 页面,我将不胜感激
  • 那么它在运行方法结束后会终止吗?
  • 尝试在浏览器中打开localhost:3000页面,但是请记住浏览器使用HTTP协议进行通信,如果您想看到html内容需要回复正确的 HTTP 响应(标头和数据)。此外,您的“网络服务器”还需要更好地处理数据 - 您启动新线程并在您接受新连接并启动新线程后立即,但同时可以更改 br - 两个线程将 fight i> 用于读取数据...
  • 不会 br 对每个线程都是唯一的 每个线程都有一个围绕套接字输出流的 br 每个线程都有一个单独的 TCP 连接,我是正常的还是完全磨损的?
  • 您只有一个WebServer 类的实例,而对于那个实例,您有字段br,所以一切都是共享的。可能,您想创建实现Runnable 的新类,并为每个请求创建新实例,并且在该类中您应该设置br 并使用新的类对象启动新线程。当然,这不是编写服务器应用程序的最佳方式,而是最简单的方式。
猜你喜欢
  • 1970-01-01
  • 2011-01-15
  • 2010-09-17
  • 1970-01-01
  • 2020-03-09
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
相关资源
最近更新 更多