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请求到tomcat,但响应302_Java_Sockets_Tomcat - Fatal编程技术网

Java 套接字http请求到tomcat,但响应302

Java 套接字http请求到tomcat,但响应302,java,sockets,tomcat,Java,Sockets,Tomcat,当我使用Postman使用url:localhost:8080/examples获得结果时,我可以得到正确的结果: ApacheTomcat示例 ApacheTomcat示例 tomcat版本:8.5.32 但当我使用套接字从tomcat服务器获取结果时,结果让我感到困惑。代码如下: public void httpTest(){ Socket socket = new Socket("localhost", 8080); data = "GET /exam

当我使用Postman使用url:localhost:8080/examples获得结果时,我可以得到正确的结果:

ApacheTomcat示例 ApacheTomcat示例 tomcat版本:8.5.32

但当我使用套接字从tomcat服务器获取结果时,结果让我感到困惑。代码如下:


public void httpTest(){

        Socket socket = new Socket("localhost", 8080);
        data = "GET /examples HTTP/1.1\n" +
                "Host: localhost:8080\n" +
                "Cache-Control: no-cache\n" +
                "Postman-Token: 60236fcd-995c-49d9-896c-f88a1bdfbfd3\n\n".getBytes();

        log.debug("receive http request :\r\n{}", new String(data));


        try {

            //向服务器端发送数据
            DataOutputStream out = new DataOutputStream(socket.getOutputStream());
            out.write(data);
            out.flush();

            //读取服务器端数据
            DataInputStream input = new DataInputStream(socket.getInputStream());
            byte[] result = readStream(input);

            log.debug("receive response :\r\n{}", new String(result));
            input.close();
            out.close();

            return result;
        } catch (Exception e) {
            log.error("请求本地服务数据异常, ", e);
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e2) {
                    socket = null;
                    log.error("客户端关闭socket异常, " ,e);
                }
            }
            socket = null;
            return _404();
        }
}
[DEBUG] 2019-09-01 16:50:08,304 method:com.jasey.reverse.client.core.local.LocalHostSender.send(LocalHostSender.java:18) receive http request : GET /examples HTTP/1.1 Host: localhost:8080 Cache-Control: no-cache Postman-Token: 60236fcd-995c-49d9-896c-f88a1bdfbfd3 [DEBUG] 2019-09-01 16:50:28,364 method:com.jasey.reverse.client.core.local.LocalHostSender.send(LocalHostSender.java:37) receive response : HTTP/1.1 302 Location: /examples/ Transfer-Encoding: chunked Date: Sun, 01 Sep 2019 08:50:08 GMT 0 HTTP/1.1 302 Location: /examples/ Transfer-Encoding: chunked Date: Sun, 01 Sep 2019 08:50:08 GMT 0 代码结果日志如下所示:


public void httpTest(){

        Socket socket = new Socket("localhost", 8080);
        data = "GET /examples HTTP/1.1\n" +
                "Host: localhost:8080\n" +
                "Cache-Control: no-cache\n" +
                "Postman-Token: 60236fcd-995c-49d9-896c-f88a1bdfbfd3\n\n".getBytes();

        log.debug("receive http request :\r\n{}", new String(data));


        try {

            //向服务器端发送数据
            DataOutputStream out = new DataOutputStream(socket.getOutputStream());
            out.write(data);
            out.flush();

            //读取服务器端数据
            DataInputStream input = new DataInputStream(socket.getInputStream());
            byte[] result = readStream(input);

            log.debug("receive response :\r\n{}", new String(result));
            input.close();
            out.close();

            return result;
        } catch (Exception e) {
            log.error("请求本地服务数据异常, ", e);
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e2) {
                    socket = null;
                    log.error("客户端关闭socket异常, " ,e);
                }
            }
            socket = null;
            return _404();
        }
}
[DEBUG] 2019-09-01 16:50:08,304 method:com.jasey.reverse.client.core.local.LocalHostSender.send(LocalHostSender.java:18) receive http request : GET /examples HTTP/1.1 Host: localhost:8080 Cache-Control: no-cache Postman-Token: 60236fcd-995c-49d9-896c-f88a1bdfbfd3 [DEBUG] 2019-09-01 16:50:28,364 method:com.jasey.reverse.client.core.local.LocalHostSender.send(LocalHostSender.java:37) receive response : HTTP/1.1 302 Location: /examples/ Transfer-Encoding: chunked Date: Sun, 01 Sep 2019 08:50:08 GMT 0 HTTP/1.1 302 Location: /examples/ Transfer-Encoding: chunked Date: Sun, 01 Sep 2019 08:50:08 GMT 0 我不知道为什么,请帮助我

响应代码302表示重定向。邮递员可能会跟踪它,给你结果

在我看来,在这些情况下,最简单的事情是使用一个简单的库(如ApacheHttpClient)发出请求

以下是学习HttpClient库的有用教程:


这里介绍如何自动执行重定向:

302表示重定向响应。只需遵循重定向。最可能的原因是邮递员会自动遵循重定向,并在您没有注意到的情况下向/examples/发出第二个请求。如果你想做和邮递员一样的事情,也要遵循重定向,即读取响应中的位置头,然后向该位置发送第二个GET请求。或者使用一个实际的HTTP客户端库来为您实现这一点。谢谢您的帮助!重定向/示例/!出于某种原因,每个人都喜欢ApacheHTTPD客户机库,但我发现它比只使用内置的java.net.HttpURLConnection复杂得多。但无论哪种方式,最好使用理解HTTP的组件,而不是使用裸套接字进行通信。