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