1.SSL单向验证时
代码如下:
Java代码
import java.io.IOException
import java.util.HashMap
import java.util.Map
import org.apache.commons.httpclient.HttpClient
import org.apache.commons.httpclient.HttpException
import org.apache.commons.httpclient.HttpStatus
import org.apache.commons.httpclient.NameValuePair
import org.apache.commons.httpclient.methods.PostMethod
import org.apache.commons.httpclient.params.HttpClientParams
import org.apache.commons.httpclient.params.HttpMethodParams
import org.apache.commons.logging.Log
import org.apache.commons.logging.LogFactory
public class ClientSendData {
static Log log = LogFactory.getLog(ClientSendData.class)
private String Url
// 初始化数据
public ClientSendData() {
Url = "https://test.yihaodian.com:8443/ims/feedbackToPingAn_getData.action"
}
public String sendData(String data) {
String receivedData = null
try {
Map<String, String>paramsData = new HashMap<String, String>()
paramsData.put("data", data)
receivedData = send(Url, paramsData)
} catch (Exception e) {
e.printStackTrace()
}
return receivedData
}
public static String send(String url, Map<String, String>paramsMap) {
String result = null
PostMethod postMethod = null
HttpClient httpClient = new HttpClient()
httpClient.getParams().setParameter(
HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8")
postMethod = new PostMethod(url)
if (paramsMap != null &&paramsMap.size() >0) {
NameValuePair[] datas = new NameValuePair[paramsMap.size()]
int index = 0
for (String key : paramsMap.keySet()) {
datas[index++] = new NameValuePair(key, paramsMap.get(key))
}
postMethod.setRequestBody(datas)
}
HttpClientParams httparams = new HttpClientParams()
httparams.setSoTimeout(60000)
postMethod.setParams(httparams)
try {
int statusCode = httpClient.executeMethod(postMethod)
if (statusCode == HttpStatus.SC_OK) {
result = postMethod.getResponseBodyAsString()
log.info("发送成功!")
} else {
log.error(" http response status is " + statusCode)
}
} catch (HttpException e) {
log.error("error url=" + url, e)
} catch (IOException e) {
log.error("error url=" + url, e)
} finally {
if (postMethod != null) {
postMethod.releaseConnection()
}
}
return result
}
public static void main(String[] args) {
ClientSendData t = new ClientSendData()
t.sendData("测试SSL单项连接,向服务端发送数据!")
}
}
可能出现的异常
1.java.net.ConnectException: Connection refused: connect
服务器没有启动
2 .javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed
服务端的证书是不可信的。解决办法见这篇文章 http://zhuyuehua.iteye.com/blog/1102347
3.java.net.SocketException: Software caused connection abort: recv failed
这是由于服务端配置的是SSL双向认证,而客户端发送数据是按照服务器是单向认证时发送的,即没有将客户端证书信息一起发送给服务端。
4.org.apache.commons.httpclient.NoHttpResponseException
这一般是服务端防火墙的原因。拦截了客户端请求。
另外,当服务端负载过重时,也会出现此问题。
5.javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
这是由于服务端配置的是SSL双向认证,而客户端发送数据是按照服务器是单向认证时发送的,即没有将客户端证书信息一起发送给服务端。服务端验证客户端证书时,发现客户端没有证书,然后就断开了握手连接。
2.SSL双向验证时
双向验证时,暂时不知道如何用HTTPCLIENT发送数据,如需要双向验证时发送数据,参考我另外的文章。另外,有知道HTTPCLIENT如何在双向验证时发送数据的,恳请指教。
Server-Sent 事件 - 单向消息传递Server-Sent 事件指的是网页自动获取来自服务器的更新。以前也可能做到这一点,前提是网页不得不询问是否有可用的更新。通过服务器发送事件,更新能够自动到达。例子:Facebook/Twitter 更新、估价更新、新的博文、赛事结果等。浏览器支持所有主流浏览器均支持服务器发送事件,除了 Internet Explorer。接收Server-Sent 事件通知EventSource 对象用于接收服务器发送事件通知:实例var source=new EventSource("demo_sse.php")source.onmessage=function(event) { document.getElementById("result").innerHTML+=event.data + "<br />"}例子解释:创建一个新的 EventSource 对象,然后规定发送更新的页面的 URL(本例中是 "demo_sse.php")每接收到一次更新,就会发生 onmessage 事件当onmessage 事件发生时,把已接收的数据推入 id 为 "result" 的元素中检测Server-Sent 事件支持在上面的 TIY 实例中,我们编写了一段额外的代码来检测服务器发送事件的浏览器支持情况:if(typeof(EventSource)!=="undefined") { // Yes! Server-sent events support! // Some code..... } else { // Sorry! No server-sent events support.. } 服务器端代码实例为了让上面的例子可以运行,您还需要能够发送数据更新的服务器(比如 PHP 和 ASP)。服务器端事件流的语法是非常简单的。把 "Content-Type" 报头设置为 "text/event-stream"。现在,您可以开始发送事件流了。欢迎分享,转载请注明来源:夏雨云
评论列表(0条)