我编辑了代码以便更好地解释。
我有Android应用程序,它是客户端和Java服务器。我试图从客户端向服务器发送信息,处理该信息并将结果发送回客户端。
我使用BufferedReader
,InputStreamReader
和DataOutputStream
发送和接收邮件。
所以我的Client.java有这个代码:
try {
//Sending message to server
DataOutputStream outToServer = new DataOutputStream(sock.getOutputStream());
outToServer.writeBytes(messageString + '\n');
outToServer.flush();
} catch (IOException e) {
System.err.print(e);
}
try {
System.out.println("This line is showing");
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(sock.getInputStream()));
String res;
System.out.println("And this line is showing");
res=inFromServer.readLine();
System.out.println("But this never is");
System.out.println("Received: " + res); //This line is never printed in console
}catch (IOException e) {
System.out.println(e);
}
我的Server.java有这个:
try{
System.out.println("Creating InputStream");
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String message = inFromClient.readLine();
System.out.println("Received: " + message); //correct string received
} catch (Exception ex) {
System.out.println("Creating InputStream failed");
System.err.print(ex);
}
try{
String response = "Response from server"
DataOutputStream outToClient = new DataOutputStream(clientSocket.getOutputStream());
outToClient.writeBytes(response + '\n');
outToClient.flush();
System.out.println("Sent to client: " + response); //correct string is showing in console
} catch(Exception ex) {
System.out.print("Error! " + ex);
}
问题是我的服务器正确地获取消息,这是可理解的字符串。它在控制台中显示它发送给客户端的内容,也是可理解的字符串。 但是,当我试图在客户端获取消息时,它什么也没做。
inFromServer.readline()
不会向控制台抛出任何异常,我也不知道它为什么不起作用。
我尝试了inFromServer.toString()
,然后我收到了一些东西,但它肯定不是从服务器发送的字符串。它类似于:
java.io.BufferedReader@b3d109a0
我不知道自己做错了什么。从登录功能调用发送/接收功能,该功能从onPostExecute
调用。我不知道如何从doInBackground
中做到这一点。
答案 0 :(得分:1)
BufferedReader.readLine()
无效
哦,是的。您的错误在于尝试将阅读器转换为字符串,而不是使用已读取的行。
哟应该删除ready()
测试。这毫无意义。
您还应该使用对称流。如果您在一端使用Readers
,则应在另一端使用Writers
,例如BufferedWriter
。不是DataOutputStream
。
我建议这不是真正的代码,并且发送消息的末尾没有\n
,这将解释readLine()
阻塞直到不存在的行终止符到达,但您应该使用BufferedWriter
而不是DataOutputStream
进行重做,如上所述。