Maison Java javaDidacticiel URLConnection的连接、超时、关闭用法总结

URLConnection的连接、超时、关闭用法总结

Dec 20, 2016 pm 01:46 PM
SUN .net

Java中可以使用HttpURLConnection来请求WEB资源。

 

1、 URL请求的类别

分为二类,GET与POST请求。二者的区别在于:
a:) get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,
b:) post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。

 

2、URLConnection的对象问题

Java代码 

URL url = new URL("http://localhost:8080/TestHttpURLConnectionPro.do");  

  

URLConnection rulConnection = url.openConnection();// 此处的urlConnection对象实际上是根据URL的  

          // 请求协议(此处是http)生成的URLConnection类  

          // 的子类HttpURLConnection,故此处最好将其转化  

          // 为HttpURLConnection类型的对象,以便用到  

          // HttpURLConnection更多的API.如下:  

  

HttpURLConnection httpUrlConnection = (HttpURLConnection) rulConnection;  

 

3、HttpURLConnection对象参数问题

Java代码 

// 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在  

// http正文内,因此需要设为true, 默认情况下是false;  

httpUrlConnection.setDoOutput(true);  

  

// 设置是否从httpUrlConnection读入,默认情况下是true;  

httpUrlConnection.setDoInput(true);  

  

// Post 请求不能使用缓存  

httpUrlConnection.setUseCaches(false);  

  

// 设定传送的内容类型是可序列化的java对象  

// (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)  

httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object");  

  

// 设定请求的方法为"POST",默认是GET  

httpUrlConnection.setRequestMethod("POST");  

  

// 连接,从上述第2条中url.openConnection()至此的配置必须要在connect之前完成,  

        httpUrlConnection.connect();  

 

4、HttpURLConnection连接问题

Java代码 

// 此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法,  

// 所以在开发中不调用上述的connect()也可以)。  

OutputStream outStrm = httpUrlConnection.getOutputStream();  

 

5、HttpURLConnection写数据与发送数据问题

Java代码 

// 现在通过输出流对象构建对象输出流对象,以实现输出可序列化的对象。  

ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm);  

  

// 向对象输出流写出数据,这些数据将存到内存缓冲区中  

objOutputStrm.writeObject(new String("我是测试数据"));  

  

// 刷新对象输出流,将任何字节都写入潜在的流中(些处为ObjectOutputStream)  

objOutputStm.flush();  

  

// 关闭流对象。此时,不能再向对象输出流写入任何数据,先前写入的数据存在于内存缓冲区中,  

// 在调用下边的getInputStream()函数时才把准备好的http请求正式发送到服务器  

objOutputStm.close();  

  

// 调用HttpURLConnection连接对象的getInputStream()函数,  

// 将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端。  

InputStream inStrm = httpConn.getInputStream(); // <===注意,实际发送请求的代码段就在这里  

  

// 上边的httpConn.getInputStream()方法已调用,本次HTTP请求已结束,下边向对象输出流的输出已无意义,  

// 既使对象输出流没有调用close()方法,下边的操作也不会向对象输出流写入任何数据.  

// 因此,要重新发送数据时需要重新创建连接、重新设参数、重新创建流对象、重新写数据、  

// 重新发送数据(至于是否不用重新这些操作需要再研究)  

objOutputStm.writeObject(new String(""));  

httpConn.getInputStream();  

 

6、post参数的方法

Java代码 

OutputStream os = httpConn.getOutputStream();  

            String param = new String();  

            param = "CorpID=" + CorpID +  

                    "&LoginName=" + LoginName+  

                    "&send_no=" + phoneNumber +  

                    "&msg=" + java.net.URLEncoder.encode(msg,"GBK"); ;  

            os.write(param.getBytes());  

 

7、超时设置,防止 网络异常的情况下,可能会导致程序僵死而不继续往下执行

Java代码 

System.setProperty("sun.net.client.defaultConnectTimeout", "30000");  

System.setProperty("sun.net.client.defaultReadTimeout", "30000");  

  

其中: sun.net.client.defaultConnectTimeout:连接主机的超时时间(单位:毫秒)  

sun.net.client.defaultReadTimeout:从主机读取数据的超时时间(单位:毫秒)  

  

JDK 1.5以前的版本,只能通过设置这两个系统属性来控制网络超时。在1.5中,还可以使用HttpURLConnection的父类URLConnection的以下两个方法:  

setConnectTimeout:设置连接主机超时(单位:毫秒)  

setReadTimeout:设置从主机读取数据超时(单位:毫秒)  

  

例如:  

HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();  

urlCon.setConnectTimeout(30000);  

urlCon.setReadTimeout(30000);  

 

 

 

总结:

 

