2014-05-06 32 views
0

我正在写我的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 
      } 

的问题是,服务器接收应用程序被读取超时后,才命令。

我目前的情况是这样的:

  1. 连接受理:申请接收“READY”
  2. 应用程序发送的命令,并试图从服务器读取
  3. 服务器被挂在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"来接收命令。

+0

你如何阅读客户端中的'ack'?你确定超时不是在阅读'ack'吗?这对我来说会更有意义。 – EJP

+0

不可以超时。请查看有关问题的更新。问题是服务器没有收到数据。那么它正在接收数据,但它会在读取时挂起,并等待更多数据来临。并且只有在套接字关闭之后,该命令才从读取(buf)中恢复。 – Datenshi

+0

那么readFromUser()和writeToUser()会做什么? – EJP

回答

1

'如何在不使用readLine()的情况下接收命令;和“\ n”在客户端“。如果您不想或不想使用“\ n”作为命令终止符,那么您必须使用另一种协议来标识TCP八位字节/字节流内“命令”的开始和结束。

您的'真实设备'服务器使用什么协议来识别命令的开始和结束?如果它使用逐字节的状态机来识别有效的命令,那么你将不得不在你的测试服务器中复制它。

+0

这正是我所要求的。可悲的是,我对真实设备不负责任,并且正如您所说的那样。我想有没有简单的方法让我的测试服务器没有“\ n”。我的问题不是很技术性的但你的回答是对的。谢谢。 – Datenshi

-1

为什么不从APPs端增加超时。或者你可以编写一段时间在某个时间间隔内触发服务器的线程,如果没有响应,则显示超时。这个问题是在应用程序方面。

+1

超时已经是15000ms,服务器在应用程序超时后立即收到命令。我知道问题出在应用程序上,但我无法理解在哪里。 – Datenshi

0

您正在阅读的文章,但您并未撰写文章。所以readLine()阻塞,直到行结束符到达或对等关闭连接。

附加一个\n.

+0

嗯,我正在读取服务器中的行,并将行写入服务器。 (有问题的代码仅来自服务器端)我没有阅读应用程序中的行,也没有写应用程序的行。 (这个解决方案没有问题)问题是,我试图使这个尽可能接近真正的设备通信,并删除readline()只需read()。请看@马丁詹姆斯的回答,他清楚地知道我面临的问题。你的回答是技术性的,但你误解了我的问题。我不太会说流利的英语和解释,所以很抱歉。 – Datenshi

相关问题