无法读取果冻豆上的套接字输入流

我有一个TCP套接字连接,在Android 2.3上运行良好,但现在在Android 4.1上面临一些问题。问题在于 InputStream.read() 方法总是返回 -1(不阻塞),就像连接关闭一样。

创建套接字:

SocketFactory socketFactory = SocketFactory.getDefault();
Socket socket = socketFactory.createSocket("c.whatsapp.net", 5222);
socket.setSoTimeout(3*60*1000);
socket.setTcpNoDelay(true);

检索输入和输出流并写入一些初始数据:

InputStream inputStream = new BufferedInputStream(socket.getInputStream());
OutputStream outputStream = new BufferedOutputStream(socket.getOutputStream());

outputStream.write(87);
outputStream.write(65);
outputStream.write(1);
outputStream.write(2);
outputStream.flush();

然后,此条件始终通过而不阻塞:

int c = inputStream.read();
if (c < 0) {
    Log.d(TAG, "End of stream");
}

此代码在后台线程中运行。它正在研究姜饼。

尝试使用 InputStreamReader 和 OutputStreamWriter 而不是直接流 - 没有效果。


答案 1

我以前见过同样的错误,尽管这个答案可能看起来偏离主题,给它一个机会,让我知道它是否有效,由于某种原因,套接字在jellybean上有奇怪的行为,即使它们在较低的Android版本中工作完全正常,我解决这个问题的方法是将targetSdkVersion移动到果冻豆以及项目Android属性下的项目构建目标, 没有修改一行代码,只是这样,并且由于某种原因,它确实做到了......

希望这有帮助。

问候!


答案 2

我遇到了一些类似的问题,返回-1,我没有得到任何异常。事实上,服务器已关闭,连接断开。我没有用不同的版本测试它,只有用4.0。inputStream.read()

这是有关此行为的 Google 错误报告

不幸的是,该错误的状态似乎是“已关闭”,因为无法重现。

我的解决方法是将 -1 解释为套接字的关闭和无法访问的服务器。当您尝试重新连接时,您会收到正确的错误。


推荐