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

Android 网络应用——基于TCP协议的Socket通信简要介绍 中能接收其他通信实体连接请求的是对象用于监听来自客户端的连接,如果没有连接,它将一直处于等待状态。包含一个监听来自客户端请求的方法。为了创建对象,:用指定的端口来创建一个。该端口应该有一个有效的端口整数值。:增加一个用来改变连接队列长度的参数。:在机器存在多个IP地址的情况下,通过这个参数来指定将绑定到指定的地址。在使用完毕后,应使用的()方法来关闭该。 阅读详情

文章的目的为了记录使用java 进行android app 开发学习的经历。本职为嵌入式软件开发,公司安排开发app,临时学习,完成app的开发。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。

    相关链接:

开源 java android app 开发(一)开发环境的搭建-优快云博客

开源 java android app 开发(二)工程文件结构-优快云博客

开源 java android app 开发(三)GUI界面布局和常用组件-优快云博客

开源 java android app 开发(四)GUI界面重要组件-优快云博客

开源 java android app 开发(五)文件和数据库存储-优快云博客

开源 java android app 开发(六)多媒体使用-优快云博客

开源 java android app 开发(七)通讯之Tcp和Http-优快云博客

开源 java android app 开发(八)通讯之Mqtt和Ble-优快云博客

开源 java android app 开发(九)后台之线程和服务-优快云博客

开源 java android app 开发(十)广播机制-优快云博客

开源 java android app 开发(十一)调试、发布-优快云博客

开源 java android app 开发(十二)封库.aar-优快云博客

开源 java android app 开发(十三)自定义绘图控件--游戏摇杆

开源 java android app 开发(十四)自定义绘图控件--波形图

开源 java android app 开发(十五)自定义绘图控件--仪表盘

开源 java android app 开发(十六)自定义绘图控件--圆环

推荐链接:

开源C# .net mvc 开发(一)WEB搭建_c#部署web程序-优快云博客

开源 C# .net mvc 开发(二)网站快速搭建_c#网站开发-优快云博客

开源 C# .net mvc 开发(三)WEB内外网访问(VS发布、IIS配置网站、花生壳外网穿刺访问)_c# mvc 域名下不可訪問內網,內網下可以訪問域名-优快云博客

开源 C# .net mvc 开发(四)工程结构、页面提交以及显示_c#工程结构-优快云博客

开源 C# .net mvc 开发(五)常用代码快速开发_c# mvc开发-优快云博客

本章节主要内容是安卓通讯协议的使用,应用多数和网络相关,只要下载数据或上传数据,就需要用到网络通讯。通讯的内容较多,这章主要是Tcp和Http。

本章内容如下:

1.Tcp协议通讯

2.Http协议通讯

一、Tcp协议通讯

代码实现了Tcp客户端对,Tcp服务器端的访问(网络调试助手)。可以配置访问的服务器端的IP和端口号,成功连接后,可以发送数据到服务器。

1.1 添加网络权限:在 AndroidManifest.xml 中添加网络权限

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

1.2 界面 activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/ipEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter IP address" />

    <EditText
        android:id="@+id/portEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter port number"
        android:inputType="number" />

    <Button
        android:id="@+id/connectButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Connect" />

    <EditText
        android:id="@+id/messageEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter message" />

    <Button
        android:id="@+id/sendButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Send" />

    <TextView
        android:id="@+id/responseTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Server response will appear here"
        android:paddingTop="16dp" />
</LinearLayout>

1.3 代码MainActivity.java

