Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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_Sockets_Webserver - Fatal编程技术网

Java 如何让我的web服务器等待?

Java 如何让我的web服务器等待?,java,sockets,webserver,Java,Sockets,Webserver,我正在编写一个小型web服务器,它使用3000端口返回Hello: import java.net.ServerSocket; import java.net.Socket; import java.io.InputStream; import java.io.OutputStream; import java.io.InputStreamReader; import java.io.BufferedReader; public class HttpServer { public s

我正在编写一个小型web服务器,它使用
3000
端口返回
Hello

import java.net.ServerSocket;
import java.net.Socket;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;

public class HttpServer {

    public static void main(String[] args) throws Throwable {
        //http://localhost:3000
        ServerSocket ss = new ServerSocket(3000);

        while (true) {
            //Waiting for socket
            Socket s = ss.accept();
            System.out.println("Client accepted");
            //The main process
            new SocketProcessor(s,ss).start();
        }
    }

    private static class SocketProcessor implements Runnable {
        private Thread t;
        private Socket s;
        private ServerSocket ss;
        private InputStream is;
        private OutputStream os;

        private SocketProcessor(Socket s,ServerSocket ss) throws Throwable {
            t = new Thread(this, "Server Thread");
            this.ss=ss;
            this.s = s;
            this.is = s.getInputStream();
            this.os = s.getOutputStream();
        }

        public void run() {
            try {
                readInputHeaders();               
                writeResponse("<html><body><h1>Hello</h1></body></html>");


            } catch (Throwable t) {
                /*do nothing*/
            } finally {
                try {
                    s.close();
                } catch (Throwable t) {

                }
            }
            System.out.println("Client processing finished");
        }


        public void start()
        {
            t.start();
        }

        private void writeResponse(String s) throws Throwable {
            String response = "HTTP/1.1 200 OK\r\n" +
                    "Server: Server\r\n" +
                    "Content-Type: text/html\r\n" +
                    "Content-Length: " + s.length() + "\r\n" +
                    "Connection: close\r\n\r\n";
            String result = response + s;
            os.write(result.getBytes());
            os.flush();
        }

        private void readInputHeaders() throws Throwable {
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            while(true) {
                String s = br.readLine();
                System.out.println(s);
                if(s == null || s.trim().length() == 0) {
                    break;
                }
            }
        }
    }
}
导入java.net.ServerSocket;
导入java.net.Socket;
导入java.io.InputStream;
导入java.io.OutputStream;
导入java.io.InputStreamReader;
导入java.io.BufferedReader;
公共类HttpServer{
公共静态void main(字符串[]args)抛出可丢弃的{
//http://localhost:3000
ServerSocket ss=新的ServerSocket(3000);
while(true){
//等待套接字
套接字s=ss.accept();
System.out.println(“客户接受”);
//主要过程
新的SocketProcessor.start();
}
}
私有静态类SocketProcessor实现可运行{
私有线程t;
私人插座;
专用服务器;
私有输入流是;
私有输出流;
专用SocketProcessor(套接字s、服务器套接字ss)抛出可丢弃的{
t=新线程(此“服务器线程”);
这个.ss=ss;
这个.s=s;
this.is=s.getInputStream();
this.os=s.getOutputStream();
}
公开募捐{
试一试{
readinputhreaders();
书面回复(“你好”);
}捕获(可丢弃的t){
/*无所事事*/
}最后{
试一试{
s、 close();
}捕获(可丢弃的t){
}
}
System.out.println(“客户端处理完成”);
}
公开作废开始()
{
t、 start();
}
私有void writeResponse(字符串s)抛出可丢弃{
String response=“HTTP/1.1 200正常\r\n”+
“服务器:服务器\r\n”+
“内容类型:text/html\r\n”+
内容长度:“+s.Length()+”\r\n+
“连接:关闭\r\n\r\n”;
字符串结果=响应+s;
write(result.getBytes());
os.flush();
}
私有void readinputhreaders()抛出可丢弃的{
BufferedReader br=新的BufferedReader(新的InputStreamReader(is));
while(true){
字符串s=br.readLine();
系统输出打印项次;
如果(s==null | | s.trim().length()==0){
打破
}
}
}
}
}
我想让我的服务器在响应前等待第二秒。我试着用这样的东西:

readInputHeaders();
t.wait(1000);
writeResponse("<html><body><h1>Hello</h1></body></html>");
readinputhreaders();
t、 等待(1000);
书面回复(“你好”);
但是我的浏览器在
SocketProcessor
的run方法中显示
ERR\u EMPTY\u RESPONSE
调用
Thread.sleep(1000)

方法
wait
不适合您调用

另见:

方法
wait
notify
notifyAll
java.lang.Object
上定义
和用于线程之间的同步。它们通常不是

为了使线程睡眠一定时间

虽然我基本上同意睡眠是首选,但对于等待为什么不能完成预期任务,你有什么解释吗?@njzk2当然有,但它有点长。我需要写对象监视器,等等,通知,通知等等。好的,我还是加了一句。但是
wait
有一个超时,之后它会自动释放,不是吗?@njzk2是的,但是你知道
wait
是关于什么的吗?查看这篇老文章:我对wait有点了解,我用它来同步线程操作,但我在这里没有得到的是
wait
应该暂停线程,直到达到超时或对waited对象调用notify。如果
sleep
合适,则不会使用
wait
。但我想知道为什么等待的超时机制在这种情况下不起作用。是被打断了还是怎么了?