项目需要用https与服务器进行连接,获取系统需要的一些配置参数。以前是用http进行连接的,客户端代码比较简单,直接使用URL类进行连接并获取输入流即可。试着在浏览器中输入相应的https连接地址,提示证书确认,确认以后就访问到内容了。
改成https以后碰到了一些问题。原以为Java可能已经封装好了,所以把直接把原来的http连接改成https,结果抛出异常:java.lang.UnsupportedClassVersionError: test/url/URLTest (Unsupported major.minor version 49.0)。查了一下,是JVM不支持这个协议(《java网络编程》上有说明)。换了一个jdk,这个问题好了。调用vurl.getProtocol()可以获取相应的协议了。
接着出现了第二个异常:javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: Java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty。没办法,接着google,发现这个问题跟安全连接的证书有关(安全方面的东西不是很了解,只知道这个公钥,用于验证)。查了一下,jdk果然提供了跟证书相关的东西。首先要从服务器那得到证书,想了一下,ie好像可以。试着用ie 连接地址,然后出现了证书确认的提示框,点击查看证书-详细信息,点击复制到文件,选择base64编码,导出后就可以用记事本打开了,大概样子如下:
-----BEGIN CERTIFICATE-----
MIIDITCCAoqgAwIBAgIQS6WuWd7dHMeAfIkikfDiQzANBgkqhkiG9w0BAQQFADBM
MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg
THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0wNjA1MTUyMzE4MTFaFw0w
j8thQJ7StDhAISTBTx/LE0qPlQLfkT3WQOsRb5sQoW/OkV4w9m0TXhWkLsIYngDD
2DJnR/y4HprZmo7M/3wStwO/UiDPIfTzd90SFfCU+pDV41logQ==
-----END CERTIFICATE-----
不用动这个文件,以后直接导入即可。
PS:如果已经点击了证书的确认,可能浏览器就直接打开链接了。这样情况下,可以接着点击ie有下脚的“锁”形符号,即可看见证书。证书搞到手了,接着要然Java环境能够认识它。这里调用的是jdk带的一个exe,keytool.exe(%JAVA_HOME%/bin下有,所以配了java环境变量的话直接能在命令行调用了)。这里我们输入导入命令即可:
%JAVA_HOME%\bin\keytool -import -file service.crt -keystore D:/test/urltest/crt
三个参数分别代表:导入操作,导入的证书文件,导入证书存放的位置(PS:这个路径可以使用相对路径也可以是绝对路径,但是相对路径我没有实验成功)。导入过程中会提示用户输入密码,这个密码随便就行,不过位数不能太少:)
证书是导入成功了,但是问题ms还是没解决,新的异常出现了:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
没辙,接着google,还好问题不是很麻烦。上面虽然生成了证书,但是还要告诉程序证书的具体位置,涉及一个系统变量要配置。在程序中加入一句话即可:System.setProperty("javax.net.ssl.trustStore","D:/test/urltest/crt");或者在运行java时加入参数:-Djavax.net.ssl.trustStore=D:/test/urltest/crt.
做了这么多,这个时候是黎明前最黑暗的时候。最后这个问题搞了2小时.......
异常:java.net.UnknownHostException: 222.222.222.222。没啥好说了的,google。找来找去,找到一个blog说了这么一句:在生成证书的时候会提示你“你的姓名”,这里别写你的名字,而要写一个ip或者一个你对应网站的网址。抛出的异常提示的错误确实是我的https请求中的ip,这样的话可能是此ip和证书中的“名字”不相同造成的。再次使用ie打开证书,在“常规”里面,看到这么一个东西(我直接用https://mail.google.com试的,因为连它的时候没有出现任何证书确认)
颁发给:www.google.com
找到url了,打开我的证书,哈哈,确实也有这么一个东西,爽。
更郁闷的来了,url是找到了,可是,此url是个无效的地址.......输入到ie中返回无法连接。这下知道为什么google不用确认而这个证书需要确认了。因为此url连不通。怎么办?天无绝人之路,还是让我找到了。其实现在我要做的就是一个域名和ip绑定的问题,但是这个绑定不是 DNS来做,而是本机(windows系统)来做。查了一下,果然有,就在C:\WINDOWS\system32\drivers\etc下有一个host文件,打开它,可以看到这么一行
127.0.0.1 localhost
^_^,原来localhost是这样绑定127.0.0.1的啊,如此就好。我试着加入一行
222.222.222.222 www.sample.test
把原来的https连接的ip换成了那个域名,OK!问题搞定,连接成功。
分享到:
相关推荐
每个客户端连接对应一个独立的线程,确保服务器可以同时处理多个请求。 5. **异常处理**:在客户端-服务器编程中,异常处理至关重要,因为网络通信可能会出现各种不可预知的问题。良好的异常处理可以确保程序的健壮...
本主题将深入探讨如何在Eclipse中开发Java客户端和服务器代码,以及如何进行交互。 首先,让我们了解客户端和服务器的基本概念。客户端是发起请求的程序,而服务器则是接收并响应这些请求的程序。在Java中,我们...
- 使用`ServerSocket`监听端口,等待客户端连接。 - 接受客户端连接请求后,为每个客户端创建独立线程处理数据传输。 #### 六、注意事项 1. **异常处理**:代码中通过try-catch块对可能出现的异常进行了捕获处理。...
【Java客户端登陆/查询服务器端数据库程序】是一个典型的网络应用程序,它通过Java语言实现了客户端与服务器端的通信,使得客户端可以对服务器上的数据库进行查询和登录操作。在这样的系统中,客户端作为用户界面,...
VNC服务端是系统提供远程访问功能的核心部分,而VNC Java客户端则是实现这一功能的Java语言编写的软件工具,使得用户可以使用Java运行环境在任何地方通过Java应用程序来连接和服务端进行交互。 首先,我们来详细...
这个端点URI将成为客户端连接的目标地址。 4. **OnOpen、OnClose、OnMessage方法**: 在服务端,你可以定义`onOpen`、`onClose`和`onMessage`方法来处理客户端的打开连接、关闭连接和接收到的消息事件。例如: ```...
- 可以使用多线程处理多个客户端连接,以提高并发能力。 - 考虑使用 comettest 压缩包中的示例代码进行学习和实践,理解其工作原理。 5. **安全与兼容性** - 长连接可能增加服务器负载,需要考虑如何处理异常和...
要实现Java客户端和服务器端的通信,我们需要使用Socket编程。Socket是Java提供的API,允许两个网络应用程序通过TCP/IP协议进行通信。TCP(传输控制协议)是一种面向连接的、可靠的通信协议,确保了数据的正确传输。...
"java客户端服务器传递对象"这个主题涉及到的核心知识点主要包括Java RMI(Remote Method Invocation,远程方法调用)、对象序列化以及网络通信的基本原理。下面我们将深入探讨这些概念。 1. **Java RMI**: RMI是...
当有新的客户端连接时,服务器会为每个客户端创建一个新的线程来处理与其的通信,这样可以同时处理多个客户端的请求,实现多用户聊天。 2. **客户端(Client)**:客户端使用`Socket`连接到服务器,通过`...
下面是一个简单的Java Socket客户端示例,用于连接到一个聊天服务器: ```java import java.io.*; import java.net.*; public class ChatClient { public static void main(String[] args) { try (Socket socket...
要实现Java客户端,我们可以使用`java.net.Socket`类来创建TCP连接。以下是一个简单的客户端示例: ```java import java.io.*; import java.net.*; public class Client { public static void main(String[] args...
2. **接受连接**:调用`accept()`方法,该方法会阻塞,直到有客户端连接到服务器。这个方法会返回一个新的`Socket`对象,用于与客户端进行通信。 3. **处理客户端请求**:通常,服务器会在新的线程中处理每个客户端...
Java客户端在使用FastDFS时,首先需要连接到跟踪服务器,获取到文件应该存储或访问的存储服务器信息。这个过程通常包括以下步骤: 1. **连接跟踪服务器**:客户端通过Java客户端库建立与跟踪服务器的连接。 2. **...
本篇将详细阐述如何在Java中实现TCP客户端与服务器的连接,以及涉及的一对一和一对多通信模式。 首先,TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它确保数据的顺序传输和无损传输,通过三次握手...
而客户端则创建`Socket`对象,通过指定服务器的IP地址和端口号来连接服务器。 接着,我们来看**流式输入(Stream Input)**和**流式输出(Stream Output)**。在Java中,我们通常使用`InputStream`和`OutputStream`...
为了让多个客户端可以同时在线聊天,服务器需要维护一个客户端连接列表,并确保每个客户端的消息能被正确地广播给其他所有客户端。这可以通过一个线程安全的数据结构(如`java.util.concurrent.ConcurrentHashMap`)...
在Java中,我们可以使用`java.net.Socket`类来创建客户端连接,它代表了两台机器之间的网络连接。Socket编程是基于TCP/IP协议的,确保了数据的可靠传输。要实现FTP客户端,首先需要创建一个Socket连接到FTP服务器,...
一旦有客户端连接,`ServerSocket`会返回一个新的`Socket`对象,通过这个`Socket`,服务器和客户端可以进行双向通信。 ```java ServerSocket serverSocket = new ServerSocket(8080); // 监听8080端口 Socket ...
利用Netty,我们可以轻松实现TCP服务器,创建ServerBootstrap,配置通道处理器pipeline,监听客户端连接,并处理接收到的数据。 Netty中的ChannelHandlerContext类是事件处理的核心,它提供了发送和接收数据的方法...