【问题标题】:Send HTTPGET request over TCP connection to "localhost"通过 TCP 连接向“localhost”发送 HTTPGET 请求
【发布时间】:2017-04-26 13:26:48
【问题描述】:

这是我的 java http 服务器程序:

package alan;

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class SimpleHTTPServer { 
    public static void main(String args[] ) throws IOException { 
        ServerSocket server = new ServerSocket(8080); 
        System.out.println("Listening for connection on port 8080 ...."); 
        while (true) { 
            Socket clientSocket = server.accept(); 
            InputStreamReader isr = new          InputStreamReader(clientSocket.getInputStream()); 
        BufferedReader reader = new BufferedReader(isr); 
        String line = reader.readLine(); 
        while (!line.isEmpty()) { 
            System.out.println(line); 
            line = reader.readLine(); 
        } 
    } 
} 
}

当这个程序运行时,如果我在 Web 浏览器上写“http://localhost:8080”,程序可以处理 Http 获取请求并在 Eclipse 控制台上打印结果,但我想使用 java 代码来完成。

实际上,首先,我想创建一个名为 SimpleHTTPClient 的类,我想创建一个与 SimpleHTTPServer 类的 TCP Socket 连接,并通过 java 代码向我的本地主机发送 HTTPGET 请求。我怎样才能做到这一点?实际上,我可以使用这样的 URL 连接发送 HTTPGET 请求:

package alan;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.URL;
import java.net.URLConnection;
import java.net.UnknownHostException;

public class SimpleHTTPClient {
    static Socket socket = null;

    public static void main(String args[]) throws UnknownHostException,     IOException {
    URL oracle = new URL("http://localhost:8080");
    URLConnection yc = oracle.openConnection();
    BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));
    String inputLine;
    while ((inputLine = in.readLine()) != null) 
        System.out.println(inputLine);
    in.close();
}
}

但我想通过 TCP 套接字连接向我的 localhost 发送 HTTPGET 请求。我该怎么做?

【问题讨论】:

    标签: java sockets http tcp


    【解决方案1】:

    为此,您必须打印请求的标头。 对于基本的 HTTP 请求,只需在 header 中添加 http 方法和主机即可。

    见下面的代码

    Socket s = new Socket(InetAddress.getByName("stackoverflow.com"), 80);
    PrintWriter pw = new PrintWriter(s.getOutputStream());
    pw.println("GET / HTTP/1.1");
    pw.println("Host: stackoverflow.com");
    pw.println("");
    pw.flush();
    BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
    String t;
    while ((t = br.readLine()) != null) {
        System.out.println(t);
    }
    br.close();
    

    祝你好运

    【讨论】:

    • 实际上,我已经看到了那个帖子:stackoverflow.com/questions/10673684/… ---但是我无法理解我什至可以这样写的一点:pw.print("HELLO\r\n"); pw.print("宿主:AHMET\r\n\r\n"); pw.flush(); ---所以我的意思是,我可以打印我写的任何东西,我想我无法理解请求逻辑的标题......
    • 不要使用打印和回车字符。使用 println。喜欢这篇文章的答案。
    • @Sonor:此代码未使用正确的行尾(即\r\n),但大多数服务器会忽略这一点。但是代码发出一个 HTTP/1.1 请求,这意味着隐式保持活动,即服务器可能在发送响应后不会直接关闭,因此代码可能只是挂在那里。相反,客户端应该正确处理响应并检查 HTTP 标头中的 Content-Length 或分块编码。此外,虽然将标题作为行读取是有意义的,但对正文执行此操作是没有意义的。
    • 首先,我必须说,非常感谢!但是,我想向我的本地主机发送 HTTPGET 请求,那么我该怎么做呢?我不确定我能不能用 Sonor 的方式做到这一点!如上所示,我已经用 java 开发了我的 http 服务器,我只需要“通过 tcp 套接字发送 HTTPGET”...
    猜你喜欢
    • 2017-09-14
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多