package com.example.socketclient;

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class MainActivity extends AppCompatActivity {

    private EditText ipEditText, portEditText, messageEditText;
    private Button connectButton, sendButton;
    private TextView responseTextView;

    private Socket socket;
    private PrintWriter out;
    private BufferedReader in;
    private Handler handler = new Handler(Looper.getMainLooper());

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ipEditText = findViewById(R.id.ipEditText);
        portEditText = findViewById(R.id.portEditText);
        messageEditText = findViewById(R.id.messageEditText);
        connectButton = findViewById(R.id.connectButton);
        sendButton = findViewById(R.id.sendButton);
        responseTextView = findViewById(R.id.responseTextView);

        connectButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                connectToServer();
            }
        });

        sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendMessage();
            }
        });
    }

    private void connectToServer() {
        final String ip = ipEditText.getText().toString();
        final int port = Integer.parseInt(portEditText.getText().toString());

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    socket = new Socket(ip, port);
                    out = new PrintWriter(socket.getOutputStream(), true);
                    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            responseTextView.setText("Connected to server");
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            responseTextView.setText("Connection failed: " + e.getMessage());
                        }
                    });
                }
            }
        }).start();
    }

    private void sendMessage() {
        final String message = messageEditText.getText().toString();

        new Thread(new Runnable() {
            @Override
            public void run() {
                if (out != null) {
                    out.println(message);

                    try {
                        final String response = in.readLine();
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                responseTextView.setText("Server response: " + response);
                            }
                        });
                    } catch (IOException e) {
                        e.printStackTrace();
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                responseTextView.setText("Error receiving response: " + e.getMessage());
                            }
                        });
                    }
                } else {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            responseTextView.setText("Not connected to server");
                        }
                    });
                }
            }
        }).start();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        try {
            if (socket != null) {
                socket.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

1.4 显示效果如下图

二、 Http访问,以下代码实现对网站的Http访问,访问中输入了用户名和密码。成功后保存cookie并跳转到指定网页。页面将打印在控制台中。

2.1 添加网络权限:在 AndroidManifest.xml 中添加网络权限。

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

2.2 使用 HTTP 客户端:Android 推荐使用 OkHttp 或 HttpURLConnection 来发送 HTTP 请求。在src文件夹的build.gradle文件中添加以下代码

dependencies {
    implementation 'com.squareup.okhttp3:okhttp:4.9.3'

}

2.3 界面 activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    android:gravity="center">


    <EditText
        android:id="@+id/test"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="用户名"
        android:inputType="text"/>

    <EditText
        android:id="@+id/etPassword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="密码"
        android:inputType="textPassword"
        android:layout_marginTop="8dp"/>

    <Button
        android:id="@+id/btnLogin"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="登录并保存Cookie"
        android:layout_marginTop="16dp"/>

    <Button
        android:id="@+id/btnAccessPage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="使用Cookie访问其他页面"
        android:layout_marginTop="8dp"/>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/tvResult"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dp"
                android:textSize="16sp" />
        </LinearLayout>
    </ScrollView>

</LinearLayout>

2.4 MainActivity.java

package com.example.myapplication;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpCookie;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    private EditText etUsername, etPassword;
    private Button btnLogin, btnAccessPage;
    private TextView tvResult;

    // 替换为你的实际登录URL和其他页面URL
    private static final String LOGIN_URL = "http://XXX/";
    private static final String OTHER_PAGE_URL = "http://XXX/Index";

    private SharedPreferences sharedPreferences;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        etUsername = findViewById(R.id.test);
        etPassword = findViewById(R.id.etPassword);
        btnLogin = findViewById(R.id.btnLogin);
        btnAccessPage = findViewById(R.id.btnAccessPage);
        tvResult = findViewById(R.id.tvResult);

        sharedPreferences = getSharedPreferences("MyAppPrefs", MODE_PRIVATE);

        btnLogin.setOnClickListener(v -> {
            String username = etUsername.getText().toString();
            String password = etPassword.getText().toString();

            if (username.isEmpty() || password.isEmpty()) {
                Toast.makeText(this, "请输入用户名和密码", Toast.LENGTH_SHORT).show();
                return;
            }

            new LoginTask().execute(username, password);
        });

        btnAccessPage.setOnClickListener(v -> {
            if (!sharedPreferences.contains("cookie")) {
                Toast.makeText(this, "请先登录获取Cookie", Toast.LENGTH_SHORT).show();
                return;
            }

            new AccessPageTask().execute();
        });
    }

    private class LoginTask extends AsyncTask<String, Void, String> {
        private String cookie;

        @Override
        protected String doInBackground(String... params) {
            String username = params[0];
            String password = params[1];

            try {
                URL url = new URL(LOGIN_URL);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("POST");
                connection.setDoOutput(true);

                // 构建POST数据 (根据实际网站修改)
                String postData = "inputEmail3=" + username + "&inputPassword3=" + password;
                connection.getOutputStream().write(postData.getBytes());

                // 获取Cookie
                Map<String, List<String>> headerFields = connection.getHeaderFields();
                List<String> cookiesHeader = headerFields.get("Set-Cookie");

                if (cookiesHeader != null) {
                    for (String cookie : cookiesHeader) {
                        // 简单的Cookie处理,实际情况可能需要更复杂的解析
                        this.cookie = cookie.split(";")[0];
                        break;
                    }
                }

                // 读取响应
                InputStream inputStream = connection.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                StringBuilder response = new StringBuilder();
                String line;

                while ((line = reader.readLine()) != null) {
                    response.append(line);
                }

                return response.toString();
            } catch (IOException e) {
                e.printStackTrace();
                return "登录失败: " + e.getMessage();
            }
        }

        @Override
        protected void onPostExecute(String result) {
            if (cookie != null && !cookie.isEmpty()) {
                // 保存Cookie到SharedPreferences
                SharedPreferences.Editor editor = sharedPreferences.edit();
                editor.putString("cookie", cookie);
                editor.apply();

                tvResult.setText("登录成功! Cookie已保存\n响应: " + result);
            } else {
                tvResult.setText("登录失败,未获取到Cookie\n响应: " + result);
            }
        }
    }

    private class AccessPageTask extends AsyncTask<Void, Void, String> {
        @Override
        protected String doInBackground(Void... voids) {
            String savedCookie = sharedPreferences.getString("cookie", "");

            try {
                URL url = new URL(OTHER_PAGE_URL);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");

                // 设置保存的Cookie
                connection.setRequestProperty("Cookie", savedCookie);

                // 读取响应
                InputStream inputStream = connection.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                StringBuilder response = new StringBuilder();
                String line;

                while ((line = reader.readLine()) != null) {
                    response.append(line);
                }

                return response.toString();
            } catch (IOException e) {
                e.printStackTrace();
                return "访问页面失败: " + e.getMessage();
            }
        }

        @Override
        protected void onPostExecute(String result) {
            tvResult.setText("使用Cookie访问页面结果:\n" + result);
        }
    }
}