a: HttpURLConnection的connect()函数,实际上只是建立了一个与服务器的tcp连接,并没有实际发送http请求。
无论是post还是get,http请求实际上直到HttpURLConnection的getInputStream()这个函数里面才正式发送出去。
b:在用POST方式发送URL请求时,URL请求参数的设定顺序是重中之重,
对connection对象的一切配置(那一堆set函数)
都必须要在connect()函数执行之前完成。而对outputStream的写操作,又必须要在inputStream的读操作之前。
这些顺序实际上是由http请求的格式决定的。
如果inputStream读操作在outputStream的写操作之前,会抛出例外:
java.net.ProtocolException: Cannot write output after reading input.......
 
c:http请求实际上由两部分组成,
一个是http头,所有关于此次http请求的配置都在http头里面定义,
一个是正文content。
connect()函数会根据HttpURLConnection对象的配置值生成http头部信息,因此在调用connect函数之前,
就必须把所有的配置准备好。
d: 在http头后面紧跟着的是http请求的正文,正文的内容是通过outputStream流写入的,
实际上outputStream不是一个网络流,充其量是个字符串流,往里面写入的东西不会立即发送到网络,
而是存在于内存缓冲区中,待outputStream流关闭时,根据输入的内容生成http正文。
至此,http请求的东西已经全部准备就绪。在getInputStream()函数调用的时候,就会把准备好的http请求
正式发送到服务器了,然后返回一个输入流,用于读取服务器对于此次http请求的返回信息。由于http
请求在getInputStream的时候已经发送出去了(包括http头和正文),因此在getInputStream()函数
之后对connection对象进行设置(对http头的信息进行修改)或者写入outputStream(对正文进行修改)
都是没有意义的了,执行这些操作会导致异常的发生。


Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Partagez plusieurs frameworks de projets open source .NET liés à l'IA et au LLM Partagez plusieurs frameworks de projets open source .NET liés à l'IA et au LLM May 06, 2024 pm 04:43 PM

Le développement des technologies d’intelligence artificielle (IA) bat son plein aujourd’hui et elles ont montré un grand potentiel et une grande influence dans divers domaines. Aujourd'hui, Dayao partagera avec vous 4 cadres de projets liés au modèle d'IA open source .NET LLM, dans l'espoir de vous fournir une référence. https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel est un kit de développement logiciel (SDK) open source conçu pour intégrer de grands modèles de langage (LLM) tels qu'OpenAI, Azure

Quelles sont les perspectives d'emploi du C# ? Quelles sont les perspectives d'emploi du C# ? Oct 19, 2023 am 11:02 AM

Que vous soyez débutant ou professionnel expérimenté, la maîtrise du C# ouvrira la voie à votre carrière.

Whale Address continue de se débarrasser de SUN, suscitant l'inquiétude des investisseurs Whale Address continue de se débarrasser de SUN, suscitant l'inquiétude des investisseurs Sep 13, 2024 pm 09:11 PM

Une grande adresse de baleine, qui avait auparavant déchargé des quantités importantes de SUN, a vendu un jeton d'une valeur supplémentaire d'un million de dollars au cours des deux dernières heures.

Différences de performances entre le framework Java et le framework .NET Différences de performances entre le framework Java et le framework .NET Jun 03, 2024 am 09:19 AM

En termes de traitement des requêtes à haute concurrence, .NETASP.NETCoreWebAPI fonctionne mieux que JavaSpringMVC. Les raisons incluent : la compilation précoce AOT, qui réduit le temps de démarrage, une gestion plus raffinée de la mémoire, où les développeurs sont responsables de l'allocation et de la libération de la mémoire des objets.

Technologie d'optimisation des performances .NET pour les développeurs Technologie d'optimisation des performances .NET pour les développeurs Sep 12, 2023 am 10:43 AM

Si vous êtes un développeur .NET, vous devez être conscient de l'importance d'optimiser les fonctionnalités et les performances pour fournir des logiciels de haute qualité. En utilisant de manière experte les ressources fournies et en réduisant les temps de chargement des sites Web, vous créez non seulement une expérience agréable pour vos utilisateurs, mais vous réduisez également les coûts d'infrastructure.

Binance Futures ajoute les contrats perpétuels à marge USDⓈ POPCAT et SUN Binance Futures ajoute les contrats perpétuels à marge USDⓈ POPCAT et SUN Aug 23, 2024 am 12:09 AM

Binance Futures a annoncé l'introduction de deux nouveaux contrats perpétuels à marge USDⓈ comprenant les jetons POPCAT et SUN.

Les pièces Telegram Meme menacent de briser le réseau Ton Les pièces Telegram Meme menacent de briser le réseau Ton Aug 29, 2024 pm 09:56 PM

Les pièces de monnaie Telegram sont sous les projecteurs depuis un certain temps en raison de la technologie des mini-applications trop réussies sur la plate-forme de messagerie.

Baby Doge et SUN s'envolent alors que les pièces Meme rejoignent la hausse plus large du marché de la cryptographie Baby Doge et SUN s'envolent alors que les pièces Meme rejoignent la hausse plus large du marché de la cryptographie Sep 19, 2024 pm 09:35 PM

La plupart des pièces meme ont reflété des gains jeudi, rejoignant Bitcoin (BTC) et Ether (ETH) en affichant des augmentations significatives.

See all articles