Java Android HTTP实现总结

安卓连接数据库实现登陆注册(一) 前言 有一段时间没有更新博客了,以前小编都是发布有关spring boot的博客,今天换换口味,为大家带来安卓的Demo。 前期准备 1:下载安装并配置Andriod studio 2:准备好mysql-connector-java-5.1.47.jar,这个驱动包网上都能下载 3:创建一个空的Activity 4:修改权限(很重要) 如图 主体 1.导入mysql-connector-java... 阅读详情

Java Android HTTP实现总结

 转自:http://www.cnblogs.com/mengdd/p/3607293.html

  Http(Hypertext Transfer Protocol)超文本传输协议,是一个基于请求/响应模式的无状态的协议,Http1.1版给出了持续连接的机制,客户端建立连接之后,可以发送多次请求,当不会再发送时再关闭连接。

  Android使用Java,对于Http协议的基本功能有两种实现方案:

  1.使用JDK的java.net包下的HttpURLConnection.

  2.使用Apache的HttpClient。

  关于二者的比较可以看一下:

  http://www.cnblogs.com/devinzhang/archive/2012/01/17/2325092.html

 

  Android SDK中集成了Apache的HttpClient模块,也即说Android上两种方法都能用。

  之前看一个Android开发者博客(原文链接先空缺,需要FQ)对此的讨论,大意总结如下:

  1.HttpClient的功能比较全,更加强大;而HttpURLConnection的功能较简单和原始,但是性能更好。

  2.在Android 2.x的版本中使用HttpURLConnection有bug,但是后来高级版本的Android已经将带来的bug修复,并且做了一些进一步优化的工作,所以建议在高级版本的Android系统(Android 2.3之后)使用HttpURLConnection,低版本的系统仍使用HttpClient。

 

程序实现

  下面来讨论一下实现,首先,需要确认Manifest中有权限:

    <uses-permission android:name="android.permission.INTERNET" />

 

使用JDK的HttpURLConnection类

  HttpURLConnection参考:

  http://developer.android.com/reference/java/net/HttpURLConnection.html

  使用这个类的一般步骤:

  1.通过URL.openConnection() 方法获取一个HttpURLConnection对象,并且将结果强制转化为HttpURLConnection类型。

  2.准备请求(prepare the request),包括URI,headers中的各种属性等

  (Request headers may also include metadata such as credentials, preferred content types, and session cookies.)

  3.请求体(optionally)。如果有请求体那么setDoOutput(true)必须为true,然后把输入放在getOutputStream()流中。

  4.读取响应。响应的headers一般包括了一些metadata比如响应体的内容类型和长度,修改日期以及session cookies。响应体可以从 getInputStream()流中读出。

  5.断开连接。响应体被读出之后,应该调用 disconnect()方法来断开连接。

  例子代码:

复制代码
package com.example.helloandroidhttp;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;

import android.util.Log;

public class HttpUtilsJDK {
    private static final String LOG_TAG = "Http->JDK";
    private static final int CONNECT_TIME_OUT = 3000;
    private static final String HEADER_CONTENT_TYPE = "Content-Type";
    private static final String HEADER_CONTENT_LENGTH = "Content-Length";
    /**
     * Default encoding for POST or PUT parameters. See
     * {@link #getParamsEncoding()}.
     */
    private static final String DEFAULT_PARAMS_ENCODING = "UTF-8";

    public static String getParamsEncoding() {
        return DEFAULT_PARAMS_ENCODING;
    }

    public static String getBodyContentType() {
        return "application/x-www-form-urlencoded; charset="
                + getParamsEncoding();
    }

    public static String performGetRequest(String baseUrl) {
        String result = null;
        HttpURLConnection connection = null;
        try {
            URL url = new URL(baseUrl);
            if (null != url) {

                // 获取HttpURLConnection类型的对象
                connection = (HttpURLConnection) url.openConnection();
                // 设置连接的最大等待时间
                connection.setConnectTimeout(CONNECT_TIME_OUT);

                // Sets the maximum time to wait for an input stream read to
                // complete before giving up.
                connection.setReadTimeout(3000);
                // 设置为GET方法
                connection.setRequestMethod("GET");
                connection.setDoInput(true);

                if (200 == connection.getResponseCode()) {
                    InputStream inputStream = connection.getInputStream();

                    result = getResultString(inputStream, getParamsEncoding());
                }
                else {
                    Log.e(LOG_TAG,
                            "Connection failed: "
                                    + connection.getResponseCode());
                }

            }
        }
        catch (MalformedURLException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            connection.disconnect();
        }

        return result;
    }

