Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多线程Web服务器_Java_Client Server - Fatal编程技术网

Java 多线程Web服务器

Java 多线程Web服务器,java,client-server,Java,Client Server,嗨,我正在尝试创建一个多线程的Web服务器 我已经提到 在上面的代码中,我一直得到一个线程非法访问异常,那么为什么我一直得到这个异常呢 我想在浏览器中打开多个选项卡并打开localhost:3000,然后服务器必须打印http请求和端口号,但这种情况仅发生在第一个客户端,而不是其他客户端。它显示非法线程访问异常,程序终止 如果有任何页面告诉您如何在Webbrowser中显示某些内容,我们将不胜感激。正如您在类方法start()的文档中所读到的那样 如果线程已启动,则为IllegalThread

嗨,我正在尝试创建一个多线程的Web服务器 我已经提到

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


如果有任何页面告诉您如何在Webbrowser中显示某些内容,我们将不胜感激。

正如您在类方法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()
方法来等待终止。
线程
类的规范说明了它是如何工作的,并且说明您不能重新运行它。

如果您添加异常的stacktrace会有所帮助。我正在使用trycatch块,因此我只会收到异常消息。我们只会在程序执行由于未捕获的异常而停止时才收到堆栈跟踪?我会这样做首先实现一个简单的生产者/消费者模式。这不是粗鲁,但我认为Web服务器可能有点超出你的能力。@Boris那么我如何接受来自多个客户端的连接呢?我是个新手,所以沃特一定是done@Boris无论是否超出能力,我必须在上面的评论中给出一个tryHi faramir,我已经提到,我纠正了这个问题,因为Boris也提出了同样的建议。谢谢。如果您能告诉我如何在WebBrowser中显示ahtml页面,我将不胜感激。那么,它是否在完成其运行方法后终止?尝试打开页面,但请记住,浏览器使用HTTP协议进行通信,如果希望查看html内容,则需要回复正确的HTTP响应(标题和数据)。此外,您的“Web服务器”还需要更好地处理数据-您启动新线程,并且在您可以接受新连接并启动新线程之后,但是
br
可以同时更改-两个线程将争夺要读取的数据…br对于每个线程不是唯一的每个线程都有一个围绕套接字输出流的br每个a都有一个单独的TCP连接我是rite还是ami我完全工作?您只有一个
WebServer
类的实例,对于这个实例,您有字段
br
,所以所有内容都是共享的。您可能希望创建实现
Runnable
的新类,并为每个请求创建新实例,在该类中,您应该设置
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);
                }
            } 
        });