Android应用正在连接到我的专用网络中的Java服务器套接字。之后,该应用程序将一个字符串写入PrintWriter,但是在服务器端什么也没收到。
我已经在同一台计算机上测试了代码,并且已连接(作为应用程序),并且它接收通过PrintWriter发送的字符串。
Android应用:
class SocketConnector extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... voids) {
try {
Socket socket = new Socket("192.168.2.116", Constant.HUB_PORT);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
JSONObject jsonObject = new JSONObject();
jsonObject.put("command", "some_command");
jsonObject.put("value", "some_value");
out.println(jsonObject.toString());
Log.v("json", jsonObject.toString());
Log.v("Echo: ", in.readLine());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (NetworkErrorException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
Java服务器:
while (true) {
//Open socket
ServerSocket serverSocket = new ServerSocket(Constant.SOCKET_PORT);
//wait for client connection
Socket clientSocket = serverSocket.accept();
//create input/output streams
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
System.out.println("Connected");
String jsonString;
while ((jsonString = in.readLine()) != null) {
System.out.println(jsonString);
}
System.out.println(jsonString);
//pass command and value to handleCommand method
JSONObject jsonObject = new JSONObject(jsonString);
JSONObject response = handleCommand(jsonObject.getString(Constant.JSON_COMMAND), jsonObject.getString(Constant.JSON_VALUE));
out.println(response.toString());
serverSocket.close();
clientSocket.close();
}
}
我希望android应用正确发送数据,或者java服务器套接字正确接收发送的数据。
答案 0 :(得分:0)
不能停止思考,因为它看起来很奇怪。不过,我有一个解释,所以我将在回答上做些刺探:
您有两个客户端连接到达服务器。连接1连接并且不发送任何东西(原因未知)。连接2连接并发送数据有效载荷。但是,服务器甚至从未尝试读取该有效负载,因为它一直忠实地等待连接1发送某些内容(它从未这样做)。第二个套接字甚至从未accept()
-ed。
自然,当您使用调试器检查服务器时,会看到它在readLine()
上等待。您的错误是假设readLine()
与连接2相关联。
顺便说一下,这与.pcap息息相关;即使没有accept()
版本的客户端连接,它仍然会收到ACK,并且可以自由地将更多数据发送到服务器。此类数据也将被确认。毕竟,服务器操作系统正在接收数据。您的服务器程序根本没有要求它。
有许多原因使之在进行localhost测试时可能起作用。很有可能与时间有关。