【问题标题】:Reading HTTP InputStream troubles读取 HTTP InputStream 的烦恼
【发布时间】:2014-05-17 05:43:16
【问题描述】:

我正在编写网络服务器:

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 InputStream is;
        private OutputStream os;


        private SocketProcessor(Socket s, ServerSocket ss) throws Throwable {
            t = new Thread(this, "Server Thread");
            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) {
                int a = br.read();
                System.out.print((char)a);
                if (a==-1) {
                    break;
                }
            }
        }
    }
}

但是我在阅读方面遇到了麻烦。这个方法太费时间了:

 private void readInputHeaders() throws Throwable {
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                while (true) {
                    int a = br.read();
                    System.out.print((char)a);
                    if (a==-1) {
                        break;
                    }
                }
            }

它返回标题和查询字符串,但它冻结了我的网络服务器。怎么了?

【问题讨论】:

  • 作为一个单独的线程运行它。不在主线程中。当你收到请求时。产生一个新线程来响应请求。
  • 我认为你应该更具体一点:输出是什么,你期望什么?它是否恰好在您期望 -1 时立即挂在 br.read() 上?你用的是什么客户端?

标签: java sockets http inputstream


【解决方案1】:

您需要阅读并实施 HTTP 协议,为此您需要阅读 RFC。这样的猜测是行不通的。您为收集请求而编写的方法开始无效。一个请求不能跟 EOS,否则不能写响应。您需要查看内容长度标头、分块编码等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    相关资源
    最近更新 更多