2.5 调试时报错MainActivity: 登录请求失败: CLEARTEXT communication to XXX.com not permitted by network security policy

在Android开发中,如果你遇到“CLEARTEXT communication to [host] not permitted by network security policy”错误,这意味着你的应用尝试使用HTTP(而不是HTTPS)与服务器通信,而Android的网络安全性配置默认不允许明文(HTTP)通信。

如果你暂时无法使用HTTPS,可以通过修改应用的网络安全配置来允许明文通信。不过,这种方法不推荐用于生产环境,因为它会降低应用的安全性。

在res/xml目录下创建一个network_security_config.xml文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">40977f53b4.qicp.vip</domain>
    </domain-config>
</network-security-config>

然后在AndroidManifest.xml文件中引用这个配置文件:

<application
    android:networkSecurityConfig="@xml/network_security_config"
    ... >
    ...
</application>

2.6 调试结果,登录成功并跳转。控制台打印2个页面,第1个是登录页面,第2个是目标页面。

开源一个自用的Android IM库,基于Netty+TCP+Protobuf实现。 转载请注明出处:https://juejin.im/post/5c97ae12e51d45580b681b0b 写在前面 一直想写一篇关于im即时通讯分享的文章,无奈工作太忙,很难抽出时间。今天终于从公司离职了,打算好好休息几天再重新找工作,趁时间空闲,决定静下心来写一篇文章,毕竟从前辈那里学到了很多东西。工作了五年半,这三四年来一直在做社交相关的项目,有 直播、 即时通讯、 短视频分享、 社区论... 阅读详情

