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 使用套接字的Http请求_Java_Sockets_Http_Request - Fatal编程技术网

Java 使用套接字的Http请求

Java 使用套接字的Http请求,java,sockets,http,request,Java,Sockets,Http,Request,我必须使用HTTP请求向一些嵌入了HTTP服务器的应用程序发送一些命令。我使用的是套接字,到目前为止我这样做了,但我有点迷路了: URI uri = URI.create(rawData); try { String host = uri.getHost(); String path = uri.getRawPath( ); if (path == null || path.length( ) == 0) { p

我必须使用HTTP请求向一些嵌入了HTTP服务器的应用程序发送一些命令。我使用的是套接字,到目前为止我这样做了,但我有点迷路了:

 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“
。协议编写是否正确?
谢谢

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

下面是一个带有HttpURLConnectionAPI的示例代码段-

String urlString = "http://myhost/mywebapp/myresource";
URL url= new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(timeout);
conn.setRequestMethod("GET");
conn.getResponseCode();
这就是我需要做的吗

没有

  • 您需要处理响应,并且在处理您可能收到的各种响应时存在复杂性

  • 您处理HTTPS的方式完全错误。您需要处理SSL连接协商。。。如果您尝试使用普通套接字来实现这一点,那么您需要进行大量的编码

  • rawData的一个例子是
    ”http://somemessage“

    什么是奇怪的URL。“/”后面的内容应该是(或包括)可解析的主机名或IP地址。如果您试图使用web浏览器获取这样的URL,它将不起作用

    协议写得正确吗

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

    典型的格式良好的URL(在本例中为显式端口号)如下所示:

        http://example.com:8080/path/to/resource
    
    您还可以以相对形式表示URI;e、 g

        http:/path/to/resource
    

    甚至

        resource
    
    但这两种形式需要转换为绝对(URL)形式,然后才能被客户端库使用



    但坦率地说,这是错误的做法。Java SE库和Apache HTTP库中都有客户端HTTP/HTTPS堆栈的现有实现。试图重新实现它们是浪费时间。

    你有没有特别的理由不使用
    URLConnection
    ?@AlexR不是真的,我唯一应该考虑的是在不打开浏览器选项卡的情况下这样做,因为到目前为止它是这样做的:“Desktop.getDesktop().browse(URI.create(rawData));“我知道它不会工作,这是我任务的主要建议,不使用浏览器发送消息,只是作为后台任务,消息代表一些外部工具的命令,它们应该执行。@TudorR-如果你知道它不起作用,为什么还要尝试这样做?是什么让你认为你不能在后台使用(比如)
    HttpUrlConnection
    发送请求?抱歉,您的评论对我来说毫无意义。目前,在我的应用程序中,使用Desktop.getDesktop().browse(URI.create(URL))处理像http://5195+JT+Equity5195JT这样的URL,但每次我发送请求时,它都会在我的浏览器中打开一个空选项卡,我必须在不打开它的情况下让它工作,因为它是无用的http协议只用于在我的应用程序和其他外部应用程序之间共享消息。我正在使用fiddler检查它是否已发送。这是一个非常大的项目,我是新手,所以我对此没有明确的想法,但在我看来,它只是用来共享信息的。我也有点困惑。那你为什么要使用
    Desktop.getDesktop()。浏览
    而不是
    HttpUrlConnection
    browse
    打开浏览器窗口完全是预期的行为。如果您阅读javadoc,您将看到这是该调用的主要目的!!我还应该指出,
    “http://5195+JT+Equity5195JT”
    不是有效的URL。正如我上面所说的,
    “//”
    后面的东西。。。直到下一个
    “/”
    应该是(或包括)有效的主机名或IP地址。你上面给我们看的东西显然是无效的。
        resource