【问题标题】:Problem with C server socket connected to Java client连接到 Java 客户端的 C 服务器套接字问题
【发布时间】:2011-09-21 11:21:09
【问题描述】:

我正在 Android 上编写一个应用程序,我希望它能够知道服务器(我用 C 编写的)何时死机或关闭。我试图通过让服务器以指定的时间间隔向客户端(Android 应用程序)发送消息来实现这一点。如果这个消息没有出现,那么客户端就知道它不再连接到服务器了。它们使用 TCP 套接字进行通信。

我的问题是 Android 应用似乎无法读取服务器写入的内容。当它到达尝试从服务器套接字读取的代码的第一部分时,它只是挂起。在 Android 应用程序中,我使用 BufferedReader 从套接字 tmpstr = inFromServer.readLine(); 读取,其中 tmpstr 是一个字符串,inFromServer 是 BufferedReader,而 C 服务器只使用写入 write(newsockfd,"I got your message",18);

我还尝试使用替代 Java 服务器来查看我的基本程序逻辑是否错误。测试服务器使用了 PrintWriter,它与 Android 客户端完美配合。

我在这里缺少什么? Java 和 C 缓冲(或不缓冲)它们的数据的方式有区别吗?如果我需要提供任何其他信息,请告诉我。

编辑:让 C 服务器读取从客户端发送的数据也没有问题。我只是无法让客户端读取从服务器发送的数据。

编辑:问题已通过在服务器发送给客户端的内容中添加换行符 (\n) 得到解决。

【问题讨论】:

  • 不会 readLine 等待换行吗?但是,我看不到您发送换行符...
  • 你试过给它发送换行符"\r\n"吗?
  • Java 是否会自动将换行符附加到它发送的数据中?我使用outToServer.println("some string"); 并且服务器能够很好地读取它。编辑:我会尝试发送换行符,看看是否有帮助。我会尽快返回结果。
  • println 添加换行符
  • 添加换行符有效,非常感谢。由于某种原因,换行符从未出现在脑海中。我已经坚持了几个小时。如此简单的修复...

标签: java android c tcp


【解决方案1】:

如果我没记错的话,readLine() 在读取整行之前不会返回结果。它会一直阻塞到那时。您没有从 C 程序发送完整的一行。

您不仅没有发送整行(\n 终止),而且您甚至没有发送整个 C 字符串,因为您没有发送空终止符(您的 C 字符串实际上包含 19 个字符,而不是 18 ,如果您包含空终止符)。我不记得 Java 使用什么类型的字符串格式,是否以 null 结尾,但那部分可能无关紧要,因为它正在寻找 \n,而不是 \0。

尝试从 C 服务器发送“I got your message\n”,然后告诉我们会发生什么。

糟糕,我刚刚意识到这个问题已经在 cmets 中得到了回答。那好吧。人们真的应该将答案作为答案发布。

【讨论】:

  • 感谢您的回答!您添加“\n”的建议正是我必须做的才能使它工作......是的,在 cmets 中给出答案的人有点令人困惑。
猜你喜欢
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 2014-04-05
相关资源
最近更新 更多