相关推荐

开源一个自用的Android IM库,基于Netty+TCP+Protobuf实现(1)

相信大多数从事Android开发的朋友们越来越发现,找工作越来越难了,面试的要求越来越高了除了基础扎实的java知识,数据结构算法,设计模式还要求会底层源码,NDK技术,性能调优,还有会些小程序和跨平台,比如说flutter,以思维脑图的方式展示在下图;《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!相信大多数从事Android开发的朋友们越来越发现,找工作越来越难了,面试的要求越来越高了。

2301_79098336的博客 1192

Java、Android 之 TCP / IP

关闭时需要四次挥手 A----->B,B--------------->A,B-------------------->A,A---------------------->B。建立连接需要三次握手,A--->B,B---->A,-A----->B。TCP需要建立连接才能通信,建立连接需要端口,Socket。客户端向服务端发送请求可能会走N条链路,这个过程叫路由。TCP、IP是一系列协议组成的网络分层模型。实现长链接的方式一般就是心跳。UDP协议通常只是发送数据。

qq_29769851的博客 690

安卓实现TCP通信demo含Java服务端客户端实现

比较完整的java TCP套件字通信实现demo,类的封装比较好,可以很方便接入到自己的项目中。

Android TCP 长连接实战:从协议原理到稳定通信架构

本文深入探讨Android TCP长连接实战,从协议原理到稳定通信架构的完整实现。通过对比TCP与HTTP的核心差异,详解三次握手与四次挥手机制,并提供完整的Android客户端实现代码。重点介绍心跳机制、断线重连策略、粘包拆包处理等稳定性保障方案,帮助开发者构建可靠的实时通信应用。

jupi8的博客 522

安卓集成华为HMS Scankit实现自定义扫码功能

实现扫码功能 使用的是集成华为扫描的SDK,UI界面借鉴的是谷歌官方的Zxing项目中的自定义view,两者结合实现。 先上效果图: 先在项目根级别(build.gradle)当中配置HMS Core SDK的Maven仓地址。 // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huawei.com/repo/'} // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huaw

qq_47625961的博客 5512

Android实现Tcp client端(java)

TCPClient .java package com.example.testtcp; import android.util.Log; import org.json.JSONArray; import org.json.JSONObject; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetSocketAddress; import j

amin_hui的博客 4875

手把手教你用Sentinel-1和SNAP处理InSAR数据:从下载到生成沉降图(附Python脚本)

本文详细介绍了如何使用Sentinel-1数据和SNAP软件处理InSAR数据,从下载到生成地表沉降图的全流程。通过Python脚本实现自动化处理,适用于城市扩张和地质脆弱带的地表沉降监测,提供高性价比的毫米级形变监测方案。

weixin_26800111的博客 267

Android网络功能开发(6)——TCP协议通信

TCP通信的双方需要建立连接,所以先由一方监听某个端口,等待其他设备来连接,这一方称为服务器端。另一方向服务器端发起连接请求,称为客户端。服务器端接受客户端的连接请求后,双方之间的连接建立起来。连接建立后,双方对于连接的使用是相同的,都可以通过连接发送和接收数据。本文通过一个简单的聊天室原型来演示如何编程实现TCP通信。客户端用Android实现,服务器端在JavaSE上实现。

nanoage的博客 3940

stata:stata软件教程(人大十八讲)(1) 第一章 stata入门

第一章 stata入门1.1 安装1.2 启用和退出1.3 打开和查看数据1.4 寻求帮助与网络资源1.5 命令示例1.6 几个环境设置1.7 复习与练习1.8 附录 注:教材为:Stata 统计分析教程 stata软件教程(人大十八讲) 中国人民大学出版社 陈传波 1.1 安装 1.2 启用和退出 1.3 打开和查看数据 1.4 寻求帮助与网络资源 1.5 命令示例 1.6 几个环境设置 1.7 复习与练习 1.8 附录 ...

