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 ,表示成功。
相关推荐
头歌UDP Ping程序实现-客户端向服务器发送消息并接收消息.txt头歌UDP Ping程序实现-客户端向服务器发送消息并接收消息.txt头歌UDP Ping程序实现-客户端向服务器发送消息并接收消息.txt头歌UDP Ping程序实现-客户端向...
"客户端连接服务器并发送数据测试.rar"是一个专为服务器协议测试设计的工具,它允许我们模拟客户端行为,向服务器发送数据并接收响应,以确保服务器的数据处理能力正常运作。这个压缩包中的"MFCApplication3"很可能...
利用QT实现客户端的接收和发送数据.............................................................................................
在C#中,我们可以使用Socket的`Send()`方法向对端发送数据。数据通常需要先转换为字节数组,例如:`byte[] data = Encoding.ASCII.GetBytes(message);`,然后`clientSocket.Send(data)`将这些字节发送出去。服务器端...
C#串口监听的实现在 Visual Stdio 2005中,对于串口操作Framework提供了一个很好的类接口-SerialPort,在这当中,串口数据的读取与写入有较大的不同。C#串口监听的实现由于串口不知道数据何时到达,因此有两种方法可以...
标题"客户端向服务器发送消息"涉及到的是TCP/IP协议栈中的应用层交互,特别是基于TCP(传输控制协议)的通信模式。这种通信模式广泛应用于互联网的各种服务,如网页浏览、邮件发送、文件传输等。 客户端向服务器...
在标题"客户端的数据到服务器-客户端主动发送数据"中,我们关注的是客户端如何通过编程主动向服务器发送数据。这通常涉及到网络编程,尤其是使用套接字(Socket)技术。套接字是网络通信的基本组件,它允许程序在...
2)客户端往服务器发送输入的需要发送的信息,在服务器的接收显示界面显示; 3)服务器往客户端发送输入的需要发送的信息,在客户端的接收界面显示; 4)断开连接功能,点击断开按钮实现服务器与客户端断开连接,...
在IT行业中,客户端-服务器(Client-Server)架构是一种常见的通信模式,用于在不同设备间交换数据。C#,作为Microsoft开发的一种面向对象的编程语言,提供了丰富的库和工具来实现这种通信。在这个主题中,我们将...
"Android 客户端连接远程服务器传递数据" Android 客户端连接远程服务器传递数据是指在 Android 客户端通过 HTTP 协议连接远程服务器,并通过 JSON 数据交换来传递数据。在这个过程中,Android 客户端使用 HTML ...
连接建立后,客户端应用程序可以开始向服务器发送数据。这些数据可能包括HTTP请求、FTP命令、数据库查询语句等。客户端通常将数据封装在一个特定的协议格式中,例如HTTP请求头和请求体。这些数据经过网络传输,由...
- 发送消息:客户端将消息写入本地内存,然后通过RDMA Write操作将数据直接写入服务器的接收缓冲区。 - 接收响应:客户端可以设置一个接收缓冲区,并通过RDMA Read请求从服务器读取数据。或者,服务器可以在接收完...
客户端与服务器之间的数据传送在很多案例场景里都会有应用。这里Jungle用Qt来简单设计实现一个场景,即: ①两端:服务器QtServer和客户端QtClient ②功能:服务端连接客户端,两者能够互相发送消息,传送文件,...
本教程将深入探讨如何使用C#编程语言通过TCP Socket实现客户端主动向服务器发送数据的机制。TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,广泛用于互联网上的各种...
以上就是关于"Socket客户端向服务端发送数据"的相关知识点,涵盖了Socket通信的基本原理、操作流程以及客户端和服务器端的实现细节。通过理解这些知识,开发者可以构建自己的Socket通信系统,实现自定义的网络服务。
2. 连接成功后,客户端就可以通过套接字向服务器发送数据,也可以接收服务器发送的数据。 3. 客户端通常会在完成数据交换后关闭连接,但也可以选择保持连接状态以便后续通信。 TCP收发测试: 1. 在TCP收发测试中,...
在这个场景下,我们将讨论如何利用MFC实现一个客户端向服务器发送文件的功能,这涉及到网络编程的基本概念,特别是TCP(Transmission Control Protocol)协议的应用。 TCP是一种面向连接的、可靠的传输层协议,它...
2. **发送SQL查询**:建立连接后,客户端可以通过`NetworkStream`对象向服务器发送SQL查询命令。这通常涉及到字符串拼接,确保SQL语法的正确性。例如,假设使用的是SQL Server,可以创建一个`SqlCommand`对象,并...
- 一旦连接成功,客户端可以获取Socket的输出流(`OutputStream`),并用它来发送数据。 - 对于文件传输,客户端需要先读取文件内容,然后将其写入Socket的输出流。 在具体实现中,以下是一些关键步骤: 1. **...
如何判断SOCKET通信中,客户端在10s内未发送数据或者未收到服务器发送的数据,自动