- 浏览: 314735 次
- 性别:
- 来自: 重庆
文章分类
- 全部博客 (286)
- 设计模式 (14)
- spring (5)
- 开发工具 (12)
- java (19)
- apache.commons工具 (7)
- ibaits (5)
- extjs4.0 (4)
- 数据库 (2)
- spring工具类 (2)
- jquery1.8 (32)
- 杂记 (1)
- linux (2)
- Quart (1)
- springMVC (2)
- webservice (1)
- oracle (5)
- dwr (6)
- jbmp3 (27)
- lucene3.5 (27)
- javascript (18)
- hibernate3.3.2 (27)
- spring事务管理 (10)
- nio (2)
- strust2 (3)
- jvm (7)
- jquery-easyui-1.2.6 (22)
- 多线程 (14)
- maven (3)
- 常用正则表达式 (4)
最新评论
-
HF_SKY000:
请问:
一、能否提供一下密钥库文件的生成方法?
二、密钥库的密 ...
Java sslSocket 聊天实例
下边的总结对我帮助蛮大的~不仅用法了解,整个连接流程也要明白!
原文链接地址:
http://www.blogjava.net/supercrsky/articles/247449.html
针对JDK中的URLConnection连接Servlet的问题,网上有虽然有所涉及,但是只是说明了某一个或几个问题,是以FAQ的方式来解决的,而且比较零散,现在对这个类的使用就本人在项目中的使用经验做如下总结:
1:> URL请求的类别:
分为二类,GET与POST请求。二者的区别在于:
a:) get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,
b:) post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
2:> URLConnection的对象问题:
URLConnection的对象,如下代码示例:
// 下面的index.jsp由<servlet-mapping>映射到
// 一个Servlet(com.quantanetwork.getClientDataServlet)
// 该Servlet的注意点下边会提到
1 URL url = new URL("http://localhost:8080/TestHttpURLConnectionPro/index.jsp"); 2 3 URLConnection rulConnection = url.openConnection(); 4 // 此处的urlConnection对象实际上是根据URL的 5 // 请求协议(此处是http)生成的URLConnection类 6 // 的子类HttpURLConnection,故此处最好将其转化 7 // 为HttpURLConnection类型的对象,以便用到 8 // HttpURLConnection更多的API.如下: 9 10 HttpURLConnection httpUrlConnection = (HttpURLConnection) rulConnection;
3:> HttpURLConnection对象参数问题
1 // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在 2 // http正文内,因此需要设为true, 默认情况下是false; 3 httpUrlConnection.setDoOutput(true); 4 5 // 设置是否从httpUrlConnection读入,默认情况下是true; 6 httpUrlConnection.setDoInput(true); 7 8 // Post 请求不能使用缓存 9 httpUrlConnection.setUseCaches(false); 10 11 // 设定传送的内容类型是可序列化的java对象 12 // (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException) 13 httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object"); 14 15 // 设定请求的方法为"POST",默认是GET 16 httpUrlConnection.setRequestMethod("POST"); 17 18 // 连接,从上述第2条中url.openConnection()至此的配置必须要在connect之前完成, 19 httpUrlConnection.connect();
4:> HttpURLConnection连接问题:
1 // 此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法, 2 // 所以在开发中不调用上述的connect()也可以)。 3 OutputStream outStrm = httpUrlConnection.getOutputStream();
5:> HttpURLConnection写数据与发送数据问题:
1 1 // 现在通过输出流对象构建对象输出流对象,以实现输出可序列化的对象。 2 2 ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm); 3 3 4 4 // 向对象输出流写出数据,这些数据将存到内存缓冲区中 5 5 objOutputStrm.writeObject(new String("我是测试数据")); 6 6 7 7 // 刷新对象输出流,将任何字节都写入潜在的流中(些处为ObjectOutputStream) 8 8 objOutputStm.flush(); 9 9 10 10 // 关闭流对象。此时,不能再向对象输出流写入任何数据,先前写入的数据存在于内存缓冲区中, 11 11 // 在调用下边的getInputStream()函数时才把准备好的http请求正式发送到服务器 12 12 objOutputStm.close(); 13 13 14 14 // 调用HttpURLConnection连接对象的getInputStream()函数, 15 15 // 将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端。 16 16 InputStream inStrm = httpConn.getInputStream(); // <===注意,实际发送请求的代码段就在这里 17 17 18 18 // 上边的httpConn.getInputStream()方法已调用,本次HTTP请求已结束,下边向对象输出流的输出已无意义, 19 19 // 既使对象输出流没有调用close()方法,下边的操作也不会向对象输出流写入任何数据. 20 20 // 因此,要重新发送数据时需要重新创建连接、重新设参数、重新创建流对象、重新写数据、 21 21 // 重新发送数据(至于是否不用重新这些操作需要再研究) 22 22 objOutputStm.writeObject(new String("")); 23 23 httpConn.getInputStream()
总结: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(对正文进行修改)
都是没有意义的了,执行这些操作会导致异常的发生。
6:> Servlet端的开发注意点:
a:) 对于客户端发送的POST类型的HTTP请求,Servlet必须实现doPost方法,而不能用doGet方法。
b:) 用HttpServletRequest的getInputStream()方法取得InputStream的对象,比如:
InputStream inStream = httpRequest.getInputStream();
现在调用inStream.available()(该方法用于“返回此输入流下一个方法调用可以不受阻塞地
从此输入流读取(或跳过)的估计字节数”)时,永远都反回0。试图使用此方法的返回值分配缓冲区,
以保存此流所有数据的做法是不正确的。那么,现在的解决办法是
Servlet这一端用如下实现:
InputStream inStream = httpRequest.getInputStream();
ObjectInputStream objInStream = new ObjectInputStream(inStream);
Object obj = objInStream.readObject();
// 做后续的处理
// 。。。。。。
// 。。。 。。。
而客户端,无论是否发送实际数据都要写入一个对象(那怕这个对象不用),如:
ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm);
objOutputStrm.writeObject(new String("")); // 这里发送一个空数据
// 甚至可以发一个null对象,服务端取到后再做判断处理。
objOutputStrm.writeObject(null);
objOutputStrm.flush();
objOutputStrm.close();
注意:上述在创建对象输出流ObjectOutputStream时,如果将从HttpServletRequest取得的输入流
(即:new ObjectOutputStream(outStrm)中的outStrm)包装在BufferedOutputStream流里面,
则必须有objOutputStrm.flush();这一句,以便将流信息刷入缓冲输出流.如下:
ObjectOutputStream objOutputStrm = new ObjectOutputStream(new BufferedOutputStream(outStrm));
objOutputStrm.writeObject(null);
objOutputStrm.flush(); // <======此处必须要有.
objOutputStrm.close();
HttpURLConnection是基于HTTP协议的,其底层通过socket通信实现。如果不设置超时(timeout),在网络异常的情况下,可能会导致程序僵死而不继续往下执行。可以通过以下两个语句来设置相应的超时:
System.setProperty("sun.net.client.defaultConnectTimeout", 超时毫秒数字符串);
System.setProperty("sun.net.client.defaultReadTimeout", 超时毫秒数字符串);
其中: sun.net.client.defaultConnectTimeout:连接主机的超时时间(单位:毫秒)
sun.net.client.defaultReadTimeout:从主机读取数据的超时时间(单位:毫秒)
例如:
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
System.setProperty("sun.net.client.defaultReadTime
Java中可以使用HttpURLConnection来请求WEB资源。
HttpURLConnection对象不能直接构造,需要通过URL.openConnection()来获得HttpURLConnection对象,示例代码如下:
1 String szUrl = "http://www.ee2ee.com/"; 2 URL url = new URL(szUrl); 3 HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
HttpURLConnection是基于HTTP协议的,其底层通过socket通信实现。如果不设置超时(timeout),在网络异常的情况下,可能会导致程序僵死而不继续往下执行。可以通过以下两个语句来设置相应的超时:
System.setProperty("sun.net.client.defaultConnectTimeout", 超时毫秒数字符串);
System.setProperty("sun.net.client.defaultReadTimeout", 超时毫秒数字符串);
其中: sun.net.client.defaultConnectTimeout:连接主机的超时时间(单位:毫秒)
sun.net.client.defaultReadTimeout:从主机读取数据的超时时间(单位:毫秒)
例如:
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
System.setProperty("sun.net.client.defaultReadTimeout", "30000");
JDK 1.5以前的版本,只能通过设置这两个系统属性来控制网络超时。在1.5中,还可以使用HttpURLConnection的父类URLConnection的以下两个方法:
setConnectTimeout:设置连接主机超时(单位:毫秒)
setReadTimeout:设置从主机读取数据超时(单位:毫秒)
例如:
1 HttpURLConnection urlCon = (HttpURLConnection)url.openConnection(); 2 urlCon.setConnectTimeout(30000); 3 urlCon.setReadTimeout(30000);
需要注意的是,笔者在JDK1.4.2环境下,发现在设置了defaultReadTimeout的情况下,如果发生网络超时,HttpURLConnection会自动重新提交一次请求,出现一次请求调用,请求服务器两次的问题(Trouble)。我认为这是JDK1.4.2的一个bug。在JDK1.5.0中,此问题已得到解决,不存在自动重发现象。out", "3000
发表评论
-
http协议 文件下载原理及多线程断点续传
2014-06-18 17:28 1529最近研究了一下关于文件下载的相关内容,觉得还是写些东西记下 ... -
Java安全通信:HTTPS与SSL
2014-04-18 17:37 6561. HTTPS概念 1)简介 ... -
Java KeyStore的类型
2014-04-18 15:05 832JKS和JCEKS是Java密钥库(KeyStore)的两种 ... -
对https的理解
2014-03-20 11:39 1816一、什么是HTTPS在说HTTPS之前先说说什么是HTTP ... -
BigDecimal四舍五入的问题
2013-03-15 10:33 970System.out.println(new BigDec ... -
java正则表达式
2012-08-28 11:34 1142在Sun的Java JDK 1.40版本中 ... -
JAVA中使用FTPClient实现文件上传下载
2012-08-24 15:48 803在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上 ... -
java 数字签名
2012-08-07 11:04 1178发送报文时,发送方用 ... -
Java进行数据加密
2012-06-26 16:41 913本文主要谈一下密码学 ... -
常见加密算法
2012-06-26 16:24 1012DES(Data Encryption Standard):对 ... -
消息摘要
2012-06-26 16:22 831消息摘要(Message Digest)又称为数字摘要(D ... -
UML 依赖 关联 聚合 组合
2012-06-25 09:54 1287<1>依赖 依赖关系用虚线加箭头表示,如图所示: ... -
Java sslSocket 聊天实例
2012-06-18 10:46 2123------------------------------- ... -
keytool证书与密钥管理
2012-06-18 10:44 14691)创建服务端密钥库 > ... -
Java ssl socket 双向认证
2012-06-18 10:37 1622总体思路步骤是 1. 分别生成客户端何服务器端 ... -
从JKS文件中读取密钥
2012-06-17 23:45 1696JKS文件是一个java中的密钥管理库,里面可以放各种密钥文件 ... -
JAVA String.format 方法使用介绍
2012-06-13 16:51 761JAVA String.format 方法使用 ... -
java i/o
2010-07-16 14:33 842java.io在Java类库中,IO部分的内容是很庞大的,因为 ...
相关推荐
本篇文章将深入探讨HttpURLConnection的使用方法、特性以及一些关键的示例代码。 一、HttpURLConnection简介 HttpURLConnection继承自URLConnection,它提供了对HTTP协议的直接支持。相比于HttpClient,...
在本文中,我们将深入探讨`HttpURLConnection`的使用,包括GET和POST请求的实现,以及如何处理可能出现的乱码问题。 一、`HttpURLConnection`概述 `HttpURLConnection`是`URLConnection`的子类,专门用于处理HTTP...
本篇文章将深入探讨如何在Android中简单使用`HttpURLConnection`进行网络请求。 首先,了解`HttpURLConnection`的基本用法。在Android中,网络操作通常在子线程(非UI线程)中进行,以避免阻塞主线程导致应用无响应...
Java HttpURLConnection 使用方法详解 Java HttpURLConnection 是 Java 中用于发送 HTTP 请求的类,通过使用 HttpURLConnection,可以发送 GET 请求和 POST 请求,並获取服务器的响应结果。下面是使用 Java ...
本篇文章将深入探讨如何使用`HttpURLConnection`以POST方式提交请求。 ### 1. 创建连接 首先,我们需要获取到`HttpURLConnection`实例。这通常通过调用`URL`对象的`openConnection()`方法实现,然后强制转换为`...
默认情况下,HttpURLConnection使用GET方法。若需使用POST、PUT等其他方法,需调用setRequestMethod()方法: ```java connection.setRequestMethod("POST"); ``` 4. 添加请求头: 可以通过setRequestProperty()或...
默认情况下,HttpURLConnection使用GET方法。要使用POST、PUT等其他方法,需设置请求方法: ```java connection.setRequestMethod("POST"); ``` ### 4. 设置请求属性 你可以设置HTTP头来控制请求的各个方面,如...
**一、HttpURLConnection使用步骤** 1. **建立连接**:通过`java.net.URL`对象打开与服务器的连接,然后调用`openConnection()`方法得到`HttpURLConnection`实例。 2. **设置请求方法**:通常我们使用`...
在给定的代码片段中,展示了如何使用`HttpURLConnection`进行文件下载。 首先,我们看到代码引入了`java.io`、`java.net`和`java.util`这三个包。`java.io`包含了输入/输出流,用于处理数据的读写;`java.net`包含...
在本例中,我们将探讨如何使用`HttpURLConnection`来下载图片,这是一个基础但实用的网络编程任务。下面我们将详细介绍这个过程,并涉及到的相关知识点。 1. **HttpURLConnection简介**: `HttpURLConnection`是`...
1. **创建连接**:使用`URL`对象构造一个`HttpURLConnection`实例,通常会通过`openConnection()`方法来实现。例如: ```java URL url = new URL("http://yourserver.com/upload"); HttpURLConnection connection...
在使用HttpUrlConnection发送GET请求时,我们将参数附加到URL上。例如,如果我们要从一个API获取JSON数据,URL可能类似于`http://api.example.com/data?key=value`。然后,我们可以创建一个HttpURLConnection实例,...
本篇文章将详细讲解如何使用`HttpURLConnection`实现文件上传,同时涉及到服务器端处理上传文件的代码。我们将讨论以下核心知识点: 1. **HttpURLConnection介绍**: `HttpURLConnection`是Java标准库中的类,它是...
没测试通过的HttpURLConnection使用
在Android开发中,网络编程是不可或...使用HttpURLConnection可以方便地实现这些操作,提高应用的用户体验。在实际开发中,我们还需要考虑多线程下载、并发控制、下载队列管理等高级特性,以进一步优化性能和资源利用。
### 使用HttpURLConnection发送短信 在Java开发中,通过网络接口实现短信发送是一种常见的应用场景,例如在用户注册、找回密码等场景下验证用户身份时。本文将详细介绍如何利用`HttpURLConnection`来实现短信发送...
当我们使用`HttpURLConnection`时,有几个重要的知识点需要了解: 1. **连接与读取超时**: 描述中提到的“设置超时”至关重要。默认情况下,`HttpURLConnection`没有设置超时,如果网络出现问题,程序可能会...
本文将详细介绍如何使用`HttpURLConnection`和`HttpClient`这两种方式来实现这一目标。 首先,让我们从`HttpURLConnection`开始。`HttpURLConnection`是Java内置的HTTP客户端,它简单且易于使用,适用于轻量级的...
首先,我们来看使用HttpURLConnection的方式。HttpURLConnection是Java标准库提供的类,它直接继承自URLConnection,支持HTTP和HTTPS协议。以下是一个简单的使用示例: ```java public class HttpHelper { // 使用...
在"HttpURLConnection的使用二"这个主题中,我们可能讨论的是在初识`HttpURLConnection`的基础上,深入理解其高级特性和实践技巧。`HttpURLConnection`的主要功能包括: 1. **设置请求方法**:默认情况下,`...