qq_47805483的博客 1万+

thermal系列(5)-DTSI中配置Thermal

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.youkuaiyun.com/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录thermal系列目录DTSI中配置ThermalDTSI节点类型描述CPU0的配置举例CPU核hot-plugging举例修改热缓解阈值DTSI的node中带有tracks-lowDTSI中关闭某个Thermal Zones thermal系列目录 thermal系列(1)-引言部分 thermal.

fulinux的博客 1232

教你轻松开发一个Andriod版即时通讯

考虑到作为一个主打社交的产品,消息数据量会非常大,同时为了节约流量,所以采用protobuf是一个不错的选择。1)TCP:缺点就是慢,效率低,占用系统资源高,易被攻击,TCP在传递数据之前要先建立连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞机制等都会消耗大量时间,而且要在每台设备上维护所有的传输连接。2)UDP:优点体现在快,比TCP稍安全,UDP没有TCP拥有的各种机制,是一个无状态的传输协议,所以传递数据非常快,没有TCP的这些机制,被攻击利用的机制就少一些,但是也无法避免被攻击。

蔚可云的博客 2154

SAP FICO应付票据平台开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

SAP FICO应付票据平台开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

我好像病了的博客 379

自撸一个Android IM库,即时通讯很难吗?

/ 今日科技快讯 /5月29日,市场研究机构Gartner发布最新数据显示,2019年第一季度全球智能手机销量为3.73亿部,同比下降2.7%。华为继续保持其全球...

郭霖 7223

【CANdelaStudio编辑CDD】-1.2-给$10服务SessionControl创建一个新Session会话并修改Session state machine会话状态机(UDS诊断)

前一篇:【UDS诊断描述文件CDD】-1.1-ISO_14229中$10服务理论部分https://blog.youkuaiyun.com/qfmzhu/article/details/120375515案例背景: 在CDD中如何给$10服务创建一个新的Session会话; 在CDD中如何给$10服务修改Session state machine会话状态机。 目录 1 查看$10服务中已有的Session会话​ 2 查看$10服务中已有的Session state machine会话状态机 3 在$10...

「汽车电子助手」的博客 6075

车辆网络安全ISO/SAE 21434解读(一)概述

ISO/SAE 21434 《道路车辆 网络安全工程》是SAE和ISO共同制定的一项针对道路车辆的网络安全标准,它是一个面向汽车行业全供应链(OEM及各级供应商)的车辆网络安全管理指导文件

xiaoxiabang的博客 8425

android如何与服务器,安卓如何与服务器通信 Android服务器通信

Android服务器通信的几种方式详解大 学学习网络基础的时候老师讲过,网络由下往上分为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。通过初步的了解,小编知道IP协议对应于网 络层,TCP协议对应于传输层,而HTTP协议对应于应用层,三者从本质上来说没有可比性。Android客户端怎么与服务器数据库连接?不能与数据库连接的 Android客户端不能直接与服务器数据库连接。数据库是需要...

weixin_34849898的博客 1920

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

2024全新Android大厂面试真题解析(含网络、Java、Android、数据结构与算法、开源框架)

最近在准备面试,然后复习下之前写过的项目,书籍,笔记,文章。(2).给定一个矩阵 int matrixA[m][n],每行每列都是增序的,实现一个算法去寻找矩阵中的某个元素 element. 搜狗。(这就不一样了,第一个直接给了头结点,倒数第二个需要从倒数第一个开始查询,走两步) (腾讯)(4).已知前序遍历为{1,2,4,7,3,5,6,8},中序遍历为{4,7,2,1,5,3,8,6},它的二叉树是怎么样的?(6).HashMap中什么时候需要进行扩容,扩容resize()是如何实现的?

