使用套接字的Http请求

时间:2014-02-17 12:40:02

标签: java sockets http request

我必须使用HTTP请求向一些嵌入了http server的应用程序发送一些命令。我正在使用套接字,到目前为止我做了这个但是我有点迷失了:

 URI uri = URI.create(rawData);
    try {

        String host = uri.getHost();
        String path = uri.getRawPath( );
        if (path == null || path.length( ) == 0) {
            path = "/";
        }
        String protocol = uri.getScheme( );
        int port = uri.getPort( );
        if (port == -1) {
            if (protocol.equals("http")) {
                port = 80; // http port
            }
            else if (protocol.equals("https")) {
                port = 443; // https port
            }
        }
        Socket socket = new Socket( host, port );
        PrintWriter request = new PrintWriter( socket.getOutputStream() );
        request.print(  "GET " + path + " HTTP/1.1\r\n" +
                   "Host: " + host + "\r\n" +
                   "Connection: close\r\n\r\n");
        request.flush( );

这就是我需要做的吗? rawData的一个示例是"http://somemessage"。协议是否正确编写? 感谢

2 个答案:

答案 0 :(得分:4)

  

这就是我需要做的吗?

不。

  1. 您需要处理回复,处理您可能收到的各种回复时会很复杂。

  2. 您处理HTTPS的方式完全错误。您需要处理SSL连接协商......如果您尝试使用普通套接字执行此操作,则需要进行大量编码。

  3.   

    rawData的一个示例是"http://somemessage"

    什么是奇怪的网址。 “//”之后的内容应该是(或包含)可解析的主机名或IP地址。如果您尝试使用Web浏览器获取类似的URL,则无法使用。

      

    协议是否写得正确?

    当然,URL写得不正确。如果您尝试将所谓的URL与HttpURLConnection或任何其他客户端HTTP API(请参阅下文)一起使用,它将无法运行 !!!

    典型的格式良好的URL(在这种情况下,具有显式端口号)如下所示:

        http://example.com:8080/path/to/resource
    

    您还可以以相对形式表达URI; e.g。

        http:/path/to/resource
    

        http:relpath/to/resource
    

    甚至

        resource
    

    但是这两种形式需要先变成绝对(URL)形式才能被客户端库使用。


    但坦率地说,这是错误的做事方式。 Java SE库中以及Apache HTTP库中存在客户端HTTP / HTTPS堆栈的现有实现。试图重新实现它们是浪费时间。

答案 1 :(得分:1)

您可以根据需要使用更高级别的JDK API而不是较低级别的套接字 API。请参阅以下链接 -

http://docs.oracle.com/javase/7/docs/api/java/net/HttpURLConnection.html

http://docs.oracle.com/javase/7/docs/api/javax/net/ssl/HttpsURLConnection.html

以下是 HttpURLConnection API的示例代码段 -

String urlString = "http://myhost/mywebapp/myresource";
URL url= new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(timeout);
conn.setRequestMethod("GET");
conn.getResponseCode();