自定义ContentProvider案例

news2024/11/25 20:44:05

自定义ContentProvider案例

1.条件准备

  • app5往外暴漏数据
  • app7接收和操作远程数据

图1 app5目录结构

图2 app7目录结构

2.参考代码

完整代码:

https://download.csdn.net/download/weixin_41957626/87346497

1)app5的代码

(1)app5的entity,dao,以及布局文件和activity代码详见博客SQLite数据库-学生管理系统(2.0)_简单点了的博客-CSDN博客基于SQLite数据库实现的学生管理系统,符合MVC的设计模式https://blog.csdn.net/weixin_41957626/article/details/128432736?spm=1001.2014.3001.5502

(2)app5的provider代码如下

//内容提供者
public class StudnetProvider extends ContentProvider {
    //定义URI匹配规则
    UriMatcher uriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
    //定义Provider的Uri地址
    String authority =new String("com.lxz.app5");


    @Override
    public boolean onCreate() {
        //this.getContext()获取上下文
        MyHelper myHelper=new MyHelper(this.getContext(),"studentDB",1);
        /*往Uri中添加规则*/
        //查询所有的学生信息
        uriMatcher.addURI(authority,"studentAll",1);
        //根据学生编号进行模糊查询,#表示任意数字,*表示任意字符;
        uriMatcher.addURI(authority,"student/#",2);
        //根据学生编号进行精确查询
        uriMatcher.addURI(authority,"studentVague/*",3);
        //根据学生性别进行精确查询
        uriMatcher.addURI(authority,"studentSexVague",4);

        //插入一条学生信息
        uriMatcher.addURI(authority,"insertstudnet",1);
        //更新一条学生信息
        uriMatcher.addURI(authority,"updatestudent",1);
        //根据编号删除学生的信息
        uriMatcher.addURI(authority,"deletestudent",1);
        //删除表中的全部数据
        uriMatcher.addURI(authority,"deletestudent/all",2);
        //返回值true代表初始化成功,返回值是false代表的是初始化失败
        return true;
    }

    @Nullable
    @Override
    //查询
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
        MyHelper helper=new MyHelper(this.getContext(),"studentDB",1);
        SQLiteDatabase database=helper.getWritableDatabase();
        //遍历的结果
        Cursor cursor=null;
        System.out.println(uri);
        System.out.println(uriMatcher.match(uri));
        switch (uriMatcher.match(uri)){
            case 1:
                cursor=database.query("student",projection,null,null,null,null,null);
                break;
            case 2:
                long id= ContentUris.parseId(uri);
                cursor=database.query("student",projection,"id= ?",new String[]{""+id},null,null,s1);
                break;
            case 3:
                //根据ContentUris的parseId提取出来id的值
                //content://com.lxz.app5/student/1,就是将1提取出来
                long idx= ContentUris.parseId(uri);
                cursor=database.query("student",projection,"id like ?",new String[]{"%"+idx+"%"},null,null,null);
                break;
            case 4:
                //根据性别进行模糊查询
                cursor=database.query("student",projection,s,strings1,null,null,null);
                break;
            default:
                throw new RuntimeException("未知uri");

        }

        return cursor;
    }

    //返回的MIME数据类型
    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        return uri.getAuthority();
    }

    @Nullable
    @Override
    //插入数据
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
        MyHelper helper=new MyHelper(this.getContext(),"studentDB",1);
        SQLiteDatabase database=helper.getWritableDatabase();
        //遍历的结果
       long id=0;
        switch (uriMatcher.match(uri)){
            case 1:
                id =database.insert("student",null,contentValues);
                break;
            default:
                throw new RuntimeException("未知uri");
        }
        database.close();
        helper.close();
        //为了判断是不是插入成功了,id的值为插入后的主键的号
        uri=ContentUris.withAppendedId(uri,id);
        return uri;
    }

    @Override
    //删除数据
    public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
        MyHelper helper=new MyHelper(this.getContext(),"studentDB",1);
        SQLiteDatabase database=helper.getWritableDatabase();
        int id=0;
        switch (uriMatcher.match(uri)){
            case 1:
                id =database.delete("student",s,strings);
                break;
            case 2:
                id =database.delete("student",null,null);//删除表中的全部数据
            default:
                throw new RuntimeException("未知uri");
        }
        database.close();
        helper.close();
        return id;
    }

    @Override
    //更新数据
    public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
        MyHelper helper=new MyHelper(this.getContext(),"studentDB",1);
        SQLiteDatabase database=helper.getWritableDatabase();
         int id=0;
        switch (uriMatcher.match(uri)){
            case 1:
                id =database.update("student",contentValues,s,strings);
                break;
            default:
                throw new RuntimeException("未知uri");
        }
        database.close();
        helper.close();
        return id;
    }

}