VIP129370的博客 351

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android开发者必须收藏的8个开源库,Android2024面试题

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。链接:https://pan.baidu.com/s/1BUbENbinlO0KpI5aQDA1JA?pwd=1234提取码:1234果低效漫长且无助**。

2401_85493350的博客 718

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

2021全新Android大厂面试真题解析(含网络、Java、Android

5.TCP和UDP的区别? 6.HTTP的几种请求方法具体介绍 7.HTTP请求和响应报文的格式,以及常用状态码 8.一个 TCP 连接上面能发多少个 HTTP 请求 第二章 Java面试题 1.HashMap 2.ArrayList 3.LinkedList 4.Hashset源码分析 5.内存模型 6.垃圾回收算法(JVM) 7.垃圾回收机制和调用 System.gc()的区别? 8.类加载过程 9.反射 10.多线程和线程池 11.创建多线程方式、线程池工作原理 12.设计模式(六大基本原则、项目

m0_64603776的博客 620

Android IM SDK,基于Netty+Okhttp设计思路实现的一款高可定制化的开源库

一、前言 相信现在很多App都会被要求有IM功能,社交成为了必不可少的一项功能,IM的价值和重要性也就不言自明,但从技术上,IM对没有经验的开发者来说还是存在很多坑点和难点的,而接入第三方又存在成本、受限于他人等问题,所以本文旨意在打造一个通用的可配置化的IM SDK,文笔有限,如有不妥之处还请批评指正,希望对你有用。转载请注明出处https://www.jianshu.com/p/5b01f4d...

smile__dream的博客 2784

Android 手机的高级终端 Termux 安装使用、busybox、安卓 手机 web

手机已经 root安装 tsu,这是一个 su 的 Termux 版本,是一个真正的 root 权限,用来在 Termux上替代su,操作不慎可能对手机有安全风险,因为官方封装了,所以安装也很简单:安装 tsu:pkg install tsu -y切换到 root:tsu退出 root:exittsu切换 root 用户时会弹出 root 授权提示,给予其 root 权限即可。在管理员身份下输入 exit 可回到普通用户身份。

freeking101的博客 10万+

Android网络开发实战:从HTTP到Socket的协议栈深度解析与应用优化

计算机网络是现代应用开发的基石,其核心在于TCP/IP协议栈的分层通信机制。从应用层的HTTP/HTTPS协议,到传输层的TCP/UDP可靠传输,再到网络层的IP路由寻址,每一层都承担着特定的职责,共同保障了数据的端到端可靠交付。理解这些底层原理,对于构建高性能、高可用的移动应用至关重要。在Android开发中,这直接关系到网络请求的稳定性、弱网环境下的用户体验以及复杂场景如长连接保活、自定义协议通信的实现。通过掌握OkHttp连接池复用、Socket编程中的粘包拆包处理、以及基于NetworkCallba

weixin_30357231的博客 330

2021全新Android大厂面试真题解析(含网络、Java、Android、数据结构与算法、开源框架)

前言 最近在准备面试,然后复习下之前写过的项目,书籍,笔记,文章。一看很多知识点都没有印象,最可拍的是连自己为了防止忘记写的文章竟然都感觉不是自己写的。有些开始怀疑人生了。 好了,废话少说,现在是求职高峰期,我把我收集到的资料分享给大家。也祝到家有个好工作。(本文资料 适合1-3年) 从基础到架构进阶,包含了BATJ等一线互联网公司面试被问到的题目,涵盖了初中高级安卓技术点。 文章中所列主要为大纲部分,详细内容可以在文末自行获取哈! 如果你熟练掌握本文中列出的知识点,相信将会大大增加你通过前两轮技术面试的几

zhireshini233的博客 306
上一篇: 开源 java android app 开发(六)多媒体使用
下一篇: 开源 java android app 开发(八)通讯之Mqtt和Ble
ajassi2000
博客等级 码龄22年 2033粉丝 191原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值