Android套接字连接超时

2023-11-21

我的android应用程序通过socket连接到服务器,这是在node.js中编码的。当在前台停留 15 分钟时,它会丢失与服务器的连接。以下是sockt连接服务器的代码

public void connect() {
    this.connectionStatus = CONNECT_STATUS_CONNECTING;
    Log.v(AppConstants.DEBUG_TAG, userId + " : Connecting to Server");
    if (mThread != null && mThread.isAlive()) {
        return;
    }
    mThread = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Log.v(AppConstants.DEBUG_TAG, userId + " : Thread Action Started");
                String secret = createSecret();

                int port = (mURI.getPort() != -1) ? mURI.getPort() : (mURI.getScheme().equals("wss") ? 443 : 80);

                String path = TextUtils.isEmpty(mURI.getPath()) ? "/" : mURI.getPath();
                if (!TextUtils.isEmpty(mURI.getQuery())) {
                    path += "?" + mURI.getQuery();
                }
                String originScheme = mURI.getScheme().equals("wss") ? "https" : "http";
                URI origin = new URI(originScheme, "//" + mURI.getHost(), null);

                SocketFactory factory = mURI.getScheme().equals("wss") ? getSSLSocketFactory() : SocketFactory.getDefault();
                mSocket = factory.createSocket(mURI.getHost(), port);
                mSocket.setKeepAlive(true);


                PrintWriter out = new PrintWriter(mSocket.getOutputStream());
                out.print("GET " + path + " HTTP/1.1\r\n");
                out.print("Upgrade: websocket\r\n");
                out.print("Connection: Upgrade\r\n");
                out.print("Host: " + mURI.getHost() + "\r\n");
                out.print("Origin: " + origin.toString() + "\r\n");
                out.print("Sec-WebSocket-Key: " + secret + "\r\n");
                out.print("Sec-WebSocket-Version: 13\r\n");
                if (mExtraHeaders != null) {
                    for (NameValuePair pair : mExtraHeaders) {
                        out.print(String.format("%s: %s\r\n", pair.getName(), pair.getValue()));
                    }
                }
                out.print("\r\n");
                out.flush();

                HybiParser.HappyDataInputStream stream = new HybiParser.HappyDataInputStream(mSocket.getInputStream());

                // Read HTTP response status line.
                StatusLine statusLine = parseStatusLine(readLine(stream));
                if (statusLine == null) {
                    Log.v(AppConstants.DEBUG_TAG, "Received no reply from server.");
                    throw new HttpException("Received no reply from server.");
                } else if (statusLine.getStatusCode() != HttpStatus.SC_SWITCHING_PROTOCOLS) {
                    throw new HttpResponseException(statusLine.getStatusCode(), statusLine.getReasonPhrase());
                }

                // Read HTTP response headers.
                String line;
                boolean validated = false;

                while (!TextUtils.isEmpty(line = readLine(stream))) {
                    Header header = parseHeader(line);
                    if (header.getName().equals("Sec-WebSocket-Accept")) {
                        String expected = createSecretValidation(secret);
                        String actual = header.getValue().trim();

                        if (!expected.equals(actual)) {
                            Log.v(AppConstants.DEBUG_TAG, "Bad Sec-WebSocket-Accept header value.");
                            throw new HttpException("Bad Sec-WebSocket-Accept header value.");
                        }
                        validated = true;
                    }
                }

                if (!validated) {
                    Log.v(AppConstants.DEBUG_TAG, "No Sec-WebSocket-Accept header.");
                    throw new HttpException("No Sec-WebSocket-Accept header.");
                }
                onConnect();
                Log.v(AppConstants.DEBUG_TAG, userId + " : Thread should be connected by now");
                // Now decode websocket frames.
                mParser.start(stream);
            } catch (EOFException ex) {
                Log.d(AppConstants.DEBUG_TAG, "WebSocket EOF!", ex);
                onDisconnect(0, "EOF");
            } catch (SSLException ex) {
                // Connection reset by peer
                Log.d(AppConstants.DEBUG_TAG, "Websocket SSL error!", ex);
                onDisconnect(0, "SSL");
            } catch (Exception ex) {
                onError(ex);
            }
        }
    });
    Log.v(AppConstants.DEBUG_TAG, userId + " : Thread about to be started");
    mThread.start();
}

anu 解决这个问题吗?


经过大量谷歌搜索后,我找到了解决这个问题的方法。为套接字连接添加超时。

mSocket.setSoTimeout(10*1000);

如果没有任何响应,10秒后就会抛出SocketTimeoutException并在捕获此异常时关闭连接(如果存在),然后再次连接。

