【问题标题】:Android client socket doesn't send data after some timeAndroid客户端套接字在一段时间后不发送数据
【发布时间】:2013-05-05 12:44:45
【问题描述】:

我正在开发一个 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 显示未到达桌面应用程序(服务器)的传入“红色”数据包 看这张图片。 你可以看到前几个有 Len > 0 红色有 0。

我认为是时候让 Google 连接 USB 以便我们可以使用它了。至少那会是我的第一选择。

【问题讨论】:

  • 顺便说一句:0.66 是电话(客户端),0.65 是笔记本电脑(服务器)。
  • 将发送缓冲区大小设置为数据包大小是徒劳的。您最好不要管它或将其增加到默认值之外。如果您使用SocketTimeoutException 以外的套接字获得任何IOException,则必须关闭它。
  • 是的。这是在另一个类中完成的,该类通过调用{object}.Close() 实例化Network() 类。当每个网络方法返回时,我检查返回值(真/假),然后根据我调用的方法关闭套接字(即 SendPacket(),因为套接字之前打开过)
  • 这听起来不像你做过任何事情。套接字应该在 catch 块中关闭。
  • 您说您已经调试了程序并且服务器正在发送但没有接收到数据,那么我们需要服务器代码来告诉您可能出现的问题。正如您所说,您发布的部分工作正常。

标签: android sockets tcp freeze


【解决方案1】:

如果您不再使用它,您是否应该在刷新流后不调用oStream.close()

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

【讨论】:

  • 我现在离我的电脑不近,但我想你只是在这里有所启发。我需要添加某种锁。此外,我创建的每个 AsyncTask 都会在 AsyncTask.onPostExecute() 中自行销毁。我忘了你不能拼写没有锁的多线程。我会回来并可能标记你的答案
  • 不。线程同步也不起作用。因此,在它挂起并且我退出应用程序并关闭 Wi-Fi 之后,异常开始出现。线程实际上最终会卡在内存中。我的意思是每个线程在发送数据包后终止。所以我认为它必须与套接字以某种方式阻塞使线程阻塞。
【解决方案2】:

好的。我改用UDP解决了这个问题。谢谢你们。 但是我还是没有找到问题的根源。

【讨论】:

    猜你喜欢
    • 2013-05-31
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2012-07-24
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多