java - Android 套接字输入流读取(后跟 EPIPE)

标签 java android sockets

我正在创建一些客户端套接字软件来从服务器读取事件。 (例如,流媒体股票报价)。

问题: .read(b); 立即返回值-1。这会导致无限循环,手机会变得很热。此外,对 s.isConnected()、isOpen()、isBound() 的所有检查都返回 true。本质上,套接字看起来已连接。 (这是一个错误场景,因此 .setSoTimeout(x) 的任何值都无效。12 分钟,或留空。.read(b) 总是立即返回 -1)。

当我稍后通过 getOutputStream() 写入它时,我收到一个异常 EPIPE(管道损坏)。

这是核心代码(为简洁起见省略了日志语句/值检查)。

s.connect(new InetSocketAddress(host, port), CONNECT_TIMEOUT_MILLIS);

byte[] b = new byte[1024];
while (s.isConnected()) {
    int bytesToRead = s.getInputStream().read(b);
    if (bytesToRead <= 0) {
        LOGGER.debug("no bytes read? trying again.");
        continue;
    }
    processFrame(b);
}

如果我在手机上循环 3g,它工作正常。有时它会进入这种奇怪的状态。

问题

我做错了什么吗?这是预期的行为吗?是否有我可以查看的现有代码来展示在 Android 上进行套接字编程的正确方法?

最佳答案

我使用下面的代码没有问题:

        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line = null;
        while ((line = in.readLine()) != null) {
            myLineProcess(line); //here you process you line result
        }

祝你好运。

关于java - Android 套接字输入流读取(后跟 EPIPE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12592707/

相关文章:

php - PHP的最大套接字数stream_socket_client

java - 没有找到主类,

java - 使用private指定类的访问控制

java - 在特定时间使用警报管理器

android - 如何暂停 ExoPlayer 2 播放和恢复(PlayerControl 已删除)

c - C语言套接字编程中的双向通信

java - 无法从任何地方构建 Hibernate SessionFactory 异常

java - 如何在没有 ParseException 的情况下使用 SimpleDateFormat 测试解析日期

java - 棉花糖中Android AlarmManager的奇怪问题

python - 在 Python 中打开 URL 并获取最多 X 字节的最佳方法是什么?