我有一个Android客户端,可将数据发送到Java服务器。经过一些服务器处理后,我希望服务器回复给客户端,但是我无法上班。
最初,客户端和服务器都卡在上readLine()
,因此我添加\n
了两者,但仍然没有变化。经过长时间的搜索后,我尝试关闭客户端连接,然后服务器运行,但是客户端给出了错误,因为套接字已关闭。正确的方法是什么?为什么?
客户代码:
private class sendToServer extends AsyncTask<JSONObject, Void, String> {
@Override
protected String doInBackground(JSONObject... userData) {
Socket clientSocket;
try {
clientSocket = new Socket("10.0.2.2", 7878);
BufferedOutputStream outToServer = new BufferedOutputStream(clientSocket.getOutputStream());
outToServer.write( (userData[0].toString() + '\n').getBytes() );
outToServer.flush();
BufferedReader inFromServer = new BufferedReader(new Inpu tStreamReader(clientSocket.getInputStream()));
String reply = inFromServer.readLine();
outToServer.close();
Log.d("",reply);
inFromServer.close();
clientSocket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
服务器代码:
@Override
public void run() {
try {
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuilder builder = new StringBuilder();
String line;
while ((line = inFromClient.readLine()) != null)
builder.append(line);
BufferedOutputStream outToClient = new BufferedOutputStream(connection.getOutputStream());
outToClient.write( ("ACK" + '\n').getBytes() );
outToClient.flush();
inFromClient.close();
putToClient.close();
parseIncomingData(builder.toString());
} catch (Exception e) {
System.out.println(e);
} finally {
try {
connection.close();
} catch (IOException e) {
System.out.println(e);
}
}
}
看起来您的服务器将继续读取行,直到返回null为止。直到流另一端关闭时,这种情况才会发生。作为测试,只需执行一个readLine(摆脱while循环),然后查看对于单个消息是否一切正常。
或者,您可以从客户端发送一个空字符串(或某个“特殊”终止符字符串)作为最后一个字符串-然后您可以在服务器上检查该“特殊”字符串或空字符串以打破while readline循环。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句