    public static String performPostRequest(String baseUrl,
            Map<String, String> params) {
        String result = null;
        HttpURLConnection connection = null;
        try {
            URL url = new URL(baseUrl);
            if (null != url) {
                // 获取HttpURLConnection类型的对象
                connection = (HttpURLConnection) url.openConnection();
                // 设置响应超时限制
                connection.setConnectTimeout(CONNECT_TIME_OUT);
                // 设置为POST方法
                connection.setRequestMethod("POST");
                connection.setDoInput(true);
                // 有请求体则setDoOutput(true)必须设定
                connection.setDoOutput(true);

                // 为了性能考虑,如果包含请求体,那么最好调用 setFixedLengthStreamingMode(int)或者
                // setChunkedStreamingMode(int)
                // connection.setChunkedStreamingMode(0);// 参数为0时使用默认值

                byte[] data = getParamsData(params);

                connection.setRequestProperty(HEADER_CONTENT_TYPE,
                        getBodyContentType());
                if (null != data) {
                    connection.setFixedLengthStreamingMode(data.length);
                    connection.setRequestProperty(HEADER_CONTENT_LENGTH,
                            String.valueOf(data.length));
                    OutputStream outputStream = connection.getOutputStream();
                    outputStream.write(data);
                }

                // 得到返回值
                int responseCode = connection.getResponseCode();
                if (200 == responseCode) {
                    result = getResultString(connection.getInputStream(),
                            getParamsEncoding());

                }
                else {
                    Log.e(LOG_TAG,
                            "Connection failed: "
                                    + connection.getResponseCode());
                }

            }
        }
        catch (MalformedURLException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            connection.disconnect();
        }

        return result;
    }

    private static byte[] getParamsData(Map<String, String> params) {
        byte[] data = null;

        try {
            if (null != params && !params.isEmpty()) {
                StringBuffer buffer = new StringBuffer();

                for (Map.Entry<String, String> entry : params.entrySet()) {

                    buffer.append(entry.getKey())
                            .append("=")
                            .append(URLEncoder.encode(entry.getValue(),
                                    getParamsEncoding())).append("&");// 请求的参数之间使用&分割。

                }
                // 最后一个&要去掉
                buffer.deleteCharAt(buffer.length() - 1);

                data = buffer.toString().getBytes(getParamsEncoding());
            }
        }
        catch (UnsupportedEncodingException e) {
            e.printStackTrace();

        }

        return data;
    }

