小编Roc*_*ket的帖子

当android设备在wifi时,SSLSocket在getInputStream处挂起

我想在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秒.

我在这里也发现了这个问题,但他们正在使用客户端套接字.我需要一个服务器套接字.有谁知道如何解决这个问题?

使用SSLSocket的TLS连接在Android OS中很慢

java sockets ssl android

11
推荐指数
1
解决办法
834
查看次数

VectorDrawable createFromStream 似乎不起作用

我正在尝试从资产加载矢量可绘制对象。

当我使用 png 文件时它工作正常:

final String name = "image.png";
final InputStream stream = context.getAssets().open(name);
drawable = Drawable.createFromStream(stream, name);
stream.close();
Run Code Online (Sandbox Code Playgroud)

我尝试使用 VectorDrawable.createFromStream() 和 VectorDrawableCompat.createFromStream() 但两者总是返回 null。

当我将矢量 drawable 添加到 drawbles 资源时,它可以毫无问题地加载。

我还尝试使用在将矢量文件添加到可绘制资源时创建的二进制 xml 文件。

我使用 API level 24 和 Support libs 24.2.0 with Android 5.1.1 来测试这个。它应该适用于 Android 4.2 及更高版本。

有谁知道如何解决这一问题?

这个问题可能与这个有关: Load a vector drawable into imageview from sd card

android android-vectordrawable

3
推荐指数
1
解决办法
1456
查看次数

标签 统计

android ×2

android-vectordrawable ×1

java ×1

sockets ×1

ssl ×1