`
liulanghan110
  • 浏览: 1079627 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

客户端如何向https服务器发送数据

    博客分类:
  • JAVA
 
阅读更多

https一般来说有单项SSL和双向SSL连接之分。

 

单项SSL连接,也就是只是客户端验证服务器证书。tomcat中clientAuth="false"的时候

 

代码如下:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;
import java.util.Date;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class ClientSendData {
	static Log log = LogFactory.getLog(ClientSendData.class);
	// 客户端信任的证书
	private String sslTrustStore;
	private String sslTrustStorePassword;
	private String Url;

	//初始化数据
	public ClientSendData() {
		sslTrustStore = "D:/ssl/clientTrust.jks";
		sslTrustStorePassword = "123456";
		Url = "https://。。。/。。_getData.action";
	}

	public String sendData(String data) {
		String receivedData = null;
		try {
			//设置系统参数
			System.setProperty("javax.net.ssl.trustStore", sslTrustStore);
			System.setProperty("javax.net.ssl.trustStorePassword",
					sslTrustStorePassword);
			receivedData = send(Url, data);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return receivedData;
	}

	public static String send(String sendurl, String sendData)
			throws Exception {
		URL url = new URL(sendurl);
		HostnameVerifier hv = new HostnameVerifier() {
			public boolean verify(String urlHostName, SSLSession session) {
				return true;
			}
		};
		System.setProperty("java.protocol.handler.pkgs","sun.net.www.protocol");
		HttpsURLConnection.setDefaultHostnameVerifier(hv);
		Date current = new Date(System.currentTimeMillis());
		log.info("begint to open connection at " + current);
		HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
		Date end = new Date(System.currentTimeMillis());
		log.info("open connection ok at " + end + ",cost:"+ (end.getTime() - current.getTime()));
		connection.setRequestProperty("Content-Type", "text/xml");
		connection.setDoOutput(true);
		connection.setDoInput(true);
		connection.setRequestMethod("POST");
		connection.setUseCaches(false);
		connection.setReadTimeout(30000);
		byte data[] = sendData.getBytes();
		current = new Date(System.currentTimeMillis());
		log.info("[SSLIX]notifyEai,begint to write data at " + current);
		OutputStream out = connection.getOutputStream();
		out.write(data);
		end = new Date(System.currentTimeMillis());
		log.info("write data ok at " + end + ",cost:"
				+ (end.getTime() - current.getTime()));
		StringBuffer receivedData = new StringBuffer();
		current = new Date(System.currentTimeMillis());
		log.info("begint to read data at " + current);
		InputStreamReader inReader = new InputStreamReader(connection
				.getInputStream(), "UTF-8");
		BufferedReader aReader = new BufferedReader(inReader);
		String aLine;
		while ((aLine = aReader.readLine()) != null) {
			receivedData.append(aLine);
		}
		end = new Date(System.currentTimeMillis());
		log.info("read data ok at " + end + ",cost:"
				+ (end.getTime() - current.getTime()));

		log.info("开始返回状态码");
		Integer statusCode = connection.getResponseCode();
		log.info("返回状态码:" + statusCode);
		aReader.close();
		connection.disconnect();
		return receivedData.toString();
	}

	public static void main(String[] args) {
		ClientSendData t = new ClientSendData();
		t.sendData("测试SSL单项连接,向服务端发送数据!");
	}
}

 单项认证时,只需要设置客户端信任的证书库就行。但是当是双向认证时,还需要设置客户端密钥库密码。

代码如下:

 

public class ClientSendData {
	static Log log = LogFactory.getLog(EaiChannel.class);
	//客户端密钥库
	private String sslKeyStorePath;
	private String sslKeyStorePassword;
	private String sslKeyStoreType;
	// 客户端信任的证书
	private String sslTrustStore;
	private String sslTrustStorePassword;
	private String eaiUrl;

	//初始化数据
	public ClientSendData() {
		sslKeyStorePath = "D:/ssl/clientKeys.jks";
		sslKeyStorePassword	 = "123456";
		sslKeyStoreType = "JKS"; //密钥库类型,有JKS PKCS12等
		sslTrustStore = "D:/ssl/clientTrust.jks";
		sslTrustStorePassword = "123456";
		eaiUrl = "https://。。。/。。。_getData.action";
	}

	public String sendData(String data) {
		String receivedData = null;
		try {
			
			 System.setProperty("javax.net.ssl.keyStore", sslKeyStorePath);
			 System.setProperty("javax.net.ssl.keyStorePassword",sslKeyStorePassword);
			 System.setProperty("javax.net.ssl.keyStoreType", sslKeyStoreType);
			//设置系统参数
			System.setProperty("javax.net.ssl.trustStore", sslTrustStore);
			System.setProperty("javax.net.ssl.trustStorePassword",
					sslTrustStorePassword);
			receivedData = send(eaiUrl, data);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return receivedData;
	}

	public static String send(String sendurl, String sendData)
			throws Exception {
		//和上面一样
	}

	public static void main(String[] args) {
		ClientSendData t = new ClientSendData();
		t.sendData("测试SSL双项连接,向服务端发送数据!");
	}
}

 

下面来说说可能会遇到的异常:

1. java.security.NoSuchAlgorithmException

 

一般来说是密钥库类型不对,如上面的sslKeyStoreType = "JKS" 却写成PKCS12。

 

也有可能是证书的问题。

 

2. java.net.UnknownHostException

 

服务端地址不对。

 

3.java.net.SocketException: Unexpected end of file from server

 

这个异常和客户端没有关系,说明已经发送成功。是服务端的问题。有可能是防火墙的原因,也可能是服务端没处理客户端的响应。

另外有人说当URL过长时也会发生此错误,当使用URL发送数据时,可以参考此意见。

 客户端数据格式不对也会导致此问题。

4.java.io.IOException:server returned HTTP response code :500

 

 

这个异常是服务端代码的问题。服务端相应代码执行时抛出了异常。

 

 

最后 如果返回的状态码是200 ,表示成功。

 

 

 

分享到:
评论
2 楼 liulanghan110 2012-09-24  
stevenjohn 写道
写的不错,这几天正好自己公司再用HTTPS,我做了https的双向验证,找了好久,终于找到一个能请求https服务的代码。


楼主好人,楼主辛苦了,楼主一生平安

我之前做的时候也是摸索了好久,资料不太好找。
1 楼 stevenjohn 2012-09-23  
写的不错,这几天正好自己公司再用HTTPS,我做了https的双向验证,找了好久,终于找到一个能请求https服务的代码。


楼主好人,楼主辛苦了,楼主一生平安

相关推荐

    头歌UDP Ping程序实现-客户端向服务器发送消息并接收消息.txt

    头歌UDP Ping程序实现-客户端向服务器发送消息并接收消息.txt头歌UDP Ping程序实现-客户端向服务器发送消息并接收消息.txt头歌UDP Ping程序实现-客户端向服务器发送消息并接收消息.txt头歌UDP Ping程序实现-客户端向...

    客户端连接服务器并发送数据测试.rar

    "客户端连接服务器并发送数据测试.rar"是一个专为服务器协议测试设计的工具,它允许我们模拟客户端行为,向服务器发送数据并接收响应,以确保服务器的数据处理能力正常运作。这个压缩包中的"MFCApplication3"很可能...

    QT之TCP实现客户端接收和发送数据

    利用QT实现客户端的接收和发送数据.............................................................................................

    C# Socket_服务端向指定的客户端发送消息(包含服务器)

    在C#中,我们可以使用Socket的`Send()`方法向对端发送数据。数据通常需要先转换为字节数组,例如:`byte[] data = Encoding.ASCII.GetBytes(message);`,然后`clientSocket.Send(data)`将这些字节发送出去。服务器端...

    COM串口协议通讯客户端服务器发送数据

    C#串口监听的实现在 Visual Stdio 2005中,对于串口操作Framework提供了一个很好的类接口-SerialPort,在这当中,串口数据的读取与写入有较大的不同。C#串口监听的实现由于串口不知道数据何时到达,因此有两种方法可以...

    客户端向服务器发送消息

    标题"客户端向服务器发送消息"涉及到的是TCP/IP协议栈中的应用层交互,特别是基于TCP(传输控制协议)的通信模式。这种通信模式广泛应用于互联网的各种服务,如网页浏览、邮件发送、文件传输等。 客户端向服务器...

    客户端的数据到服务器-客户端主动发送数据

    在标题"客户端的数据到服务器-客户端主动发送数据"中,我们关注的是客户端如何通过编程主动向服务器发送数据。这通常涉及到网络编程,尤其是使用套接字(Socket)技术。套接字是网络通信的基本组件,它允许程序在...

    QT之TCP传输客户端和服务器端互发信息的实现

    2)客户端往服务器发送输入的需要发送的信息,在服务器的接收显示界面显示; 3)服务器往客户端发送输入的需要发送的信息,在客户端的接收界面显示; 4)断开连接功能,点击断开按钮实现服务器与客户端断开连接,...

    c#做的简单客户端与服务器之间的数据传输

    在IT行业中,客户端-服务器(Client-Server)架构是一种常见的通信模式,用于在不同设备间交换数据。C#,作为Microsoft开发的一种面向对象的编程语言,提供了丰富的库和工具来实现这种通信。在这个主题中,我们将...

    android客户端连接远程服务器传递数据

    "Android 客户端连接远程服务器传递数据" Android 客户端连接远程服务器传递数据是指在 Android 客户端通过 HTTP 协议连接远程服务器,并通过 JSON 数据交换来传递数据。在这个过程中,Android 客户端使用 HTML ...

    客户端应用程序,建立关闭与服务器的连接,向服务器发送数据,接收数据

    连接建立后,客户端应用程序可以开始向服务器发送数据。这些数据可能包括HTTP请求、FTP命令、数据库查询语句等。客户端通常将数据封装在一个特定的协议格式中,例如HTTP请求头和请求体。这些数据经过网络传输,由...

    c语言利用RDMA 实现客户端和服务器端发送接收消息

    - 发送消息:客户端将消息写入本地内存,然后通过RDMA Write操作将数据直接写入服务器的接收缓冲区。 - 接收响应:客户端可以设置一个接收缓冲区,并通过RDMA Read请求从服务器读取数据。或者,服务器可以在接收完...

    Qt实现客户端与服务器消息发送与文件传输

    客户端与服务器之间的数据传送在很多案例场景里都会有应用。这里Jungle用Qt来简单设计实现一个场景,即: ①两端:服务器QtServer和客户端QtClient ②功能:服务端连接客户端,两者能够互相发送消息,传送文件,...

    客户端的数据到服务器-客户端主动发送数据.rar

    本教程将深入探讨如何使用C#编程语言通过TCP Socket实现客户端主动向服务器发送数据的机制。TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,广泛用于互联网上的各种...

    Socket客户端向服务端发送数据

    以上就是关于"Socket客户端向服务端发送数据"的相关知识点,涵盖了Socket通信的基本原理、操作流程以及客户端和服务器端的实现细节。通过理解这些知识,开发者可以构建自己的Socket通信系统,实现自定义的网络服务。

    TCP服务器端和客户端收发测试程序(亲测有效)

    2. 连接成功后,客户端就可以通过套接字向服务器发送数据,也可以接收服务器发送的数据。 3. 客户端通常会在完成数据交换后关闭连接,但也可以选择保持连接状态以便后续通信。 TCP收发测试: 1. 在TCP收发测试中,...

    用MFC实现客户端向服务器传送文件

    在这个场景下,我们将讨论如何利用MFC实现一个客户端向服务器发送文件的功能,这涉及到网络编程的基本概念,特别是TCP(Transmission Control Protocol)协议的应用。 TCP是一种面向连接的、可靠的传输层协议,它...

    c#客户端通过服务器读取数据库

    2. **发送SQL查询**:建立连接后,客户端可以通过`NetworkStream`对象向服务器发送SQL查询命令。这通常涉及到字符串拼接,确保SQL语法的正确性。例如,假设使用的是SQL Server,可以创建一个`SqlCommand`对象,并...

    socket通信,客户端向服务器传文件

    - 一旦连接成功,客户端可以获取Socket的输出流(`OutputStream`),并用它来发送数据。 - 对于文件传输,客户端需要先读取文件内容,然后将其写入Socket的输出流。 在具体实现中,以下是一些关键步骤: 1. **...

    如何判断SOCKET通信中,客户端在10s内未发送数据或者未收到服务器发送的数据,自动断开.doc编程资料

    如何判断SOCKET通信中,客户端在10s内未发送数据或者未收到服务器发送的数据,自动

Global site tag (gtag.js) - Google Analytics