我正试图让(android)客户端与服务器通信。发送数据客户端 - >服务器工作正常,但我希望服务器响应。客户端代码是:
try {
Socket s = new Socket("192.168.0.36", 12390);
s.setSoTimeout(5000);
JSONObject json = new JSONObject();
json.put("emergency", false);
json.put("imei", imei);
json.put("lat", l.getLatitude());
json.put("lon", l.getLongitude());
json.put("acc", l.getAccuracy());
json.put("time", l.getTime());
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));
out.write(json.toString());
out.newLine();
out.write("###");
out.flush();
Log.d(TAG, "sent");
String inputLine = null;
String result = "";
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
Log.d(TAG, "open input");
while ((inputLine = in.readLine()) != null) {
Log.d(TAG, "while");
if (inputLine.contains("###")) {
break;
}
result = result.concat(inputLine);
}
Log.d(TAG, "closing socket");
s.close();
服务器端是:
Socket c = null;
while (true) {
try {
c = s.accept();
} catch (IOException e) {
System.out.println("Accept failed: " + port);
System.exit(-1);
}
try {
BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));
String inputLine = null;
String result = "";
while ((inputLine = in.readLine()) != null) {
if (inputLine.contains("###")) {
System.out.println("received ###");
out.write("Hello phone");
out.newLine();
out.write("###");
out.newLine();
out.flush();
}
result = result.concat(inputLine);
}
System.out.println(result);
out.close();
服务器正确地从客户端读取消息,并且在收到###之后应该发回消息,但客户端从未接收过消息。客户超时
while ((inputLine = in.readLine()) != null) {
Log.d(TAG, "while");
if (inputLine.contains("###")) {
break;
}
并且永远不会进入while循环。我在这里错过了什么?任何想法都赞赏!
答案 0 :(得分:2)
来自客户:
out.write(json.toString());
out.newLine();
out.write("###");
out.flush();
您忘记在发送“###”后添加新行,因为您的服务器使用readLine()
while ((inputLine = in.readLine()) != null) {
//...
}
因此,我相信您的服务器无法收到此消息。试着把
out.newLine();
发送“###”后。
答案 1 :(得分:0)
我可能在这里非常错,但根据我的经验,在开始通信之前,我总是打开流入和流出。尝试移动
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
就在
旁边BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
以防万一您的数据包在打开输入流并开始阅读之前过期。