Android客户端套接字在一段时间后不发送数据

时间:2013-05-05 12:44:46

标签: android sockets tcp hang

我正在开发一个Android实时数据应用程序,它通过TCP套接字将数据(浮点数和整数)发送到本地子网上的服务器。我面临的问题是,在同时发送一些数据之后,套接字根本不会发送任何数据。我调试了应用程序,它显示数据正在发送但不会显示在服务器上。在这种情况发生后如果我关闭连接,服务器甚至不会根据我的设计模型获得连接已被终止的通知。同时我在应用程序上得到一个例外,说它无法写入损坏的管道。这告诉我问题在于应用程序,因为我也使用桌面应用程序进行了测试,我可以向服务器发送大量数据并将其交付。

请注意,我在这里讨论的数据大小为 252字节每个数据包。

这是我正在使用的课程。 (这在AsyncTask对象中运行)

    public class Network
{
    private Socket handle;
    public static enum TASK
    {
        TASK_CONNECT, TASK_SEND, TASK_CLOSE 
    }
    public Network()
    {

    }
    public String lastError = "";
    public boolean Connect(String host, int port)
    {
        try
        {
            lastError = "Connecting to server.";
            handle = new Socket(host, port);

            handle.setTcpNoDelay(true); //                         
            handle.setSendBufferSize(SIZE_OF_PACKET);  ///==> These don't seem to help at all
            handle.setKeepAlive(true); ///                          

            return true;
        }catch(IOException e)
        {
            lastError += e.getMessage() != null ? " "+ e.getMessage() : "";
            return false;
        }
    }
    private void err(String e){
        System.err.println(e);
    }

    private boolean SendPacket(byte buffer[])
    {
        OutputStream oStream = null;
        err("sending: " + buffer.length + " bytes");

        try
        {
            lastError = "Obtaining output stream.";
            oStream = handle.getOutputStream();

            lastError = "Error sending data.";
            oStream.write(buffer);

            oStream.flush();

            return true;
        }catch(Exception e)
        {
            lastError += e.getMessage() != null ? " "+ e.getMessage() : "";
        }
        return false;
    }

    public void Close()
    {
        try{ handle.close(); handle = null; }catch(Exception e){} // swallow exception
    }
}

我根据我拥有的数字来循环发送数据。我尝试过谷歌搜索,但没有发现任何相关内容。有谁之前经历过这个吗?它现在让我发疯了。

编辑:Wireshark显示传入"红色"无法访问桌面应用的数据包(服务器) 看这张图片。 enter image description here 你可以看到前几个有 Len> 0 红色的那些有0。

我认为现在是Google与USB接口的时间,所以我们可以使用它。至少那将是我的第一选择。

2 个答案:

答案 0 :(得分:0)

在您刷新流后,您是否应该调用oStream.close(),假设您再也不使用它了?

另外,您说这是在AsyncTask对象中运行的。是否有可能多个线程同时尝试发送数据包?如果是这样,您可能需要围绕SendPacket方法进行某种形式的同步。

答案 1 :(得分:0)

确定。我通过使用UDP来解决问题。谢谢你们。 但我仍然没有找到问题的根源。