Roc*_*ket 11 java sockets ssl android
我想在Android设备上安装一个SSL加密的TCP服务器,并在计算机上安装一个连接到该设备的客户端.
我在Android设备上创建了一个具有自己的密钥库的SSLServerSocket.
final KeyStore localTrustStore = KeyStore.getInstance("BKS"); //NON-NLS
final InputStream in = context.getResources().openRawResource(R.raw.syncapp);
localTrustStore.load(in, "secret".toCharArray()); //Keystore pw
in.close();
final SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); //NON-NLS
final TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(localTrustStore);
final KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(localTrustStore, "secret".toCharArray()); //privat key pw
sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
serverSocket = sslContext.getServerSocketFactory().createServerSocket(SERVER_PORT);
((SSLServerSocket) serverSocket).setNeedClientAuth(true);
Run Code Online (Sandbox Code Playgroud)
然后我等待客户端连接.当客户端想要连接时,启动新线程并要求流:
final DataInputStream input = new DataInputStream(this.clientSocket.getInputStream());
final DataOutputStream output = new DataOutputStream(new BufferedOutputStream(clientSocket.getOutputStream()));
Run Code Online (Sandbox Code Playgroud)
首先,我使用此代码与USB-Tethering获得计算机和Android设备之间的连接.所以没有启用Wifi /网络.一切都很完美.
然后我在Android设备上激活了wifi并连接到没有互联网的wlan.但现在调用getInputStream()似乎需要5到10秒.如果我停用SSL,它可以很好地工作.如果wlan确实连接到互联网,也没有延迟.我用Android 4.2和5.1进行了测试.更新:现在我可以用Android 6测试这个问题.问题似乎在那里得到修复......
Handshake正确完成但之后似乎在Android设备上有某种延迟.(对getInputStream的调用会消耗那段时间)一些开发人员说它将进行DNS反向查找,这将进入超时状态.
看看捕获,第一次连接是在禁用wifi时进行的.进行数据传输需要0.3秒.然后我只是激活了wifi,我没有通过wifi连接,它仍然通过usb进行通信.它耗时超过5秒.
我在这里也发现了这个问题,但他们正在使用客户端套接字.我需要一个服务器套接字.有谁知道如何解决这个问题?
小智 0
您说得对,反向 DNS 查找超时了。在某些 Java 运行时环境中,在与原始 IP 地址握手期间,SSLContext 不必要地执行服务器 IP 地址的查找。这是为了确定服务器证书的通用名称是否匹配。尝试使用此处提到的解决方案之一:
| 归档时间: |
|
| 查看次数: |
834 次 |
| 最近记录: |