⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 httpdatachannel.java

📁 Android平台上即时通讯聊天工具源代码。 支持手机聊天。
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
            try {                if (mKeepAliveMillis <= 0) {                    primitive = mSendQueue.take();                } else {                    primitive = mSendQueue.poll(mKeepAliveMillis, TimeUnit.MILLISECONDS);                    if (primitive == null) {                        if (!mStopped) {                            needKeepAlive = true;                        }                        continue;                    }                }            } catch (InterruptedException e) {                if (mStopped) {                    break;                }                continue;            }            if (primitive.getType().equals(ImpsTags.Polling_Request)) {                mHasPendingPolling.set(false);            }            doSendPrimitive(primitive);        }        mHttpClient.close();    }    private void sendKeepAlive() {        ImpsTransactionManager tm = mConnection.getTransactionManager();        AsyncTransaction tx = new AsyncTransaction(tm) {            @Override            public void onResponseError(ImpsErrorInfo error) {            }            @Override            public void onResponseOk(Primitive response) {                // Since we never request a new timeout value, the response                // can be ignored            }        };        tx.sendRequest(mKeepAlivePrimitive);    }    /**     * Sends a primitive to the IMPS server through HTTP.     *     * @param p The primitive to send.     */    private void doSendPrimitive(Primitive p) {        String errorInfo = null;        int retryCount = 0;        long retryDelay = INIT_RETRY_DELAY_MS;        while (retryCount < MAX_RETRY_COUNT) {            try {                trySend(p);                return;            } catch (IOException e) {                errorInfo = e.getLocalizedMessage();                String type = p.getType();                if (ImpsTags.Login_Request.equals(type)                        || ImpsTags.Logout_Request.equals(type)) {                    // we don't retry to send login/logout request. The request                    // might be sent to the server successfully but we failed to                    // get the response from the server. Retry in this case might                    // cause multiple login which is not allowed by some server.                    break;                }                if (p.getTransactionMode() == TransactionMode.Response) {                    // Ignore the failure of sending response to the server since                    // it's only an acknowledgment. When we get here, the                    // primitive might have been sent successfully but failed to                    // get the http response. The server might or might not send                    // the request again if it does not receive the acknowledgment,                    // the client is ok to either case.                    return;                }                retryCount++;                // sleep for a while and retry to send the primitive in a new                // transaction if we havn't met the max retry count.                if (retryCount < MAX_RETRY_COUNT) {                   mTxManager.reassignTransactionId(p);                    Log.w(ImpsLog.TAG, "Send primitive failed, retry after " + retryDelay + "ms");                    synchronized (mRetryLock) {                        try {                            mRetryLock.wait(retryDelay);                        } catch (InterruptedException ignore) {                        }                        if (mStopRetry) {                            break;                        }                    }                    retryDelay = retryDelay * 2;                    if (retryDelay > MAX_RETRY_DELAY_MS) {                        retryDelay = MAX_RETRY_DELAY_MS;                    }                }            }        }        Log.w(ImpsLog.TAG, "Failed to send primitive after " + MAX_RETRY_COUNT + " retries");        mTxManager.notifyErrorResponse(p.getTransactionID(),                ImErrorInfo.NETWORK_ERROR, errorInfo);    }    private void trySend(Primitive p) throws IOException {        ByteArrayOutputStream out = new ByteArrayOutputStream();        try {            mSerializer.serialize(p, out);        } catch (SerializerException e) {            mTxManager.notifyErrorResponse(p.getTransactionID(),                    ImErrorInfo.SERIALIZER_ERROR,                    "Internal serializer error, primitive: " + p.getType());            out.close();            return;        }        HttpPost req = new HttpPost(mPostUri);        req.addHeader(mContentTypeHeader);        if (mMsisdnHeader != null) {            req.addHeader(mMsisdnHeader);        }        ByteArrayEntity entity = new ByteArrayEntity(out.toByteArray());        req.setEntity(entity);        mLastActive = SystemClock.elapsedRealtime();        if (Log.isLoggable(ImpsLog.TAG, Log.DEBUG)) {            long sendBytes = entity.getContentLength() + 176 /* approx. header length */;            ImpsLog.log(mConnection.getLoginUserName() + " >> " + p.getType() + " HTTP payload approx. " + sendBytes + " bytes");        }        if (Log.isLoggable(ImpsLog.PACKET_TAG, Log.DEBUG)) {            ImpsLog.dumpRawPacket(out.toByteArray());            ImpsLog.dumpPrimitive(p);        }        HttpResponse res = mHttpClient.execute(req);        StatusLine statusLine = res.getStatusLine();        HttpEntity resEntity = res.getEntity();        InputStream in = resEntity.getContent();        if (Log.isLoggable(ImpsLog.PACKET_TAG, Log.DEBUG)) {            Log.d(ImpsLog.PACKET_TAG, statusLine.toString());            Header[] headers = res.getAllHeaders();            for (Header h : headers) {                Log.d(ImpsLog.PACKET_TAG, h.toString());            }            int len = (int) resEntity.getContentLength();            if (len > 0) {                byte[] content = new byte[len];                int offset = 0;                int bytesRead = 0;                do {                    bytesRead = in.read(content, offset, len);                    offset += bytesRead;                    len -= bytesRead;                } while (bytesRead > 0);                in.close();                ImpsLog.dumpRawPacket(content);                in = new ByteArrayInputStream(content);            }        }        try {            if (statusLine.getStatusCode() != HttpURLConnection.HTTP_OK) {                mTxManager.notifyErrorResponse(p.getTransactionID(), statusLine.getStatusCode(),                        statusLine.getReasonPhrase());                return;            }            if (resEntity.getContentLength() == 0) {                // empty responses are only valid for Polling-Request or                // server initiated transactions                if ((p.getTransactionMode() != TransactionMode.Response)                        && !p.getType().equals(ImpsTags.Polling_Request)) {                    mTxManager.notifyErrorResponse(p.getTransactionID(),                            ImErrorInfo.ILLEGAL_SERVER_RESPONSE,                            "bad response from server");                }                return;            }            Primitive response = mParser.parse(in);            if (Log.isLoggable(ImpsLog.PACKET_TAG, Log.DEBUG)) {                ImpsLog.dumpPrimitive(response);            }            if (Log.isLoggable(ImpsLog.TAG, Log.DEBUG)) {                long len = 2 + resEntity.getContentLength() + statusLine.toString().length() + 2;                Header[] headers = res.getAllHeaders();                for (Header header : headers) {                    len += header.getName().length() + header.getValue().length() + 4;                }                ImpsLog.log(mConnection.getLoginUserName() + " << "                        + response.getType() + " HTTP payload approx. " + len + "bytes");            }            if (!mReceiveQueue.offer(response)) {                // This is almost impossible for a LinkedBlockingQueue.                // We don't even bother to assign an error code for it.                mTxManager.notifyErrorResponse(p.getTransactionID(),                        ImErrorInfo.UNKNOWN_ERROR, "receiving queue full");            }        } catch (ParserException e) {            ImpsLog.logError(e);            mTxManager.notifyErrorResponse(p.getTransactionID(),                    ImErrorInfo.PARSER_ERROR,                    "Parser error, received a bad response from server");        } finally {            //consume all the content so that the connection can be re-used.            resEntity.consumeContent();        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -