服务器在超时TCP / IP后接收数据包

时间:2014-05-06 06:38:29

标签: java android sockets tcp

我正在通过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
            }

问题是,服务器只在应用程序获得读取超时后才会收到命令。

我目前的情况是:

  1. 接受连接:应用程序收到" READY"
  2. 应用程序发送命令并尝试从服务器读取响应
  3. 服务器挂在readFromUser()上,只在应用程序读取超时后才收到消息。

    任何想法我做错了什么?

  4. 更新

    如果我使用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"的情况下接收命令。

3 个答案:

答案 0 :(得分:1)

'如何在不使用readLine()的情况下接收命令;和“\ n”在客户端'。如果您不希望或不能使用“\ n”作为命令终止符,则必须使用其他协议来识别TCP八位字节/字节流中“命令”的开始和结束。

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

答案 1 :(得分:0)

你正在读行,但你不是在写行。因此readLine()会阻塞,直到行终止符到达或对等方关闭连接。

附加\n.

答案 2 :(得分:-1)

为什么不从APP方面增加超时。或者你可以编写一个线程,在一段时间内命中服务器一段时间,如果没有响应则显示超时。此问题出现在Apps方面。