【问题标题】:Java InputStream read() - Android issue [closed]Java InputStream read() - Android问题[关闭]
【发布时间】:2013-02-25 20:59:33
【问题描述】:

好的,我正在重写这个,因为人们太担心代码了,这并不重要。

我遇到的问题是,我可以在常规 Java 控制台应用程序中从 TCP 套接字读取数据。

当我在 Android 中尝试完全相同的操作时,read() 不会返回。除非我终止 Android 客户端和服务器之间的连接,否则它就坐在那里什么都不做。

【问题讨论】:

  • 好吧,我想这个标题没有多大意义,我现在有点着急。需要明确的是 - 我只在 Android 端调用 read()。
  • 请给我一些代码好吗?
  • 你使用什么协议?
  • 我用的是TCP,当然,我会加代码
  • @KiithNabaal : 确保你没有在主 UI 线程(活动内部)上执行所有与网络相关的任务?

标签: java android networking io


【解决方案1】:

您的协议错误,导致死锁。

服务器首先向客户端写入一行。然后它等待来自客户端的一行。

另一方面,客户端从服务器开始读取,直到没有更多内容可读取,read() 方法返回 -1。这只会在服务器关闭其对客户端的输出流时发生。所以客户端等待服务器的下一个字符,服务器等待客户端的第一行。死锁。

通常,客户端和服务器代码应该是对称的。如果您在一侧发送一行,则应该在另一侧读取一行。

【讨论】:

  • 我并不担心协议,这就是为什么我不愿意发布代码,因为人们过于关注代码而不是我提出的一般问题。我担心为什么 read() 没有返回。在我看来,除非服务器关闭输出流,否则 read() 不会返回?这就是它的工作原理?
  • 不,我很抱歉,但这不可能。我的意思是,我编写了一个客户端/服务器来测试我的代码并且它有效。它给出了一个无限循环,但这不是重点。 Android 代码甚至不这样做。恐怕这个问题对我来说太具体了。
  • read() 是一个阻塞调用。它会阻塞,直到有东西要读。阅读它的 API 文档。这是明确规定的。 docs.oracle.com/javase/6/docs/api/java/io/…此方法阻塞,直到输入数据可用、检测到流结束或抛出异常
【解决方案2】:

我不知道它是什么,但是一旦我使用了 readLine() 就可以了。也许我之前错过了一些我现在注意到的东西,但我让它发挥了作用。

对于将来遇到此问题的任何人,也许在您的服务器发送文本时避免 read() ?我不确定。

但是,对不起,JB,我的代码运行良好。它被设计成无限循环,我只是在运行一个虚拟程序来做一个测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多