【问题标题】:How does TCP connection works on Android?TCP 连接如何在 Android 上工作?
【发布时间】:2015-09-25 06:06:58
【问题描述】:

我正在使用 smack 在 Android 中构建聊天应用程序。我正在使用sticky_service 来保持连接。我很困惑,如果我的应用程序进入睡眠状态,TCP 连接会发生什么。我在页面上阅读了几个答案 - How to make the Android device hold a TCP connection to Internet without wake lock?

它会在短时间内唤醒 - 对于 smack,我可以将其视为进程消息侦听器 (http://www.programcreek.com/java-api-examples/index.php?api=org.jivesoftware.smack.MessageListener) 被调用。为此,我在 db 中插入数据。是否有任何保证工作会完成,或者如果执行在两者之间,它会从那里开始。

【问题讨论】:

    标签: java android tcp smack


    【解决方案1】:

    你好亲爱的你可以使用这个代码sn-p:

    protected void connect() {
        Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": connecting");
        features.encryptionEnabled = false;
        lastConnect = SystemClock.elapsedRealtime();
        lastPingSent = SystemClock.elapsedRealtime();
        this.attempt++;
        try {
            shouldAuthenticate = shouldBind = !account.isOptionSet(Account.OPTION_REGISTER);
            tagReader = new XmlReader(wakeLock);
            tagWriter = new TagWriter();
            packetCallbacks.clear();
            this.changeStatus(Account.State.CONNECTING);
            final Bundle result = DNSHelper.getSRVRecord(account.getServer());
            final ArrayList<Parcelable> values = result.getParcelableArrayList("values");
            if ("timeout".equals(result.getString("error"))) {
                throw new IOException("timeout in dns");
            } else if (values != null) {
                int i = 0;
                boolean socketError = true;
                while (socketError && values.size() > i) {
                    final Bundle namePort = (Bundle) values.get(i);
                    try {
                        String srvRecordServer;
                        try {
                            srvRecordServer = IDN.toASCII(namePort.getString("name"));
                        } catch (final IllegalArgumentException e) {
                            // TODO: Handle me?`
                            srvRecordServer = "";
                        }
                        final int srvRecordPort = namePort.getInt("port");
                        final String srvIpServer = namePort.getString("ip");
                        final InetSocketAddress addr;
                        if (srvIpServer != null) {
                            addr = new InetSocketAddress(srvIpServer, srvRecordPort);
                            Log.d(Config.LOGTAG, account.getJid().toBareJid().toString()
                                    + ": using values from dns " + srvRecordServer
                                    + "[" + srvIpServer + "]:" + srvRecordPort);
                        } else {
                            addr = new InetSocketAddress(srvRecordServer, srvRecordPort);
                            Log.d(Config.LOGTAG, account.getJid().toBareJid().toString()
                                    + ": using values from dns "
                                    + srvRecordServer + ":" + srvRecordPort);
                        }
                        socket = new Socket();
                        socket.connect(addr, 20000);
                        socketError = false;
                    } catch (final UnknownHostException e) {
                        Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": " + e.getMessage());
                        i++;
                    } catch (final IOException e) {
                        Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": " + e.getMessage());
                        i++;
                    }
                }
                if (socketError) {
                    throw new UnknownHostException();
                }
            } else if (result.containsKey("error")
                    && "nosrv".equals(result.getString("error", null))) {
    
    
                 //todo:change here to server.
    
    
     socket = new Socket(server_ip, server port);
    
        } else {
            throw new IOException("timeout in dns");
        }
        final OutputStream out = socket.getOutputStream();
        tagWriter.setOutputStream(out);
        final InputStream in = socket.getInputStream();
        tagReader.setInputStream(in);
        tagWriter.beginDocument();
        sendStartStream();
        Tag nextTag;
        while ((nextTag = tagReader.readTag()) != null) {
            if (nextTag.isStart("stream")) {
                processStream(nextTag);
                break;
            } else {
                throw new IOException("unknown tag on connect");
            }
        }
        if (socket.isConnected()) {
            socket.close();
        }
    } catch (final UnknownHostException | ConnectException e) {
        this.changeStatus(Account.State.SERVER_NOT_FOUND);
    } catch (final IOException | XmlPullParserException | NoSuchAlgorithmException e) {
        Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": " + e.getMessage());
        this.changeStatus(Account.State.OFFLINE);
    } finally {
        if (wakeLock.isHeld()) {
    
    
              try {
                    wakeLock.release();
                } catch (final RuntimeException ignored) {
                }
            }
        }
    }
    

    享受你的代码吧:)

    【讨论】:

      猜你喜欢
      • 2011-10-06
      • 2014-05-15
      • 2018-02-18
      • 2013-09-26
      • 2021-12-27
      • 2021-10-10
      • 2015-07-04
      • 2023-03-05
      • 2015-03-20
      相关资源
      最近更新 更多