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 ,表示成功。
相关推荐
利用QT实现客户端的接收和发送数据.............................................................................................
C#串口监听的实现在 Visual Stdio 2005中,对于串口操作Framework提供了一个很好的类接口-SerialPort,在这当中,串口数据的读取与写入有较大的不同。C#串口监听的实现由于串口不知道数据何时到达,因此有两种方法可以...
2)客户端往服务器发送输入的需要发送的信息,在服务器的接收显示界面显示; 3)服务器往客户端发送输入的需要发送的信息,在客户端的接收界面显示; 4)断开连接功能,点击断开按钮实现服务器与客户端断开连接,...
客户端与服务器之间的数据传送在很多案例场景里都会有应用。这里Jungle用Qt来简单设计实现一个场景,即: ①两端:服务器QtServer和客户端QtClient ②功能:服务端连接客户端,两者能够互相发送消息,传送文件,...
c#做的简单客户端与服务器之间的数据传输
c#客户端与服务器建立通讯 客户端通过向服务器发送sql语句按时间查询数据库数据并返回到到客户端,客户端将查询结果显示在datagirdview控件上。
客户端应用程序,建立到服务器的连接,关闭与服务器的连接,向服务器发送数据,接收数据
客户端的数据到服务器-客户端主动发送数据,可以扩展,服务器下载后再转发,代转发
C# Socket服务端向指定的客户端发送消息(包含服务器)
如何判断SOCKET通信中,客户端在10s内未发送数据或者未收到服务器发送的数据,自动
服务器专用客户端协议测试工具,可以连接到指定服务器并进行简单的收发包,主要用于测试服务器接收数据是否正常
C# 使用Socket发送和接收TCP数据,包含客户端和服务器端,发送Send,监听Listen ,C#运行环境VS2010
python使用socket向客户端发送数据的方法.docx
通过服务端与客户端传输图片交换数据,不管是内网、外网都可以轻松实现,如果感觉对你有用,请关注我,每天上传新资源
2,反向通讯,通过服务器端给客户端发送文件; 3,实现客户端与服务器端的Chat聊天功能(稍加改动可转化为C->S->C的聊天程序) 4,如何使用IdTCPServer和IdTCPClient控件 5,初步实现线程命令方式,在传送文件的时候不会...
易语言服务端客户端互换收发数据源码,服务端客户端互换收发数据,客户发送数据,服务发送数据,获取通信数据,服务过程连接,客户过程连接,客户数据处理,服务数据处理
HTTP通信:即使用HTTP协议进行通信,工作原理是客户端向服务器端发送一条HTTP请求,服务器收到之后先解析客户端的请求,之后会返回数据给客户端,然后客户端再对这些数据进行解析和处理。HTTP连接采取的是“请求—...
关于基础C# windows程序地代码 C#之网络编程服务器与客户端连接并传送数据 希望初学者都来看看 也许有用
同步Socket(客户端与服务器端),发送与接收数据
C# TCP Socket 服务器源码,下载可运行查看效果 C# TCP Socket 服务器源码,下载可运行查看效果