我正在写我的android应用程序通过TCP/IP简单的服务器。服务器超时后接收数据包TCP/IP
我面临一个问题,即服务器只在应用程序超时后收到消息。
我的服务器端:
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);
}
应用程序方面:
if (ack.equals("READY")) {
ack = "";
dataOutputStream.writeBytes(command);
dataOutputStream.flush();
buf = new byte[556];
dataInputStream.read(buf);
// app hangs on read() and gets timeout
}
的问题是,服务器接收应用程序被读取超时后,才命令。
我目前的情况是这样的:
- 连接受理:申请接收“READY”
- 应用程序发送的命令,并试图从服务器读取
服务器被挂在readFromUser响应(),只有应用程序读取超时后收到消息。
任何想法我做错了什么?
更新:
代码工作,如果我使用输入行,而不是read(BUF)(如果我没有理解清楚的服务器挂在读(BUF),并在等待模式插座不即使没有更多的数据beeing发送。)
然而,这样的方式,我必须在每个命令后添加“\ n”,而服务器只是模拟器,应用程序与不理解“\ 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"
,并将该命令视为无法识别......我仅仅为了测试目的而编写此服务器,并且希望它尽可能接近真实。
以前我只是想获得它不"\n"
使用inFromClient.read(cbuf);
代替readLine()
和服务器始终得到了挂在读取每个命令完成,接收到的命令套接字在客户端关闭之后。尽管我知道客户端发送了命令并正在等待响应。
问题是如何在客户端不使用readLine();
和"\n"
来接收命令。
你如何阅读客户端中的'ack'?你确定超时不是在阅读'ack'吗?这对我来说会更有意义。 – EJP
不可以超时。请查看有关问题的更新。问题是服务器没有收到数据。那么它正在接收数据,但它会在读取时挂起,并等待更多数据来临。并且只有在套接字关闭之后,该命令才从读取(buf)中恢复。 – Datenshi
那么readFromUser()和writeToUser()会做什么? – EJP