我希望Android设备上有一个SSL加密的TCP服务器,并且计算机上的客户端将连接到该设备。
我在Android设备上使用自己的密钥库创建SSLServerSocket。
for x in name:
print x
然后我等待客户端连接。当客户端想要连接时,启动新线程并要求流:
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);
首先,我使用此代码与USB-Tethering获得计算机和Android设备之间的连接。所以没有启用Wifi /网络。一切都很完美。
然后我在Android设备上激活了wifi并连接到没有互联网的wlan。 但现在调用getInputStream()似乎需要5到10秒。 如果我停用SSL,它可以很好地工作。 如果wlan确实连接到互联网,也没有延迟。 我用Android 4.2和5.1进行了测试。 更新:现在我可以用Android 6测试这个问题。问题似乎在那里得到解决......
握手已正确完成,但之后似乎在Android设备上有某种延迟。 (对getInputStream的调用会消耗该时间) 一些开发人员说它将进行DNS反向查找,这将进入超时。
看看捕获,第一次连接是在禁用wifi时进行的。进行数据传输需要0.3秒。然后我只是激活了wifi,我没有通过wifi连接,它仍然通过usb进行通信。它花了5秒钟。
我也在这里找到了问题,但是他们正在使用客户端套接字。我需要一个服务器套接字。有谁知道如何解决这个问题?
答案 0 :(得分:0)
你是对的,有一个反向DNS查找超时。在某些Java运行时环境中,在与原始IP地址握手期间,SSLContext不必要地执行服务器IP地址的查找。这是为了确定服务器证书的公用名是否匹配。尝试使用此处提到的解决方案之一: