URLConnection(五)

news2024/10/5 14:15:48

文章目录

    • 1. 断开与服务器的连接
    • 2. 处理服务器响应
    • 3. 错误条件
    • 4. 重定向
    • 5. 代理
    • 6. 流模式

1. 断开与服务器的连接

HTTP1.1 支持持久连接,允许通过一个TCP socket发送多个请求和响应。不过使用Keep-Alive时,服务器不会因为已经向客户端发送了最后一个字节的数据就关闭连接。服务器会超时并关闭连接,可能有5秒处于非活动状态。不过最好还是通过客户端在确认工作结束时关闭连接。HttpURLConnection类透明的支持HTTP Keep-Alive,除非显示将其关闭。也就是说,在服务器关闭连接之前,如果再次连接同一个服务器,它会重用Socket。一旦知道与一个特定主机的会话结束,disconnect方法允许客户端断开连接。

public abstract void disconnect()

如果这个连接上还有打开的流,disconnect将会关闭这些流。

2. 处理服务器响应

通常响应消息中我们只需要数字响应码,HttpURLConnection还有一个getResponse()方法,会以int返回这个响应码

public int getResponseCode()throws IOException

响应码后面的文本字符称为响应消息,可以由一个getResponseMessage方法返回

public String getResponseMessage()throws IOException

HTTP 1.0 定义了16个响应码。HTTP 1.1扩展为了40个不同的响应码。虽然有些数字(比如著名的404)几乎已经成为其语义含义的代名词,但大多数我们都还不太熟悉。HttpURLConnectiooon类包括36个命名常量,如HttpURLConnection.OK 和Http URLConnection和HttpURLConnection.NOT_FOUND,表示最常见的一些响应码。

下面程序获取响应首部和响应内容

public class QuizCardBuilder {

    public static void main(String[] args) throws IOException {
        try{
            URL u=new URL("http://www.baidu.com");
            HttpURLConnection urlConnection=(HttpURLConnection) u.openConnection();
            int code=urlConnection.getResponseCode();
            String response=urlConnection.getResponseMessage();
            System.out.println("HTTP/1.x"+code+" "+response);
            for(int j=1;;j++){
                String header=urlConnection.getHeaderField(j);
                String key=urlConnection.getHeaderFieldKey(j);
                if(header==null|| key==null)break;
                System.out.println(urlConnection.getHeaderField(j)+": "+header);
            }
            System.out.println();
            try(InputStream in=urlConnection.getInputStream()){
                InputStream buffer=new BufferedInputStream(in);
                InputStreamReader reader=new InputStreamReader(buffer);
                int c;
                while((c=reader.read())!=-1){
                    System.out.print((char)c);
                }
            }
        }catch (MalformedURLException e) {
            System.err.println("www.baidu.com is not a parseable URL");
        }catch (IOException e){
            System.err.println(e);
        }
    }
}

在这里插入图片描述

3. 错误条件

有些情况下,服务器如果没有检索到用户的URL,它可能并不会返回404,而是在消息主体中返回有用的消息(帮我检索信息的页面)。getErrorStream方法返回一个InputStream,其中就包含这个页面。如果URL没有错误时这个流就返回null。

public class QuizCardBuilder {

    public static void main(String[] args) throws IOException {
        try{
            URL u=new URL("http://www.baidu.com");
            HttpURLConnection urlConnection=(HttpURLConnection) u.openConnection();
            int code=urlConnection.getResponseCode();
            String response=urlConnection.getResponseMessage();
            System.out.println("HTTP/1.x"+code+" "+response);
            for(int j=1;;j++){
                String header=urlConnection.getHeaderField(j);
                String key=urlConnection.getHeaderFieldKey(j);
                if(header==null|| key==null)break;
                System.out.println(urlConnection.getHeaderField(j)+": "+header);
            }
            System.out.println();
            try(InputStream in=urlConnection.getInputStream()){
                InputStream buffer=new BufferedInputStream(in);
                InputStreamReader reader=new InputStreamReader(buffer);
                int c;
                while((c=reader.read())!=-1){
                    System.out.print((char)c);
                }
            }
            System.out.println("此时的errorStream:"+urlConnection.getErrorStream());
        }catch (MalformedURLException e) {
            System.err.println("www.baidu.com is not a parseable URL");
        }catch (IOException e){
            System.err.println(e);
        }
    }
}