(3)app5的AndroidManifest.xml文件代码

<!--注册provider-->
        <provider
            android:authorities="com.lxz.app5"
            android:name=".provider.StudnetProvider"
            android:exported="true"
            android:enabled="true"
            />

2)app7的代码

(1)app7下的实体类代码。

//学生实体
public class Student implements Serializable {
    //属性
    private Integer id;
    private String name;
    private Integer age;
    private Integer sex;

    //构造
    public Student(Integer id, String name, Integer age, Integer sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    //get & set
    public Student() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                '}';
    }
}

(2)app7下的布局文件代码。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="远程查询"
        android:textSize="30dp"
        android:textColor="@color/black"
        android:gravity="center"
        />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="studentAll"
        android:textColor="@color/black"
        android:textSize="30dp"
        android:onClick="getStudentAll"
        />
    <!--根据id精确查询-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <EditText
            android:id="@+id/textId"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:hint="ID精确查询"
            android:textSize="20dp"
            />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="getStudentById"
            android:textColor="@color/black"
            android:textSize="25dp"
            android:onClick="getStudentById"
            />
    </LinearLayout>
    <!--根据id模糊查询-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <EditText
            android:id="@+id/textIdVague"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:hint="ID模糊"
            android:textSize="20dp"
            />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="getStudentByIdVague"
            android:textColor="@color/black"
            android:textSize="25dp"
            android:onClick="getStudentByIdVague"
            />
    </LinearLayout>
    <!--根据sex模糊查询-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <EditText
            android:id="@+id/textAgeVague"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:hint="Age模糊"
            android:textSize="20dp"
            />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="getStudentByAgeVague"
            android:textColor="@color/black"
            android:textSize="24dp"
            android:onClick="getStudentBySexVague"
            />
    </LinearLayout>
    <!--根据sex模糊查询-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <EditText
            android:id="@+id/deletetextId"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:hint="ID删除"
            android:textSize="20dp"
            />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="deleteStudentById"
            android:textColor="@color/black"
            android:textSize="24dp"
            android:onClick="deleteStudentById"
            />
    </LinearLayout>

    <!--远程更新-->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="为了测试仅更新id=1的name属性"
        android:gravity="center"
        android:textSize="25dp"
        />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <EditText
            android:id="@+id/updatetextName"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:hint="name更新"
            android:textSize="20dp"
            />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="updateStudentByName"
            android:textColor="@color/black"
            android:textSize="24dp"
            android:onClick="updateStudentByName"
            />
    </LinearLayout>

    <!--远程插入-->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="为了测试仅设置name属性,其余默认"
        android:gravity="center"
        android:textSize="25dp"
        />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <EditText
            android:id="@+id/inserttextName"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:hint="插入信息"
            android:textSize="20dp"
            />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="insertStudent"
            android:textColor="@color/black"
            android:textSize="24dp"
            android:onClick="insertStudent"
            />
    </LinearLayout>

</LinearLayout>

(3)app7下的Activity。

//app7用于远程调用app5中的数据
public class MainActivity extends AppCompatActivity {

