我正在尝试创建一个简单的 java 客户端来连接到存在服务器(Openfire)的端口 5223。状态服务器文档告诉我这个端口只支持安全的 TLS 连接。
所以我尝试使用下面的代码连接到 5223 端口。
SSLSocketFactory factory=(SSLSocketFactory)SSLSocketFactory.getDefault();
SSLSocket socket= (SSLSocket)factory.createSocket("host",5223);
BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
BufferedWriter writer =new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8"));
writer.write("some data");
writer.flush();
char r0[]= new char[600];
reader.read(r0);
System.out.println(r0);
这工作得很好,我可以看到(在wireshark中)我发送的数据以及我收到的响应都被加密了。
接下来我尝试了下面的代码
Socket socket=new Socket("host", 5223);
BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
BufferedWriter writer =new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8"));
writer.write("some data");
writer.flush();
char r0[]= new char[600];
reader.read(r0);
System.out.println(r0);
令人惊讶的是(对我来说)这也有效。唯一的问题是我在开始时收到了一些 7 字节的意外响应。但是当我跳过该响应时,所有其他响应似乎都可以正常工作,我什至看到数据已加密(使用wireshark)。
我很困惑。如果 Socket 类本身能够提供安全通信,那么我们为什么要使用 SSLSocket 类。
任何帮助表示赞赏。