我正在通过TCP / IP为我的Android应用程序编写简单的服务器。
我遇到的问题是服务器只在应用程序超时后收到消息。
我的服务器端:
System.out.println("Connection accepted");
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
capitalizedSentence = "READY";
writeToUser(outToClient, "READY".getBytes());
String response = readFromUser(connectionSocket);
// Server hangs on readFromUser();
if(response.contains("IL"))
{
byte[] bytes = DatatypeConverter.parseHexBinary(foo);
writeToUser(outToClient, bytes);
}
App方面:
if (ack.equals("READY")) {
ack = "";
dataOutputStream.writeBytes(command);
dataOutputStream.flush();
buf = new byte[556];
dataInputStream.read(buf);
// app hangs on read() and gets timeout
}
问题是,服务器只在应用程序获得读取超时后才会收到命令。
我目前的情况是:
服务器挂在readFromUser()上,只在应用程序读取超时后才收到消息。
任何想法我做错了什么?
更新
如果我使用readLine而不是read(buf),代码可以工作(如果我清楚地理解服务器挂起读取(buf)并且处于等待模式,因为套接字尚未关闭,即使没有更多数据被发送。)
但是这样我必须添加" \ n"在每个命令之后,服务器只是模拟器,app适用于不理解的不同设备" \ n"在最后,将崩溃。 有没有办法在不使用readLine()的情况下完成这项工作?
更新2
public void writeToUser(DataOutputStream outToClient, byte[] bytes) throws IOException
{
outToClient.write(bytes);
outToClient.flush();
String s = new String(bytes);
writeLog("Sent to client: " + s);
}
public String readFromUser(Socket socket) throws IOException, InterruptedException
{
writeLog("Reading...");
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String clientSentence = inFromClient.readLine();
writeLog("Received: " + clientSentence);
return clientSentence;
}
以上readFromUser()
方法的工作方式与预期一致。但是,这需要在客户端应用程序发送的每个命令上添加"\n"
。我必须与之通信的真实设备不理解"\n"
并将命令视为无法识别...我正在编写此服务器仅用于测试目的,我希望它尽可能接近实际。< / p>
以前我只是尝试使用"\n"
代替inFromClient.read(cbuf);
而不使用readLine()
来完成它,并且服务器总是在读取时挂起,并且仅在套接字关闭后才接收命令在客户端。即使我知道客户端发送命令并等待响应。
问题是如何在客户端不使用readLine();
和"\n"
的情况下接收命令。
答案 0 :(得分:1)
'如何在不使用readLine()的情况下接收命令;和“\ n”在客户端'。如果您不希望或不能使用“\ n”作为命令终止符,则必须使用其他协议来识别TCP八位字节/字节流中“命令”的开始和结束。
您的“真实设备”服务器使用什么协议来识别命令的开始和结束?如果它使用逐字节状态机来识别有效命令,那么您将不得不在测试服务器中复制它。
答案 1 :(得分:0)
你正在读行,但你不是在写行。因此readLine()会阻塞,直到行终止符到达或对等方关闭连接。
附加\n.
答案 2 :(得分:-1)
为什么不从APP方面增加超时。或者你可以编写一个线程,在一段时间内命中服务器一段时间,如果没有响应则显示超时。此问题出现在Apps方面。