    ContentResolver reserve=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getObserver();
    }

    //方法:获取ContentResolver对象
    public void getObserver(){
        reserve=getContentResolver();

    }
    //方法:远程查询所有的数据信息
    public List<Student> remoteQueryAll(){
        Uri uri=Uri.parse("content://com.lxz.app5/studentAll");
        Cursor cursor=null;
        List<Student> list=new ArrayList<>();
        list.clear();
        cursor=reserve.query(uri,new String[]{"id","name","age","sex"},null,null,null);
        while (cursor.moveToNext()){
            int id=cursor.getInt(0);
            String name=cursor.getString(1);
            int age=cursor.getInt(2);
            int sex=cursor.getInt(3);
            list.add(new Student(id,name,age,sex));

        }
        cursor.close();
        System.out.println(uri.toString()+"---"+list.toString());
        return list;
    }

    //方法:远程查询指定id的数据信息
    public Student remoteQueryById(){
        EditText editText=findViewById(R.id.textId);
        Uri uri=Uri.parse("content://com.lxz.app5/student");
        uri=ContentUris.withAppendedId(uri,Integer.parseInt(editText.getText().toString()));//拼接出带id的uri地址
        Student student=null;
        Cursor cursor=reserve.query(uri,new String[]{"id","name","age","sex"},null,null,null);
        if (cursor.moveToNext()){
            int id=cursor.getInt(0);
            String name=cursor.getString(1);
            int age=cursor.getInt(2);
            int sex=cursor.getInt(3);
           student=new Student(id,name,age,sex);
        }
        cursor.close();
        System.out.println(uri.toString()+"---"+student.toString());
        return student;
    }

    //方法:远程模糊查询ID的数据信息
    public List<Student> remoteQueryByIdVague(){
        EditText editText=findViewById(R.id.textIdVague);
        Uri uri=Uri.parse("content://com.lxz.app5/studentVague");
        uri=ContentUris.withAppendedId(uri,Integer.parseInt(editText.getText().toString().trim()));//拼接出带id的uri地址
        List<Student> list=new ArrayList<>();
        Cursor cursor=reserve.query(uri,new String[]{"id","name","age","sex"},null,null,null);
        while (cursor.moveToNext()){
            int id=cursor.getInt(0);
            String name=cursor.getString(1);
            int age=cursor.getInt(2);
            int sex=cursor.getInt(3);
           list.add(new Student(id,name,age,sex));
        }
        cursor.close();
        System.out.println(uri.toString()+"---"+list.toString());
        return list;
    }


    //方法:远程模糊查询Age的数据信息
    public List<Student> remoteQueryBySexVague(){
        EditText editText=findViewById(R.id.textAgeVague);
        Uri uri=Uri.parse("content://com.lxz.app5/studentSexVague");
        List<Student> list=new ArrayList<>();
        Cursor cursor=reserve.query(uri,new String[]{"id","name","age","sex"},"age like ?",new String[]{"%"+editText.getText()+"%"},null);
        while (cursor.moveToNext()){
            int id=cursor.getInt(0);
            String name=cursor.getString(1);
            int age=cursor.getInt(2);
            int sex=cursor.getInt(3);
            list.add(new Student(id,name,age,sex));
        }
        cursor.close();
        System.out.println(uri.toString()+"---"+list.toString());
        return list;
    }
    //远程删除指定id对应的学生的信息
     public void remoteDeleteStudnet(){
        EditText editText=findViewById(R.id.deletetextId);
        Uri uri=Uri.parse("content://com.lxz.app5/deletestudent");
        long x=reserve.delete(uri,"id=?",new String[]{editText.getText().toString()});
        System.out.println(uri.toString()+"----"+(x>=1 ? "删除成功":"删除失败"));
    }
    //远程更新指定id对应的学生的信息
    public void remoteUpdateStudnet(){
        EditText editText=findViewById(R.id.updatetextName);
        Uri uri=Uri.parse("content://com.lxz.app5/updatestudent");
        ContentValues values=new ContentValues();
        values.put("name",editText.getText().toString());
        long x=reserve.update(uri,values,"id=?",new String[]{"1"});
        System.out.println(uri.toString()+"----"+(x>=1 ? "更新成功":"更新失败"));
    }

    //远程插入学生信息
    public void remoteInsertStudnet(){
        EditText editText=findViewById(R.id.inserttextName);
        Uri uri=Uri.parse("content://com.lxz.app5/insertstudnet");
        ContentValues values=new ContentValues();
        values.put("name",editText.getText().toString());
        values.put("age",50);
        Uri rrui=reserve.insert(uri,values);
        System.out.println("插入数据之后的URI"+rrui);
        //id为新生成的主键的值
        long id=ContentUris.parseId(rrui);
        System.out.println(uri.toString()+"---"+(id>=1 ? "插入成功":"插入失败"));
    }


    //远程查询所有的数据
    public void getStudentAll(View view) {
        remoteQueryAll();

    }
    //远程查询指定id的数据
    public void getStudentById(View view){
        remoteQueryById();
    }
    //远程模糊查询指定id的数据
    public void getStudentByIdVague(View view){
        remoteQueryByIdVague();
    }
    //远程模糊查询指定性别的数据
    public void getStudentBySexVague(View view){
        remoteQueryBySexVague();
    }
    //远程删除指定ID的数据
    public void deleteStudentById(View view){
        remoteDeleteStudnet();
    }
    //远程更新指定ID的数据
    public void updateStudentByName(View view){
        remoteUpdateStudnet();
    }

    //远程插入指定ID的数据
    public void insertStudent(View view){
        remoteInsertStudnet();
    }
}

3)效果图

图1 查询全部数据

图2 查询id=1 的信息

图3 模糊查询id带1的数据

图4 模糊查询年龄带1的

图5 删除id=11的数据

图6 更新id=1的数据的name

图7 插入一条新数据(带监听)

图8 界面图

4)插入的事件监听的设置