在这里插入图片描述

4. 重定向

300一级的响应码都会表示某种重定向,即请求的资源不在期望的位置上,但有可能会在其他位置找到。遇到这种情况,浏览器会自动从新位置加载文档。但这是存在风险的,因为这样很有可能将用户从一个可信的网站转移到一个不可信的网站,而用户毫无察觉。默认情况下,HttpURLConnection会跟随重定向,不过HttpURLConnection有两个静态方法,允许你确定是否跟随重定向:

public static boolean getFollowRedirects()
public static void setFollowRedirects(bool)

如果跟随重定向,getFollowRedirects()方法就会返回true,否则返回false。如果系统安全管理器不允许修改重定向值,那么set方法会返回一个SecurityException。Java有两个方法可以针对各个实例配置重定向(上面静态方法是类所以,相当于给所有实例配置重定向)

public boolean getInstanceFollowRedirects()
public void setInstanceFollowRedirects()
public class QuizCardBuilder {

    public static void main(String[] args) throws IOException {
        try{
            URL u=new URL("http://www.baidu.com");
            HttpURLConnection urlConnection=(HttpURLConnection) u.openConnection();
            System.out.println("实例重定向信息:"+urlConnection.getInstanceFollowRedirects());
            System.out.println("类重定向信息:"+HttpURLConnection.getFollowRedirects());
        }catch (MalformedURLException e) {
            System.err.println("www.baidu.com is not a parseable URL");
        }catch (IOException e){
            System.err.println(e);
        }
    }
}

在这里插入图片描述

5. 代理

许多防火墙后面的用户或者使用AOL或其他大吞吐量ISP的用户会通过代理服务器访问Web。usignProxy()方法可以指处某个HttpURLConnection是否通过代理服务器

public abstract boolean usingProxy()

如果使用了代理,这个方法就会返回true,否则返回false。在某些环境中,使用代理服务器可能存在安全方面的信息

public class QuizCardBuilder {

    public static void main(String[] args) throws IOException {
        try{
            URL u=new URL("http://www.baidu.com");
            HttpURLConnection urlConnection=(HttpURLConnection) u.openConnection();
            System.out.println("是否使用代理:"+urlConnection.usingProxy());
        }catch (MalformedURLException e) {
            System.err.println("www.baidu.com is not a parseable URL");
        }catch (IOException e){
            System.err.println(e);
        }
    }
}

在这里插入图片描述

6. 流模式

每个发送给HTTP服务器的请求都有一个HTTP首部,首部中有一个Content-length字段,即请求主体中的字节数。首部在主体前面。不过,要写入首部,需要知道主体的长度,而在写首部的时候可能还不知道主体的长度,正常情况下,对于这个两难的问题,Java的解决办法是:对于HttpURLConnection获取的OutputStream,将写入此OutputStream的所有内容缓存,直到流关闭。此时它就可知道主体中有多少字节,所有有足够的信息来写入Content-length首部。这种模式对于响应典型的web表达的短请求载合适不过,不过对于非常长的表达或一些SOAP消息(SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换),消息负担会很大。用HTTP put发送中等到大型文档时会很浪费,也很慢,如果Java通过网络发送第一个字节之前,不需要等待写入的最后一个字节,将会高效很多。Java为这个问题提供了两种解决方法,如果你知道数据的大小,例如可以将数据的大小告诉HttpURLConnection对象。如果预先不知道数据大小,可以使用分块传输编码方式,在分块传输编码方式中,请求主体以多个部分发送,每个部分都有自己单独的内容长度。要启用分块传输编码方式,只要在连接URI之前将分块大小传入setChunkedSteamingMode(int chunkLength)方法,不过分块传输编码方式会妨碍身份认证和重定向。如果试图重定向URL或需要口令认证的URL发送分块文件,就会抛出HttpRetryException。除非确实需要,否则不要使用分块传输编码方式。
如果恰好知道请求数据的大小,可以将这个信息提供给HttpURLConnection对象,从而优化连接。如果这样做,Java会立即通过网络将数据以流方式发送。否则它必须缓存你写入的数据来确定内容长度,而且只有在你关闭流之后才能通过网络发送数据。如果知道具体数据的大小,可以将这个数据传递给下面方法:

public void setFixedLengthStreamingMode(int contentLength)
public void setFixedLengthStreamingMode(long contentLength)

java会在HTTP首部的Content-Length中使用这个数。不过,如果接下来试图写入数据多于或少于给出的这个字节数,Java会抛出IOException异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/575614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:使用Python操作股票软件:探索股票市场的新方式

使用Python操作股票软件:探索股票市场的新方式 在当今股票市场中,许多投资者正在寻找新的方式来更好地管理其投资组合。一种新的方式是使用Python编程语言操作股票软件。Python拥有简洁的语法和丰富的库来帮助投资者更好地理解和管理股票。在本文中&…

挂耳式耳机哪个牌子好?这次推荐准没错!

在校园里,上网课、复习考证、刷视频……耳机总是我的第一选择,既不会打扰别人又能有效学习,普通的入耳式耳机戴久了总是会耳道痛,甚至出现耳道发炎问题,耳机也总是很难清洁。但是生活中我又离不开耳机,所以…

【源码解析】分库分表框架 Shardingsphere 源码解析

前言 以前研究过如何使用ShardingJdbc,使用ShardingJdbc进行分库分表,但是原理方面没有细致的深入了解。如果仅仅了解如何使用的话,对于改造和排查问题,其实都是不够的,所以跟踪源码了解其运行原理是很重要的。 Demo…

GPT学习笔记-Embedding的降维与2D,3D可视化

嵌入(Embedding)在机器学习和自然语言处理中是一种表示离散变量(如单词、句子或整个文档)的方式,通常是作为高维向量或者矩阵。嵌入的目标是捕捉到输入数据中的语义信息,使得语义相近的元素在嵌入空间中的距…

STM32+UART串口+DMA收发

目录 1、cubemax端配置 1.1 初始化配置 1.2 GPIO配置 1.3 UART配置 1.3.1 串口基础配置 1.3.2 DMA配置 2、keil端代码设计 2.1 初始化配置 2.2 DMA接收初始化配置 2.3 DMA发送配置 2.4 接收回调函数设置 2.5 回调函数内容代码编写 2.5.1 接收回调函数 2.5.2 发送回调…

最优化理论-最速下降法的推导与应用

目录 1. 引言 2. 最速下降法的基本原理 3. 最速下降法的推导过程 3.1 梯度和梯度下降 3.2 最速下降法的数学表述 4. 最速下降法的应用 4.1 无约束优化问题 4.2 约束优化问题 5. 最速下降法的优缺点 6. 结论 7.代码实现 1. 引言 在最优化理论中,最速下降法…

3W字吃透:微服务网关SpringCloud gateway底层原理和实操

40岁老架构师尼恩的掏心窝: 现在拿到offer超级难,甚至连面试电话,一个都搞不到。 尼恩的技术社群中(50),很多小伙伴凭借 “左手云原生 右手大数据 SpringCloud Alibaba 微服务“三大绝活,拿…

Dock的安装和使用

1、docker基础 三大组件: 仓库、镜像、容器什么是docker: 通俗来讲就是提供服务的容器Docker 两个概念:容器:可以看做空间 例如:磁盘、文件夹 镜像:灵魂 例如:系统、应用 一个镜像可以放在多个容器中(就如同把同一个文件复制到多个磁盘或文件夹一样) 一个容器可以放多个镜…

【Nginx】实战应用(服务器端集群搭建、下载站点、用户认证模块)

文章目录 Nginx实现服务器端集群搭建Nginx与Tomcat部署环境准备(Tomcat)环境准备(Nginx) Nginx实现动静分离需求分析动静分离实现步骤 Nginx实现Tomcat集群搭建 Nginx高可用解决方案KeepalivedVRRP环境搭建Keepalived配置文件介绍访问测试keepalived之vrrp_script Nginx制作下载…

