我正在通过以下IP地址进行套接字通信但是我不想在ssl模式下进行通信,但是如何将InetAddress serverAddr = InetAddress.getByName("192.168.1.2");
更改为SSL。
public class TCPClient implements Runnable {
public void run() {
try {
InetAddress serverAddr = InetAddress.getByName("192.168.1.2");
Log.d("TCP", "C: Connecting...");
Socket socket = new Socket(serverAddr,12345);
String message = "Hello from Client android emulator";
try {
Log.d("TCP", "C: Sending: '" + message + "'");
PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
out.println(message);
Log.d("TCP", "C: Sent.");
Log.d("TCP", "C: Done.");
} catch(Exception e) {
Log.e("TCP", "S: Error", e);
} finally {
socket.close();
}
} catch (Exception e) {
Log.e("TCP", "C: Error", e);
}
}
}
答案 0 :(得分:19)
创建SSLSocket而不是Socket。休息是一样的。
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("192.168.1.2", 12345);
您可能想要添加aditional SSL属性。你必须做得更早:
要对服务器进行身份验证,客户端的信任存储区必须包含服务器的证书。具有服务器身份验证的客户端SSL由URL属性ssl或设置为peerAuthentication的属性ssl启用。此外,需要设置系统属性javax.net.ssl.trustStore和javax.net.ssl.trustStorePassword。:
System.setProperty("javax.net.ssl.trustStore","clientTrustStore.key");
System.setProperty("javax.net.ssl.trustStorePassword","qwerty");
如果服务器进行客户端身份验证,则客户端将需要密钥对和客户端证书:
System.setProperty("javax.net.ssl.keyStore","clientKeyStore.key");
System.setProperty("javax.net.ssl.keyStorePassword","qwerty");
答案 1 :(得分:2)
基本上你需要使用SSLSocket,它用于Java中的SSL通信。
创建SSLSocket时,首先需要配置用于验证服务器证书的信任存储。
然后你需要获得SSLSocket并连接到服务器,然后开始与服务器握手。
握手成功完成后,您可以开始与服务器交换应用程序数据,就像其他普通套接字连接一样。
A HTTPS client and HTTPS server demo in Java提供了有关如何在Java中创建SSL服务器和SSL客户端的演示。它非常有用。
答案 2 :(得分:0)
Java有SSLSocket类。
http://download.oracle.com/javase/1.4.2/docs/api/javax/net/ssl/SSLSocket.html
希望这有帮助,但我自己还没有使用过它。