我正在 Android 上编写一个应用程序,我希望它能够知道服务器(我用 C 编写)何时死机或关闭。我试图通过让服务器以指定的时间间隔向客户端(Android 应用程序)发送消息来实现这一点。如果没有收到此消息,则客户端知道它不再连接到服务器。它们使用 TCP 套接字进行通信。
我的问题是 Android 应用程序似乎无法读取服务器写入的内容。当它到达尝试从服务器套接字读取的代码的第一部分时,它只是挂起。在 Android 应用程序中,我使用 BufferedReader 从套接字中读取 tmpstr = inFromServer.readLine();
其中 tmpstr 是一个字符串,inFromServer 是 BufferedReader,而 C 服务器只是使用 write write(newsockfd,"我收到你的消息",18);
.
我还尝试使用替代的 Java 服务器来查看我的基本程序逻辑是否有误。测试服务器使用了 PrintWriter,它与 Android 客户端完美配合。
我在这里错过了什么? Java 和 C 缓冲(或不缓冲)它们的数据的方式有区别吗?如果我需要提供任何其他信息,请告诉我。
编辑:我也很容易让 C 服务器读取从客户端发送的数据。我唯一的问题是让客户端读取从服务器发送的数据。
编辑:通过向服务器发送给客户端的内容添加换行符 (\n
) 解决了该问题。
最佳答案
如果我没记错的话,readLine() 在读取整行之前不会返回结果。它会一直阻塞到那时。您没有从 C 程序发送整行。
您不仅没有发送整行(\n 终止),而且您甚至没有发送整个 C 字符串,因为您没有发送空终止符(您的 C 字符串实际上包含 19 个字符,而不是 18 ,如果您包括空终止符)。我不记得 Java 使用什么类型的字符串格式,是否以 null 终止,但这部分可能无关紧要,因为它正在寻找\n,而不是\0。
尝试从 C 服务器发送“我收到你的消息\n”,然后让我们知道会发生什么。
糟糕,我才发现这个问题已经在评论中得到了回答。那好吧。人们真的应该将答案作为答案发布。
关于java - 连接到 Java 客户端的 C 服务器套接字问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6458757/