catch (SocketTimeoutException e) {
  if (mSocket.isConnected()) {
    disconnect();
  }
  connect();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android套接字连接超时 的相关文章

随机推荐

  • C#:小数与浮点相乘?

    我想执行以下操作 小数 小数 浮动 100 做到这一点最有效的方法是什么 你想要的结果是float var result float d f 100 或作为小数 var result d decimal f 100 我当然质疑混合decim
  • Rails 不会加载资产管道

    I ran rake assets precompile由于开发过程中的错误 Rails 停止加载开发过程中的资源 我只得到application js and application css loaded 应用程序 js require
  • Wiremock 独立 - 如何使用请求数据操作响应

    我试图使用 Wiremock 独立服务器来实现 POST REST 调用的模拟 我面临这样的挑战 假设帖子正文包含 名称 字段及其值 则该 POST 调用的响应中应返回相同的值 我的 json 文件如下所示 priority 1 reque
  • 将字符串转换为类

    我试图根据一些用户输入在一个活动之间移动到另一个活动 我正在尝试使用 String myClass some user input class Intent myIntent new Intent getApplicationContext
  • Java 服务器 JavaScript 客户端 WebSocket

    我正在尝试在 Java 服务器和 JavaScript 客户端之间建立连接 但我在客户端收到此错误 与 ws 127 0 0 1 4444 的 WebSocket 连接失败 连接在收到握手响应之前关闭 它可能会保持在 OPENNING 状态
  • Android TTS 中缺少语言

    我正在开发一个使用谷歌提供的 TextToSpeech 功能的 Android 应用程序 并遵循以下示例 来自 Google 的 TTS 示例 我想知道这一行 int result mTts setLanguage Locale US if
  • 为什么 range(start, end) 不包括 end? [复制]

    这个问题在这里已经有答案了 gt gt gt range 1 11 给你 1 2 3 4 5 6 7 8 9 10 为什么不是1 11 他们只是决定随机这样做还是有一些我没有看到的价值 因为更常见的是打电话range 0 10 返回 0 1
  • 如何从打字稿中的类型中省略 [key:string]: any ? [复制]

    这个问题在这里已经有答案了 说我有 interface A apple number key string any interface B extends A banana number 我想要一个type C延伸所有自A以及所有来自B e
  • random.shuffle() 的逆函数?

    我有一个函数 为了简单起见 我将其称为 shuffler 它需要一个列表 随机给出种子 17 然后打印该列表 def shuffler n import random random seed 17 print random shuffle
  • 重置提供商数据 - Flutter

    我在我的应用程序中使用多提供商 Provider 工作得很好 它存储数据 并且在任何事情发生变化时提供完美的事件 现在 我的应用程序中有这个场景 gt 用户 1 已登录 现在 当我在同一登录中添加第二个帐户 例如 Gmail 多帐户 时 提
  • Java 记录器 - 令牌的撇号问题

    我有一些无法解释的行为java util logging 让我们看一下这两个示例 First boolean var false log log Level WARNING Cant 0 new Object var output Cant
  • 如何将 int 转换为十六进制字符串?

    我想将一个整数 例如 我想通过65然后出去 x41 or 255并得到 xff 我尝试过这样做struct pack c 65 但是上面的任何东西都会窒息9因为它想要接受单个字符串 您正在寻找chr功能 您似乎混合了整数的十进制表示形式和整
  • 如果接收到有效负载大小为 0 的有效 TCP 数据包,recv() 将返回什么值

    在TCP套接字编程中 如果recv 返回0 表示对方关闭了连接 然而 据我所知 TCP RFC 并不强制要求 TCP 的有效负载 gt 0 因此 理论上 TCP 堆栈可以接收有效负载为 0 的消息 所以 本质上我的问题是recv 如果接收到
  • 无法在 Nuget 中将 Ninject 升级到最新版本

    我有一个 ASP NET WebForms 应用程序 它使用一些 Ninject 包 但我卡在某个版本上 当我尝试升级到最新版本时 出现 无法解决依赖项 问题 有问题的包是 Package InstalledVer LatestVer Ni
  • spring - 从类的静态字段中的属性文件中读取属性值

    我有一个实用程序类 其中有一种方法需要用户名和密码才能连接其他网址 我需要将该用户名保留在属性文件中 以便我可以随时更改它 但当我在静态方法 作为实用程序类 中使用它时 问题是它显示 null 即它无法从属性文件中读取 但是当我检查其他控制
  • bash 别名和 awk 引号转义

    我正在尝试为命令创建别名来查看内存使用情况 ps u user o rss command grep v peruser awk sum 1 END print sum 1024 但是 天真的人 bash aliases alias tot
  • boto3 file_upload 检查文件是否存在

    我正在查看 boto3 文档 但找不到它本身是否支持检查文件是否已存在于 s3 中 如果不存在 请不要尝试重新上传 这是我正在做的工作 import boto3 s3 client boto3 client s3 s3 bucket buc
  • Canvas DrawImage() 质量差[重复]

    这个问题在这里已经有答案了 我对 Html5 画布有疑问 i draw an image but its quality becomes very poor 当我用画布绘制它之后 它就变成了这样 我的代码在这里
  • 当对基元和装箱值使用 == 时,是完成自动装箱还是完成拆箱

    以下代码可编译 使用 Java 8 Integer i1 1000 int i2 1000 boolean compared i1 i2 但它有什么作用呢 Unbox i1 boolean compared i1 intvalue i2 o
  • Android套接字连接超时

    我的android应用程序通过socket连接到服务器 这是在node js中编码的 当在前台停留 15 分钟时 它会丢失与服务器的连接 以下是sockt连接服务器的代码 public void connect this connectio