java - 通过套接字连接的多个 HTTP 请求

标签 java sockets http tcp

我想对服务器进行 HTTP GET,读取数据,然后通过同一套接字连接再次执行 HTTP GET 或 POST。 但是我无法获得第二个请求的响应。以下代码可能有什么问题:

                Socket s = new Socket(InetAddress.getByName("xyz.abc.asd"), 80);

            InputStream is=s.getInputStream();
            OutputStream os=s.getOutputStream();

            PrintWriter pwGET = new PrintWriter(os);

            pwGET.println("GET /login/ HTTP/1.1");
            pwGET.println("Host: xyz.abc.asd");
            pwGET.println("Connection: keep-alive");
            pwGET.println("");
            pwGET.flush();

            BufferedReader brGET = new BufferedReader(new InputStreamReader(is));


            String t=null;

            while((t = brGET.readLine()) != null) {
                    System.out.println(t);


            }

            pwGET.println("GET /login/ HTTP/1.1");
            pwGET.println("Host: xyz.abc.asd");
            pwGET.println("Connection: keep-alive");
            pwGET.println("");
            pwGET.flush();

            BufferedReader br = new BufferedReader(new InputStreamReader(is));


            t=null;

            while((t = br.readLine()) != null) {
                    System.out.println(t);


            }

最佳答案

主要错误是您没有正确解析响应。 响应由 HTTP header 和正文(可能)组成。要获取正文,您必须解析并理解响应 header ,尤其是代码(有些代码没有正文)、传输编码和内容长度。然后您还应该查看连接 header 。 只有这样您才知道正文的长度以及此连接是否接受进一步的请求。

除此之外,行应该由\r\n 分隔,而不仅仅是像 println 那样用\n 分隔。

总之:如果你真的想自己实现 HTTP,请学习必要的文档(RFC2616 或更新的 RFC7230..RFC7235)。如果您不喜欢这样,请使用现有的 HTTP 库。

关于java - 通过套接字连接的多个 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26078104/

相关文章:

Java 服务器在 32 位工作,但在 64 位工作。为什么?

java - 如何正确使用双坐标作为 HashMap 中的键?

java - 将数据从数据存储移动到 MySQL(Cloud SQL)

java - 无法通过 ADB 或自己的应用程序打开应用程序 Activity/屏幕 - 权限拒绝

http - 如何使用 Curl 和 API key 上传到 Google Cloud Storage?

web-services - 您应该在 URL 中使用复数形式还是单数形式的文件夹名称

http - 如何使用格式为 "filter[name]=foo"的查询字符串参数进行 curl

java - JPA + Datanucleus + 连接池 : connections are opened/closed with each statement

python-3.x - 带有MSG_DONTWAIT的Python socket.recv

c - 将 AF_INET 分配给 sockaddr_in 结构的 sin_family 属性时出现段错误