(1)app5下的ContentProvider设置监听通知。

  • 关键代码:getContext().getContentResolver().notifyChange(uri,null);通知该url上的所有
   //插入数据
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
        MyHelper helper=new MyHelper(this.getContext(),"studentDB",1);
        SQLiteDatabase database=helper.getWritableDatabase();
        //遍历的结果
       long id=0;
        switch (uriMatcher.match(uri)){
            case 1:
                id =database.insert("student",null,contentValues);
                if(id>=1){
                    //注册监听器,当有新的数据插入的时候去调用
                    /*
                    * uri,为在该uri上注册的所有的ContentResover
                    * */
                    getContext().getContentResolver().notifyChange(uri,null);
                }
                break;
            default:
                throw new RuntimeException("未知uri");
        }
        database.close();
        helper.close();
        //为了判断是不是插入成功了,id的值为插入后的主键的号
        uri=ContentUris.withAppendedId(uri,id);
        return uri;
    }

(2)app7创建ContentObserver的子类

    /*
    * 创建事件监听的类
    * */
    private class InsertObsever extends ContentObserver {

        public InsertObsever(Handler handler) {
            super(handler);
        }

        @Override
        public void onChange(boolean selfChange) {
            System.out.println("实时查询全部信息");
            remoteQueryAll();

        }
    }