    private static String getResultString(InputStream inputStream, String encode) {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        byte[] data = new byte[1024];
        int len = 0;
        String result = "";
        if (inputStream != null) {
            try {
                while ((len = inputStream.read(data)) != -1) {
                    outputStream.write(data, 0, len);
                }
                result = new String(outputStream.toByteArray(), encode);

            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
}
复制代码

 

使用Apache的HttpClient

  可以查看官方的Tutorial:

  http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html

  Android有一个实现类AndroidHttpClient,实现了HttpClient:

  http://developer.android.com/reference/android/net/http/AndroidHttpClient.html

  包装了一些默认的设置。

 

关于HTTP entity

  HTTP消息中可以包含内容实体(content entity),可以看做消息的报文,包含在请求或者响应中。

  HTTP规范规定两种请求方法可以包含内容实体:POST和PUT。

  响应则通常是包含内容实体的。

 

  HttpClient会根据内容来源区分三种实体:

  1.streamed:内容来源是流,这类里包含了从HTTP响应中获得的实体,流式实体不可重复。

  2.self-contained:内容是从内存或者其他方式获得的,即和连接无关,这类实体是可以重复的,多数是用来放在HTTP请求中的实体。

  3.wrapping:这类实体是从其他实体获得的。

  对于用HttpClient创建的请求实体来说,streamed和self-contained类型的区别其实不太重要,建议把不可重复的实体看作是streamed的,可重复的看作是self-contained的。

 

创造实体内容

  为了发送HTTP的POST请求(当然还有PUT请求也有实体),需要把一些参数放在实体中,创造实体内容,有四个类型的类可选用:

  StringEntity, ByteArrayEntity, InputStreamEntity, FileEntity

  注意其中的InputStreamEntity是不可重复的。

 

  UrlEncodedFormEntity这个类是用来把输入数据编码成合适的内容,比如下面这段:

复制代码
List<NameValuePair> formparams = new ArrayList<NameValuePair>();
formparams.add(new BasicNameValuePair("param1", "value1"));
formparams.add(new BasicNameValuePair("param2", "value2"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, Consts.UTF_8);
HttpPost httppost = new HttpPost("http://localhost/handler.do");
httppost.setEntity(entity);
复制代码

 

  两个键值对,被UrlEncodedFormEntity实例编码后变为如下内容:

param1=value1&param2=value2

  

  使用Apache的HttpClient发送HTTP请求的辅助类,例子代码:

复制代码
package com.example.helloandroidhttp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

import android.util.Log;

public class HttpUtilsApache {

    private static final String LOG_TAG = "Http->Apache";
    private static final String HEADER_CONTENT_TYPE = "Content-Type";
    /**
     * Default encoding for POST or PUT parameters. See
     * {@link #getParamsEncoding()}.
     */
    private static final String DEFAULT_PARAMS_ENCODING = "UTF-8";

    /**
     * Returns which encoding should be used when converting POST or PUT
     * parameters returned by {@link #getParams()} into a raw POST or PUT body.
     *
     * <p>
     * This controls both encodings:
     * <ol>
     * <li>The string encoding used when converting parameter names and values
     * into bytes prior to URL encoding them.</li>
     * <li>The string encoding used when converting the URL encoded parameters
     * into a raw byte array.</li>
     * </ol>
     */
    public static String getParamsEncoding() {
        return DEFAULT_PARAMS_ENCODING;
    }

    public static String getBodyContentType() {
        return "application/x-www-form-urlencoded; charset="
                + getParamsEncoding();
    }

    public static String performGetRequest(String url) {

        String result = null;
        // 生成一个请求对象
        HttpGet httpGet = new HttpGet(url);

        // 1.生成一个Http客户端对象(带参数的)
        HttpParams httpParameters = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(httpParameters, 10 * 1000);// 设置请求超时10秒
        HttpConnectionParams.setSoTimeout(httpParameters, 10 * 1000); // 设置等待数据超时10秒
        HttpConnectionParams.setSocketBufferSize(httpParameters, 8192);

        HttpClient httpClient = new DefaultHttpClient(httpParameters); // 此时构造DefaultHttpClient时将参数传入
        // 2.默认实现:
        // HttpClient httpClient = new DefaultHttpClient();
        httpGet.addHeader(HEADER_CONTENT_TYPE, getBodyContentType());

        // 下面使用Http客户端发送请求,并获取响应内容

        HttpResponse httpResponse = null;

        try {
            // 发送请求并获得响应对象
            httpResponse = httpClient.execute(httpGet);

            final int statusCode = httpResponse.getStatusLine().getStatusCode();
            if (200 == statusCode) {
                result = getResponseString(httpResponse);
            }
            else {
                Log.e(LOG_TAG, "Connection failed: " + statusCode);
            }

        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {

        }

        return result;
    }

    public static String performPostRequest(String baseURL, String postData) {
        String result = "";
        HttpResponse response = null;
        try {

            // URL使用基本URL即可,其中不需要加参数
            HttpPost httpPost = new HttpPost(baseURL);
            // 设置ContentType
            httpPost.addHeader(HEADER_CONTENT_TYPE, getBodyContentType());

            // 将请求体内容加入请求中
            HttpEntity requestHttpEntity = prepareHttpEntity(postData);

            if (null != requestHttpEntity) {
                httpPost.setEntity(requestHttpEntity);
            }

            // 需要客户端对象来发送请求
            HttpClient httpClient = new DefaultHttpClient();
            // 发送请求
            response = httpClient.execute(httpPost);

            final int statusCode = response.getStatusLine().getStatusCode();
            if (200 == statusCode) {
                // 显示响应
                result = getResponseString(response);
            }
            else {
                Log.e(LOG_TAG, "Connection failed: " + statusCode);
            }

        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {

        }

        return result;

    }

    /**
     * 直接利用String生成HttpEntity,String应该已经是key=value&key2=value2的形式
     *
     * @param postData
     * @return
     */
    private static HttpEntity prepareHttpEntity(String postData) {

        HttpEntity requestHttpEntity = null;

        try {

            if (null != postData) {
                // 去掉所有的换行
                postData = postData.replace("\n", "");
                // one way
                // requestHttpEntity = new ByteArrayEntity(
                // postData.getBytes(getParamsEncoding()));

                // another way
                requestHttpEntity = new StringEntity(postData,
                        getParamsEncoding());
                ((StringEntity) requestHttpEntity)
                        .setContentEncoding(getParamsEncoding());
                ((StringEntity) requestHttpEntity)
                        .setContentType(getBodyContentType());

            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return requestHttpEntity;
    }

    /**
     * 利用Map结构的参数生成HttpEntity,使用UrlEncodedFormEntity对参数对进行编码
     *
     * @param params
     * @return
     */
    private static HttpEntity prepareHttpEntity1(Map<String, String> params) {
        // 需要将String里面的key value拆分出来

        HttpEntity requestHttpEntity = null;
        try {

            if (null != params) {
                List<NameValuePair> pairList = new ArrayList<NameValuePair>(
                        params.size());
                for (Map.Entry<String, String> entry : params.entrySet()) {
                    NameValuePair pair = new BasicNameValuePair(entry.getKey(),
                            entry.getValue());
                    pairList.add(pair);
                }
                requestHttpEntity = new UrlEncodedFormEntity(pairList,
                        getParamsEncoding());

            }

        }
        catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return requestHttpEntity;
    }

    /**
     * 利用Map结构的参数生成HttpEntity,使用自己的方法对参数进行编码合成字符串
     *
     * @param params
     * @return
     */
    private static HttpEntity prepareHttpEntity2(Map<String, String> params) {
        // 需要将String里面的key value拆分出来

        HttpEntity requestHttpEntity = null;
        byte[] body = encodeParameters(params, getParamsEncoding());
        requestHttpEntity = new ByteArrayEntity(body);

        return requestHttpEntity;
    }

    /**
     * Converts <code>params</code> into an application/x-www-form-urlencoded
     * encoded string.
     */
    private static byte[] encodeParameters(Map<String, String> params,
            String paramsEncoding) {
        StringBuilder encodedParams = new StringBuilder();
        try {
            for (Map.Entry<String, String> entry : params.entrySet()) {
                encodedParams.append(URLEncoder.encode(entry.getKey(),
                        paramsEncoding));
                encodedParams.append('=');
                encodedParams.append(URLEncoder.encode(entry.getValue(),
                        paramsEncoding));
                encodedParams.append('&');
            }
            return encodedParams.toString().getBytes(paramsEncoding);
        }
        catch (UnsupportedEncodingException uee) {
            throw new RuntimeException("Encoding not supported: "
                    + paramsEncoding, uee);
        }
    }

    public static String getResponseString(HttpResponse response) {
        String result = null;
        if (null == response) {
            return result;
        }

        HttpEntity httpEntity = response.getEntity();
        InputStream inputStream = null;
        try {
            inputStream = httpEntity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    inputStream));
            result = "";
            String line = "";
            while (null != (line = reader.readLine())) {
                result += line;
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            try {
                if (null != inputStream) {
                    inputStream.close();
                }
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;

    }
}
复制代码

 

参考资料

  本博客HTTP标签下相关文章,比如这个:

  http://www.cnblogs.com/mengdd/p/3144599.html

  Apache HttpClient:

  http://hc.apache.org/httpcomponents-client-ga/

  http://hc.apache.org/httpcomponents-client-ga/tutorial/html/fundamentals.html#d5e49

 

  Android之网络编程 系列博文:

  http://www.cnblogs.com/devinzhang/category/349642.html

 

  Http Header详解:

  http://kb.cnblogs.com/page/92320/

  Android--Apache HttpClient:

  http://www.cnblogs.com/plokmju/p/Android_apacheHttpClient.html

 

推荐项目

  Android网络通信框架Volley:

  https://github.com/mengdd/android-volley

  Android Asynchronous Http Client:A Callback-Based Http Client Library for Android

  https://github.com/mengdd/android-async-http

  也即:http://loopj.com/android-async-http/

  本文项目地址(目前还是个挺简陋的Demo,有待完善):

  https://github.com/mengdd/HelloAndroidHttpUtils

 

Java / Android 多线程Http下载的实现与优化 在多线程下载中,分块处理技术是提高下载效率的关键。其核心目的是将大文件拆分成多个小块,每个下载线程负责下载文件的一个或多个小块,从而充分利用网络带宽,减少单一线程的阻塞和网络延迟带来的影响。分块处理的重要性体现在以下几个方面:并行下载:分块可以让多个线程同时工作,每个线程下载文件的一部分,显著提升下载速度。错误恢复:下载过程中某个块失败,只需重新下载该块,而不必从头开始。网络适应性:能够动态调整分块大小以适应不同的网络条件,保证下载效率。 阅读详情

相关推荐

信贷审批中的那些坑:从零开始搭建风控策略体系的5个关键步骤

本文深入探讨了信贷审批中的风控策略体系搭建,从数据陷阱识别、规则冲突诊断到反欺诈攻防,提供了5个关键步骤的实战指南。重点解析了如何通过特征工程、决策树优化和模型可解释性技术,构建动态平衡的风控体系,有效降低逾期风险并提升审批效率。

weixin_29253711的博客 412

Java发送HTTP GET/POST请求

四种发送Http的GET/POST的例子

wynn的博客 6766

高德地图开放平台Web服务API调用全解析:从申请Key到获取POI数据的完整流程

本文详细解析高德地图开放平台Web服务API的合规使用流程,从开发者账号注册、Key类型选择到POI数据采集方案构建。重点介绍文本搜索接口的三种查询模式及高级筛选技巧,提供配额管理与性能优化方案,并分享商业应用场景实战经验,帮助开发者合法高效获取POI数据。

weixin_26950847的博客 1349

How to call http request in android (安卓网络请求写法)

Normally, there are many approaches to call http request in Andriod. Here I only explain following methods to call http request: Hopefully, it helps android developer in my opition, it should be uti...

pengnf 657

纯JS实现SM3加密算法(兼容IE浏览器)

纯JS实现SM3加密,IE、谷歌、火狐等浏览器可以直接使用。

qianpou的博客 7353

从“跳变”到“连续”:深入理解霍尔传感器插值与PLL角度估算的优劣与选择

本文深入解析霍尔传感器角度估算技术,对比线性插值法和锁相环(PLL)跟踪法的优劣,为电机控制领域的工程师提供实用指南。通过STM32F407和CubeMX的实例,详细探讨两种方法的实现细节、性能对比及优化策略,帮助在不同应用场景下做出最优选择。

weixin_30855761的博客 557

Android 之 Http 请求头与响应头的学习

好了,看了那么多概念的东西,不动动手怎么行呢?这里贴下上一节给出的图,根据下面给出的表,大家自己感受下相关请求头的作用吧: PS:第一行是请求行:请求方式 + 资源名称 + HTTP协议版本号,另外请求头只是给服务端的一个 信息而已或者说一个简单,至于怎么处理,还是由服务端来决定的!上节中我们对Android涉及的网络编程进行了了解,也学习了下Http的基本概念,而本节我们 要学习的是Http的请求头与响应头,当然,可以把也可以把这节看作文档,用到的时候来查查 即可!//告诉浏览器响应码,以及重定向页面。

leyang0910的博客 1005

2022年全国职业院校技能大赛 高职组大数据技术与应用卷⑦——解析答案

大数据时代,电商经营模式发生很大改变。在传统运营模式中,缺乏数据积累,人们在做出一些决策行为过程中,更多是凭借个人经验和直觉,发展路径比较自我封闭。而大数据时代,为人们提供一种全新的思路,通过大量的数据分析得出的结果将更加现实和准确。商家可以对客户的消费行为信息数据进行收集和整理,比如消费者购买产品的花费、选择产品的渠道、偏好产品的类型、产品回购周期、购买产品的目的、消费者家庭背景、工作和生活环境、个人消费观和价值观等。通过数据追踪,知道顾客从哪儿来,是看了某网站投放的广告还是通过朋友推荐链接,是新访客还是

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 471

android通过发送http请求与java后端进行响应

背景:最近有同学需要服务端和安卓进行交流的需求,我在大二的时侯也在想java和安卓端是如何交接的,但因为当时水平有限,所以没能解决,也是一直把这件事情埋在心中,如今也在网上找到了一种方法,这种方法是用http请求进行交流,但是原来的博主一些细节没有交代清楚,我也踩了一些坑。不过原博主的代码还是挺好的,有需求的朋友可在原代码上进行拓展,如连接数据库、将数据显示到网页上。解决了安卓和java服务端的交...

lxh123456789asd的博客 4944

多传感器标定:如何统一摄像头、雷达与IMU坐标?

多传感器标定:如何统一摄像头、雷达与IMU坐标?​ ,人工智能,计算机视觉,大模型,AI,本文详细阐述多传感器标定中统一摄像头、雷达与 IMU 坐标的方法。先介绍传感器坐标系统、坐标统一必要性及变换数学基础,再分述摄像头与雷达、IMU 与摄像头、IMU 与雷达的标定原理、步骤、参数计算及结果验证,还讲解了多传感器坐标统一的整体流程,分析了标定常见问题及解决办法,介绍了常用标定工具,结合实际案例说明应用,探讨了标定精度的影响因素、提升方法及发展趋势,为相关领域提供了全面的多传感器标定指导。​

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 12万+

OpenClaw实战一|企业微信AI客服数字员工:自动应答+工单创建+数据统计,零代码3天落地

OpenClaw做企业微信AI客服数字员工,真正的价值不是“能自动回复”,而是把“咨询-应答-工单-统计-复盘”全流程闭环。对中小企业来说,不用招专职AI开发、不用买昂贵客服系统,一台服务器、零代码配置,就能拥有媲美大厂的智能客服能力。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 515

android java server_Java/Android 实现简单的HTTP服务器

目前在对Android的代码进行功能测试的时候,需要服务器返回一个数据来测试整个流程是否正确。不希望引入第三方的JAR包,因此需要一个特别简单的HTTP服务器。网上查询了一下,找到可用的代码如下:import java.io.BufferedOutputStream;import java.io.BufferedReader;import java.io.File;import java.io.F...

weixin_36339710的博客 435

Spring AI Alibaba实战训练营-14基于A2A协议智能体应用开发指南

本文介绍了基于A2A协议的智能体应用开发流程,主要包括客户端和服务端两个模块的实现。关键技术包括A2A通信协议、Nacos服务发现、Spring AI Alibaba框架和DashScope通义千问API。开发步骤涵盖环境准备(JDK17、Maven、Nacos)、项目创建、依赖配置(重点引入spring-ai-alibaba相关组件)以及Nacos和DashScope的核心配置。整个系统架构采用客户端通过Nacos发现服务端Agent,再调用阿里云AI服务的模式,实现了AI能力的解耦与复用。

program哲学 505

Java / Android 基于Http的多线程下载的实现

Java / Android 基于Http的多线程下载的实现 分类: 【Java 并发专题】 【Android 基础】2014-05-26 00:07 6422人阅读 评论(22) 收藏 举报 多线程下载httpRandomAccessFilehttp Range 转载请标明出处:http://blog.youkuaiyun.com/lmj623565791/article/de

翟浩浩Android专栏 461

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

开源 java android app 开发(七)通讯之Tcp和Http

本文记录了作者从嵌入式软件开发转向Android应用开发的经历,重点介绍了使用Java进行Android开发的学习过程。文章详细描述了开发环境的搭建、工程文件结构、GUI界面布局、文件和数据库存储、多媒体使用等关键步骤,并特别强调了网络通讯协议(如TCP和HTTP)在Android应用中的实际应用。作者通过代码示例展示了如何实现TCP客户端与服务器的通信以及HTTP请求的处理,包括权限配置、界面设计和代码实现。此外,文章还探讨了Android网络安全配置的相关问题,并提供了解决方案。通过这些内容,作者希望记

ajassi2000的博客 1307

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

(Java/Android/HTTP) 实现断点续传

(Java/Android/HTTP) 实现断点续传

ShuiMoYiYa的博客 380

android http 通信(java原生类库实现)

get方式 private void doGet(){   URL httpurl = new URl(url);   HttpURLConnection conn = (HttpURLConnection)httpUrl.openConnection();   conn.setRequestMethod("GET");   conn.setReadTimeout(...

88

java模拟安卓get请求,Java模拟HTTP Get Post请求实现论坛自动回帖功能

最近想自动发帖回帖,拿某论坛试验了一下,发现可行,不过后续没有再使用,以免影响论坛正常运行。1、帖子链接的格式为http://bbs.***.***.**/forum.php?mod=viewthread&tid=774210最后面774210数字变化, 就可以得到不同的帖子2、防止帖子发表会又被删了的情况, 进行判断帖子是否存在3、递增后面的 id 数字, 对每个链接做回帖的 POoqY...

weixin_39622283的博客 300
上一篇: Android WebView 因重定向无法正常goBack()解决方案
下一篇: permission is only granted to system apps
hi_Xing
博客等级 码龄12年 2粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值