python中的常见运算符

文章目录 算数运算符赋值运算关系运算符逻辑运算符非布尔值的与或非运算条件运算符(也叫三元运算符)运算符的优先级 算数运算符 加法运算符(如果两个字符串之间进行加法运算,则会进行拼串操作) - 减法运算符 * 乘法运算符(如果将字…

小鹏汽车Q1财报:押注G6、大力降本,明年智驾BOM降半

‍作者 | 德新编辑 | 王博 小鹏汽车本周发了Q1财报,数据不好看,以致于在微博端也发了公开信。 那后续呢? 小鹏第二季度指引是,总交付数量约为2.1 - 2.2万辆,收入预计约为45 - 47亿元;四季度&#xff0c…

Selective Kernel Networks论文总结和代码实现

论文:https://arxiv.org/abs/1903.06586?contextcs 中文版:(CVPR-2019)选择性的内核网络_sk卷积 源码:GitHub - implus/SKNet: Code for our CVPR 2019 paper: Selective Kernel Networks 目录 一、论文出发点 二、论文主要工作 三、SK模…

洛谷——树

洛谷——树 文章目录 洛谷——树树的重心会议题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示数据范围 思路 树的直径【XR-3】核心城市题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路 [NOI2003] 逃学的小孩题目描述输入格式输出格式样例 #1样例…

Cocos creator实现《滑雪趣挑战》滑雪小游戏资源及代码

Cocos creator实现《滑雪趣挑战》滑雪小游戏资源及代码 最近在学习Cocos Creator,作为新手,刚刚开始学习Cocos Creator,上线了两个微信小游戏,刚刚入门,这里记录一下《滑雪趣挑战》实现及上线过程的过程。 ](https://…

vue实现深拷贝的方法

在 vue中,深拷贝是一个很有用的功能,在不改变原来对象状态的情况下,进行对象的复制。 但要实现深拷贝,需要两个对象具有相同的属性。如果两个对象不同,深拷贝也不能实现。 1.我们将变量A的属性赋给变量B,但…

springboot+java医院门诊挂号系统设计与实现ssm008

本课题的目标是使医院门诊信息管理清晰化,透明化,便于操作,易于管理。通过功能模块的优化组合实现不同的管理细节,使管理过程实现最大程度的自动化与信息化,并能自动对人工操作环节进行复查,使医院门诊挂号系统出错率降至最低。 主…

3、mqtt客户端演示(MQTT通信协议(mosquitto)发布订阅 C语言实现)

可订阅可发布模式 具体代码 客户端1代码&#xff1a;pub.c #include <stdio.h> #include <stdlib.h> #include <mosquitto.h> #include <string.h>#define HOST "localhost" #define PORT 1883 #define KEEP_ALIVE 60 #define MSG_MAX_S…

ChatGPT提示词工程进阶教学

ChatGPT提示词工程 1 两种大型语言模型LLM1.1 基础大模型&#xff08;base LLM&#xff09;1.2 指令调优大模型(Instruction Tuned LLM) 2 如何更清晰、具体地书写提示词2.1 在提示词中使用“定界符”2.2 向模型请求结构化的输出2.3 要求模型检查任务条件是否满足2.4 输入多范例…

uCOSii中的互斥信号量

uCOSii中的互斥信号量 一、互斥型信号量项管理 (MUTUAL EXCLUSION SEMAPHORE MANAGEMENT) OSMutexAccept() 无条件等待地获取互斥型信号量 OSMutexCreate() 建立并初始化一个互斥型信号量 OSMutexDel() 删除互斥型信号量 OSMutexPend() 等待一个互斥型信号量 OSMutexPost…

扬帆起航——Qt自定义控件介绍

文章目录 前言自定义控件的定义自定义控件的好处如何实现自定义控件实现没有自带的控件 如何使用自定义控件测试和优化常见的自定义控件总结 前言 Qt 提供了丰富的控件、工具和库&#xff0c;可以帮助开发人员快速创建现代化的跨平台应用程序。但是对于某些特殊的需求&#xf…