(3)app7下的insert方法注册插入的事件监听。

   public void insertObserver(){
        Uri uri=Uri.parse("content://com.lxz.app5/insertstudnet");
        //注册事件监听
        reserve.registerContentObserver(uri,true,new InsertObsever(new Handler()));
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/114310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#项目实战——【实例】企业人事管理系统(一):1、系统分析;2、系统设计;3、系统运行环境;

学习《C#从入门到精通》&#xff0c;边学边练记录实现过程。 1、系统分析 1.1、需求分析 基于其他企业人事管理软件的不足&#xff0c;要求能够制作一个可以方便、快捷地对职工信息进行添加、修改、删除的操作&#xff0c;并且可以在数据库中存储相应职工的照片。为了能够更…

Magic Live智慧引擎发力,荣耀吹响智慧服务变革号角

人类的不断进步&#xff0c;核心源自对生活的“不满足”。 就在十几年前&#xff0c;诺基亚、黑莓等手机还被当做走在时代前沿的产品&#xff0c;触屏笔等设计风靡一时。但后来人们发现&#xff0c;触屏笔非常不方便&#xff0c;于是迅速被淘汰&#xff0c;更为先进的触摸屏诞…

自动控制原理笔记-二阶欠阻尼系统动态性能指标计算

目录 欠阻尼二阶系统的两种表示方法&#xff1a; 二阶欠阻尼系统单位阶跃响应&#xff1a; 二阶欠阻尼系统单位指标计算&#xff1a; 例题&#xff1a; 例题&#xff1a; 二阶系统动态性能随极点位置分布的变化规律&#xff1a; 例题&#xff1a; 欠阻尼包括零阻尼 欠阻…

【Linux04-进程概念上】两个结构的理解带你“降维打击”进程概念!

前言 本期分享Linux超重要的知识&#xff1a;进程概念&#xff01; 博主水平有限&#xff0c;不足之处望请斧正&#xff01; 要学习进程&#xff0c;我们首先得搭建宏观的计算机和操作系统结构&#xff0c;从更高的视角学习。 先导 计算机体系结构 使用最多提及最多的计算…

【软件测试】从事5年资深测试的经验,少走弯路......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 小张&#xff1a; 工…

SSIS中刷新Power BI数据集

前面介绍过了怎么在Azure云中刷新Power BI数据集&#xff0c;感兴趣的可以阅读 数据工厂中刷新PowerBI数据集 数据工厂刷新PowerBI数据集2 但有很多公司可能并没有完全上云&#xff0c;比如某些公司还在使用SSIS调用ETL工程&#xff0c;那么有没有办法在本地也实现执行完SSI…

双11购物的凑单问题与财务凑数问题

&#x1f4e2;作者&#xff1a; 小小明-代码实体 &#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/as604049322 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 欢迎讨论&#xff01; &#x1f4e2;本文链接&#xff1a;https://xxmdmst.blog.csdn.n…

Chapter3 P-N Junction

3-2 热平衡状态 电流只在一个方向很容易通过&#xff0c;正方向很容易通过电流&#xff0c;负方向很不容易 正电压加在Ptype上才会有电流 就会产生如图b的现象 electron 一定要从high concentration移动到low concentration 所以两个的移动方向如图所示 靠近junction附近&…

C#中window窗体和控件

C#中window窗体和控件 布局与事件–界面的基本问题 布局 就是拉动窗体的时候&#xff0c;按钮也在跟着变动。 事件 //简单的计算器 using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; namespa…

Web API事件高级部分

1、注册事件&#xff08;2种方式&#xff09; 给元素添加事件&#xff0c;称为 注册事件 或者 绑定事件 注册事件有两种方式&#xff1a;传统方式 和 监听注册方式 传统注册方式&#xff1a; 利用on开头的事件 onclick<button οnclick"alert(hi~)"></b…

供应化学试剂mPEG-Biotin,甲氧基-聚乙二醇-生物素

一&#xff1a;产品描述 1、名称 英文&#xff1a;mPEG-Biotin 中文&#xff1a;甲氧基-聚乙二醇-生物素 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Biotin PEG Methoxy PEG 4、分子量&#xff1a;可定制1k、2k、3.4k、10k、20k、5k 5、质量控制&#xff1a;95…

shell脚本四剑客--sed的应用

sed的介绍 sed是Linux下一款功能强大的非交互流式文本编辑器&#xff0c;可以对文本文件进行增、删、改、查等操作&#xff0c;支持按行、按字段、按正则匹配文本内容&#xff0c;灵活方便&#xff0c;特别适合于大文件的编辑 sed在处理文本时是逐行读取文件内容&#xff0c;…

TCP协议中的几个核心特性

目录 引言 TCP协议 &#x1f351;TCP 与 UDP 的 区别 &#x1f351;TCP客户端和服务器建立连接的三次握手 &#x1f351;TCP客户端和服务器断开连接的四次挥手 &#x1f351;滑动窗口 &#x1f351;流量控制 &#x1f351;拥塞控制 引言 还记得那个经典的图吗&#x…

TCP最大连接数调优

文章目录1、单机最大TCP连接数1.1、如何标识一个TCP连接1.2、client最大tcp连接数1.3、server最大tcp连接数1.3.1、理论连接数1.3.2、实际连接数1.4、单台服务器支撑的最大TCP并发连接数1.4.1、进程限制句柄限制查看进程句柄数限制临时修改重启后失效的修改&#xff08;不过我在…

IIC 通信协议 (二)

目录 引言 子模块设计 思路 单字节 IIC 发送模块 思路 Verilog 源码 多字节发送控制模块 思路 Verilog 源码 仿真 思路 test bench 仿真结果 参考声明 引言 本篇博文承接前文&#xff0c;继续做 IIC 通信协议 FPGA实现相关的内容。用Verilog 编写一个 IIC 通信控…

【折腾服务器 1】妖板 Intel N5105 + i226 主板安装 ESXi 7.0 教程

Catch Up 今年年初&#xff0c;开始搭建个人服务器&#xff0c;用的是一台 Dell 7010 SFF 主机&#xff0c;在上面部署了一些应用&#xff0c;例如&#xff1a;Calibre &#xff0c;Blogs &#xff0c;Minecraft Server 等。使用的是 frp 做的网络代理&#xff0c;有一台服务器…

cubeIDE开发, UART的CubeMX及HAL库实现原理及底层分析

一、UART通信协议 UART通用异步收发器(Universal Asynchronous Receiver and Transmitter)是STM32 上常用的串行通信外设&#xff0c;可以灵活地与外部设备进行全双工数据交换&#xff0c;需要注意区别&#xff1a; 【1】USART-通用同步异步收发器(Universal Synchronous Async…

<Linux线程互斥与死锁>——《Linux》

目录 1. Linux线程互斥 进程线程间的互斥相关背景概念 互斥量mutex 互斥量的接口 初始化互斥量 销毁互斥量 互斥量加锁和解锁 互斥量实现原理探究 可重入VS线程安全 概念 常见的线程不安全的情况 常见的线程安全的情况 常见不可重入的情况 常见可重入的情况 可重…

K. Lonely Numbers(线性筛 + 差分)

Problem - 1423K - Codeforces 在数字世界中&#xff0c;如果两个不同的数字有很多共同点&#xff0c;而且每个数字都有独特的好处&#xff0c;那么它们就是朋友。 更确切地说&#xff0c;如果gcd(a,b), agcd(a,b), bgcd(a,b)能组成一个三角形的边&#xff0c;那么两个不同的数…

六、应用层(四)电子邮件

目录 4.1 电子邮件系统的组成结构 4.2 简单邮件传输协议&#xff08;SMTP&#xff09; 4.3 电子邮件格式 4.4 多用途网际邮件扩充&#xff08;MIME&#xff09; 4.5 邮局协议&#xff08;POP3&#xff09;和因特网报文存取协议&#xff08;IMAP&#xff09; 4.6 基…