【网络编程通关之路】 Tcp 基础回显服务器(Java实现)及保姆式知识原理详解 ! ! !
创始人
2024-09-26 19:54:43
0

本篇会加入个人的所谓鱼式疯言

❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言

而是理解过并总结出来通俗易懂的大白话,

小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.

🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!

在这里插入图片描述

引言

在这个数字化时代,信息的快速流通已成为我们日常生活的一部分。想象一下,当你发送一封电子邮件或浏览网页时,背后是一系列复杂的网络协议在默默工作,确保数据的准确传输。

今天,我们将聚焦于这些协议中的一个核心成员——传输控制协议(TCP)。TCP协议是互联网通信的基石,它通过确保数据的可靠传输,支撑着我们每天使用的无数网络服务。

目录

  1. Tcp回显服务器的普通实现

  2. Tcp 回显服务器的多线程实现

  3. Tcp 回显服务器的线程池实现

一. Tcp 回显服务器的普通实现

1. Tcp 的特点

在上一篇 实现Udp 的回显服务器的文章中 , 我们提及Tcp 和 Udp 分别有4个主要的特点

  • Tcp 是 可靠 传输, Udp是 不可靠 传输。
  • Tcp是面向 字节流, Udp是面向 数据报
  • Tcp 是 有连接 , Udp是 无连接
  • Tcp 是 全双工 , Udp也是 全双工

关于以上这些 特点 还有 回显服务器 的详解全部都收录到了 【网络编程通关之路】 Udp 基础回响服务器(Java实现)及你不知道知识原理详解 ! ! ! 这篇文章中 。

Tcp网络编程文章详解

还没学习过或者忘记的小伙伴记得去看看哦。

2. Tcp使用的相关类

TcpUdp一样, 在进行网络通信的过程中,需要调用系统 Socket api , 但在 Java标准库 中已经封装好了相关的类, 通过这几个类, 在 JVM 中来调用系统原生的 Socket api操作网卡 , 进行网络通信。

关于Tcp 来实现回显

ServerSocket 类 :

在这里插入图片描述

  • 实例化ServerSocket 对象时, 只用于服务器一端 , 并且进行 端口号 连接 进程 的过程。

  • 用于建立 服务器客户端 连接,并且返回 Socket 对象。

    accept() 方法

鱼式疯言

从上面可以确定 Tcp的 有连接 的特点之一。

ServerSocket的构造方法 的连接是 端口号与进程的连接 , 相当于 “接好了电话线”

accept() 的连接是 服务器与客户端的连接 , 相当于 客户端那边给服务器 “打电话”, 而服务器这边就用 accept() 来接电话。完成连接。


Socket 类

在这里插入图片描述

  • 用于客户端与服务器连接:

    Socket 的构造方法, 在 实例化Socket 对象 时, 添加 IP地址端口号, 就意味着 建立了连接

  • 操作 Socket对象 来获取各种 IP地址 和输入和输出流对象

    获取IP地址

    getInetAddress()

    获取输入字节流方法
    getInputStream()

    获取输出字节流方法

    getOutputStream()

鱼式疯言

  1. 由于我们 Tcp 特点 之一就是 面向字节流 , 并且是 全双工

所以我们既可以获取到 输入字节流对象 ,也可以获取到 输出字节流对象

  1. ServerSocket 类一般只适用于 服务器一端的端口号和进程的连接 , 而 Socket 一般只适用于 客户端一端服务器 的连接, 但是都适用于 服务器和客户端获取输入流与输出流 的操作。
  1. 同一台主机 上,同一个协议 , 一个 端口号 直接连接 一个进程

    但是在不同协议中, 一个端口号 可以连接 不同协议 下的进程。

  1. 无论是 ServerSocket 类 还是 Socket 类 , 都是属于 java.net 下的包的类。

回显服务器的普通实现代码展示

<1>. 服务器实现

 package echoTCP;  import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; import java.util.concurrent.Executor; import java.util.concurrent.Executors;   public class MyTcpEchoServer {      ServerSocket serverSocket = null;      // 进行连接     public MyTcpEchoServer(int port) {         try {             // 进行连接             serverSocket = new ServerSocket(port);         } catch (IOException e) {             throw new RuntimeException(e);         }     }      public  void start() {         // 开始交互          System.out.println("服务器开始运行...");         while(true) {         // 使用线程池                  Socket socket = null;              try {                 socket = serverSocket.accept();             } catch (IOException e) {                 throw new RuntimeException(e);             }              // 进行接收请求并响应             ProcessServerConnect(socket);            }            }      private void ProcessServerConnect(Socket socket) {             try(InputStream inputSTream = socket.getInputStream();                 OutputStream outputStream = socket.getOutputStream()             ) {                   while(true) {                      System.out.printf("客户端上线 : [客户端ip = %s,                     客户端端口号 = %d]\n"                     ,socket.getInetAddress(),                     socket.getPort());                                          // 得到请求                     Scanner scanner = new Scanner(inputSTream);                     if(!scanner.hasNext()) {                         break;                     }                      // 得到请求                     String request = scanner.nextLine();                      // 计算响应                     // 执行业务                    String response =  process(request);                     // 返回响应                    // 让客户端得到业务的执行结果                    PrintWriter printWriter = new                     PrintWriter(outputStream);                     // 开始返回                    printWriter.println(response);                    // 进行刷新                     printWriter.flush();   //                    打印日志                     System.out.printf("客户端下线 :  [ip = %s ,                      port = %d], 请求 = %s , 响应 = %s\n",                             socket.getInetAddress(),                             socket.getPort(),request,response);                   }                } catch (IOException e) {                 throw new RuntimeException(e);             } finally {                 System.out.printf("任务执行结束: [%s,%d]\n",                 socket.getInetAddress(),                 socket.getPort());                 try { //                    关闭 socket 流                     socket.close();                 } catch (IOException e) {                     throw new RuntimeException(e);                 }             }      }      private String process(String request) {         return  request;     }       public static void main(String[] args) {         MyTcpEchoServer myTcpEchoServer = new MyTcpEchoServer(9090);         myTcpEchoServer.start();     } }   

在这里插入图片描述

服务器一端的实现的整体流程可分为以下几步:

  1. 创建 ServerSocket 对象 , 在构造方法中参数列表添加 端口号 , 建立端口号与进程的 连接
   // 进行连接             serverSocket = new ServerSocket(port); 
  1. 调用 accept 方法让服务器与客户端进行,并返回一个 Socket 对象。
   Socket socket = null;          try {             socket = serverSocket.accept();         } catch (IOException e) {             throw new RuntimeException(e);         } 
  1. 获取到输入流,利用 Scanner 包装输入流 得到请求
// 得到请求 Scanner scanner = new Scanner(inputSTream); if(!scanner.hasNext()) {     break; }  // 得到请求 String request = scanner.nextLine(); 
  1. 计算响应 并把 输出流对象 包装到 printWriter输出到客户端
// 计算响应     // 执行业务    String response =  process(request);     // 返回响应    // 让客户端得到业务的执行结果    PrintWriter printWriter = new     PrintWriter(outputStream);     // 开始返回    printWriter.println(response); // 进行刷新     printWriter.flush(); 
  1. 打印日志,并关闭 Socket 对象
//                    打印日志                  System.out.printf("客户端下线 :  [ip = %s ,                   port = %d], 请求 = %s , 响应 = %s\n",                          socket.getInetAddress(),                          socket.getPort(),request,response);                }             } catch (IOException e) {              throw new RuntimeException(e);          } finally {              System.out.printf("任务执行结束: [%s,%d]\n",              socket.getInetAddress(),              socket.getPort());              try { //                    关闭 socket 流                  socket.close();              } catch (IOException e) {                  throw new RuntimeException(e);              }          } 

鱼式疯言

补充细节

  1. 对于大部分 IO流 来说, 并不是 输入或输出一个/ 一段 就会加载到 硬盘 , 而是会存放到一个叫 缓冲区的地方, 当数据积攒到 一定的量 , 才会 加载过去

    所以我们为了每次只加载 一个 / 一段数据 , 可以调用 flush这个方法 来将 缓冲区 的数据全部
    刷新出去

 // 进行刷新       printWriter.flush(); 

  1. 小编在这里利用了 ScannerprintWriter 来包装输入和输出流。 但是小伙伴们也可以利用小编之前提及过的 IO流的操作方式 来进行哦, 效果是一样的 。

关于IO的流的操作文章, 可以多学习学习并且回去哦 💖 💖 💖 💖

IO流理论篇文章详解

IO流Java实践篇文章详解

  1. 对于上述 回显服务器 来说, 服务端一端 accept() 只有当服务器每次发来请求时,才会进行 连接, 否则进行 阻塞等待

<2>. 客户端实现

package echoTCP;  import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner;   public class MyTcpEchoClient {     Socket clientSocket = null;      // 进行连接     public MyTcpEchoClient(String ip , int port) {         try {             // 进行连接             clientSocket = new Socket(ip, port);         } catch (IOException e) {             throw new RuntimeException(e);         }     }      public  void start() {         // 开始交互               System.out.println("客户端开始运行...");                   // 发送请求并接受响应                 ProcessServerConnect(clientSocket);       }      private void ProcessServerConnect(Socket socket) {         try(InputStream inputSTream = socket.getInputStream();             OutputStream outputStream = socket.getOutputStream()         ) {              while(true) {                    Scanner in = new Scanner(System.in);                 System.out.print("请输入你的需求-> ");   //                输入请求并发送                 String request = in.nextLine();                  PrintWriter printWriter = new                  PrintWriter(outputStream);                 printWriter.println(request);                 // 进行刷新                 printWriter.flush();                   // 接收响应并输出                 Scanner scanner = new Scanner(inputSTream);                 if(!scanner.hasNext()) {                     break;                 }                  String response = scanner.nextLine();                  System.out.println("response = "+ response);              }            } catch (IOException e) {             throw new RuntimeException(e);         } finally {             System.out.printf("任务执行结束:              [%s,%d]\n",             socket.getInetAddress(),             socket.getPort());             try { //                    关闭 socket 流                 socket.close();             } catch (IOException e) {                 throw new RuntimeException(e);             }         }      }       public static void main(String[] args) {         MyTcpEchoClient myTcpEchoClient = new          MyTcpEchoClient("127.0.0.1",9090);         myTcpEchoClient.start();     } } 

在这里插入图片描述

具体客户端一端的整体实现流程梳理

  1. 实例化Socket 对象, 并把 IP地址端口号 作为 Socket 构造方法的参数进行 客户端与服务端 的连接。
Socket clientSocket = null;  // 进行连接 public MyTcpEchoClient(String ip , int port) {     try {         // 进行连接         clientSocket = new Socket(ip, port);     } catch (IOException e) {         throw new RuntimeException(e);     } } 
  1. 输入请求 并发送给 客户端
                Scanner in = new Scanner(System.in);                 System.out.print("请输入你的需求-> ");   //                输入请求并发送                 String request = in.nextLine();                  PrintWriter printWriter = new                  PrintWriter(outputStream);                 printWriter.println(request);                 // 进行刷新                 printWriter.flush(); 
  1. 接收服务器返回的 响应并输出
 // 接收响应并输出     Scanner scanner = new Scanner(inputSTream);     if(!scanner.hasNext()) {         break;     }      String response = scanner.nextLine();      System.out.println("response = "+ response); 
  1. 宣布服务器执行结束, 并 关闭Socket对象
 finally {             System.out.printf("任务执行结束:              [%s,%d]\n",             socket.getInetAddress(),             socket.getPort());             try { //                    关闭 socket 流                 socket.close();             } catch (IOException e) {                 throw new RuntimeException(e);             }         } 

鱼式疯言

补充细节

  1. 对应上述代码中的 hasNext() 方法来说, 出现了 换行 才会 break 结束 出去, 而当 服务器/ 客户端没有 发来数据时, 是会进入 阻塞等待 的, 不会break 直接跳出。
   if(!scanner.hasNext()) {                 break;             } 

二. Tcp 回显服务器的多线程实现

1. 代码展示

服务器源码

package echoTCP;  import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; import java.util.concurrent.Executor; import java.util.concurrent.Executors;   public class MyTcpEchoServer {      ServerSocket serverSocket = null;      // 进行连接     public MyTcpEchoServer(int port) {         try {             // 进行连接             serverSocket = new ServerSocket(port);         } catch (IOException e) {             throw new RuntimeException(e);         }     }      public  void start() {         // 开始交互          System.out.println("服务器开始运行...");    //        使用多线程          while(true) {             Thread t = new Thread(()->{                  Socket socket = null;                 try {                     socket = serverSocket.accept();                 } catch (IOException e) {                     throw new RuntimeException(e);                 }                  // 进行接收请求并响应                 ProcessServerConnect(socket);               });             t.start();         }         }      private void ProcessServerConnect(Socket socket) {             try(InputStream inputSTream = socket.getInputStream();                 OutputStream outputStream = socket.getOutputStream()             ) {                   while(true) {                      System.out.printf("客户端上线 : [客户端ip = %s,客户端端口号 = %d]\n",socket.getInetAddress(),socket.getPort());                     // 得到请求                     Scanner scanner = new Scanner(inputSTream);                     if(!scanner.hasNext()) {                         break;                     }                      // 得到请求                     String request = scanner.nextLine();                      // 计算响应                     // 执行业务                    String response =  process(request);                     // 返回响应                    // 让客户端得到业务的执行结果                    PrintWriter printWriter = new PrintWriter(outputStream);                     // 开始返回                    printWriter.println(response);                    // 进行刷新                     printWriter.flush();   //                    打印日志                     System.out.printf("客户端下线 :  [ip = %s , port = %d], 请求 = %s , 响应 = %s\n",                             socket.getInetAddress(),socket.getPort(),request,response);                   }                } catch (IOException e) {                 throw new RuntimeException(e);             } finally {                 System.out.printf("任务执行结束: [%s,%d]\n",socket.getInetAddress(),socket.getPort());                 try { //                    关闭 socket 流                     socket.close();                 } catch (IOException e) {                     throw new RuntimeException(e);                 }             }      }      private String process(String request) {         return  request;     }       public static void main(String[] args) {         MyTcpEchoServer myTcpEchoServer = new MyTcpEchoServer(9090);         myTcpEchoServer.start();     } } 

客户端源码

package echoTCP;  import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner;   public class MyTcpEchoClient {     Socket clientSocket = null;      // 进行连接     public MyTcpEchoClient(String ip , int port) {         try {             // 进行连接             clientSocket = new Socket(ip, port);         } catch (IOException e) {             throw new RuntimeException(e);         }     }      public  void start() {         // 开始交互             System.out.println("客户端开始运行...");                   // 发送请求并接受响应                 ProcessServerConnect(clientSocket);       }      private void ProcessServerConnect(Socket socket) {         try(InputStream inputSTream = socket.getInputStream();             OutputStream outputStream = socket.getOutputStream()         ) {              while(true) {                    Scanner in = new Scanner(System.in);                 System.out.print("请输入你的需求-> ");   //                输入请求并发送                 String request = in.nextLine();                  PrintWriter printWriter = new PrintWriter(outputStream);                 printWriter.println(request);                 // 进行刷新                 printWriter.flush();                   // 接收响应并输出                 Scanner scanner = new Scanner(inputSTream);                 if(!scanner.hasNext()) {                     break;                 }                  String response = scanner.nextLine();                  System.out.println("response = "+ response);                }            } catch (IOException e) {             throw new RuntimeException(e);         } finally {             System.out.printf("任务执行结束: [%s,%d]\n",socket.getInetAddress(),socket.getPort());             try { //                    关闭 socket 流                 socket.close();             } catch (IOException e) {                 throw new RuntimeException(e);             }         }      }       public static void main(String[] args) {         MyTcpEchoClient myTcpEchoClient = new MyTcpEchoClient("127.0.0.1",9090);         myTcpEchoClient.start();     } } 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 原理剖析

对于多线程的回显服务器的实现, 最主要是解决 多个 客户端同时给 一个 服务器 发送请求 的问题。

对于服务器来说 外边套着一个循环 , 里面又加了 一层循环 , 这样的话就会导致 两层循环 的加入

第一个客户端进入内循环 时, 它的任务还 没结束, 第二个客户端就向服务器 发送请求 , 这时由于内部的还 一直循环, 服务器就无法进入内循环 , 只能让第二个客户端一直停留在 缓冲区

这时我们就引入 多线程 的方式, 将每一个服务器都 分布同时 执行循环, 这样就能保证不会让 多个 服务器一直阻塞到 缓冲区

关于代码的实现实现流程, 只是在普通回显服务器的基础上加了 一行多线程 的代码。 其他都是一样的, 小编在这里就 不赘述了

三. Tcp 回显服务器的线程池实现

1. 代码展示

服务器一端

package echoTCP;  import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; import java.util.concurrent.Executor; import java.util.concurrent.Executors;   public class MyTcpEchoServer {      ServerSocket serverSocket = null;      // 进行连接     public MyTcpEchoServer(int port) {         try {             // 进行连接             serverSocket = new ServerSocket(port);         } catch (IOException e) {             throw new RuntimeException(e);         }     }      public  void start() {         // 开始交互          System.out.println("服务器开始运行...");         while(true) {         // 使用线程池         Executor executor = Executors.newCachedThreadPool();          executor.execute(() -> {               Socket socket = null;              try {                 socket = serverSocket.accept();             } catch (IOException e) {                 throw new RuntimeException(e);             }              // 进行接收请求并响应             ProcessServerConnect(socket);           });         }              }      private void ProcessServerConnect(Socket socket) {             try(InputStream inputSTream = socket.getInputStream();                 OutputStream outputStream = socket.getOutputStream()             ) {                   while(true) {                      System.out.printf("客户端上线 : [客户端ip = %s,客户端端口号 = %d]\n",socket.getInetAddress(),socket.getPort());                     // 得到请求                     Scanner scanner = new Scanner(inputSTream);                     if(!scanner.hasNext()) {                         break;                     }                      // 得到请求                     String request = scanner.nextLine();                      // 计算响应                     // 执行业务                    String response =  process(request);                     // 返回响应                    // 让客户端得到业务的执行结果                    PrintWriter printWriter = new PrintWriter(outputStream);                     // 开始返回                    printWriter.println(response);                    // 进行刷新                     printWriter.flush();   //                    打印日志                     System.out.printf("客户端下线 :  [ip = %s , port = %d], 请求 = %s , 响应 = %s\n",                             socket.getInetAddress(),socket.getPort(),request,response);                   }                } catch (IOException e) {                 throw new RuntimeException(e);             } finally {                 System.out.printf("任务执行结束: [%s,%d]\n",socket.getInetAddress(),socket.getPort());                 try { //                    关闭 socket 流                     socket.close();                 } catch (IOException e) {                     throw new RuntimeException(e);                 }             }      }      private String process(String request) {         return  request;     }       public static void main(String[] args) {         MyTcpEchoServer myTcpEchoServer = new MyTcpEchoServer(9090);         myTcpEchoServer.start();     } } 

在这里插入图片描述
客户端一端

package echoTCP;  import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner;   public class MyTcpEchoClient {     Socket clientSocket = null;      // 进行连接     public MyTcpEchoClient(String ip , int port) {         try {             // 进行连接             clientSocket = new Socket(ip, port);         } catch (IOException e) {             throw new RuntimeException(e);         }     }      public  void start() {         // 开始交互             System.out.println("客户端开始运行...");                   // 发送请求并接受响应                 ProcessServerConnect(clientSocket);       }      private void ProcessServerConnect(Socket socket) {         try(InputStream inputSTream = socket.getInputStream();             OutputStream outputStream = socket.getOutputStream()         ) {              while(true) {                    Scanner in = new Scanner(System.in);                 System.out.print("请输入你的需求-> ");   //                输入请求并发送                 String request = in.nextLine();                  PrintWriter printWriter = new PrintWriter(outputStream);                 printWriter.println(request);                 // 进行刷新                 printWriter.flush();                   // 接收响应并输出                 Scanner scanner = new Scanner(inputSTream);                 if(!scanner.hasNext()) {                     break;                 }                  String response = scanner.nextLine();                  System.out.println("response = "+ response);                }            } catch (IOException e) {             throw new RuntimeException(e);         } finally {             System.out.printf("任务执行结束: [%s,%d]\n",socket.getInetAddress(),socket.getPort());             try { //                    关闭 socket 流                 socket.close();             } catch (IOException e) {                 throw new RuntimeException(e);             }         }      }       public static void main(String[] args) {         MyTcpEchoClient myTcpEchoClient = new MyTcpEchoClient("127.0.0.1",9090);         myTcpEchoClient.start();     } } 

在这里插入图片描述

在这里插入图片描述

代码说明

关于线程池的代码实现: 主要还是在原来 普通 回显服务器的基础上, 加上了线程池的 newCachedThreadPool 对象 。

这个线程池对象在 任务繁忙 时, 最多可以创建出 Integer.MAX_VALUES非核心线程

具体详情小伙伴们可以参考多线程的文章, 有重点讲解哦

多线程实践篇详解

非常适合 服务器开发使用

  // 使用线程池         Executor executor = Executors.newCachedThreadPool();          executor.execute(() -> {               Socket socket = null;              try {                 socket = serverSocket.accept();             } catch (IOException e) {                 throw new RuntimeException(e);             }              // 进行接收请求并响应             ProcessServerConnect(socket);           }); 

鱼式疯言

如果是大量的客户端, 我们可能会用到上面的 线程池 来使用。

如果是海量的客户端使用, 就会使用 IO多路复用 (了解即可)。

总结

  1. Tcp回显服务器的普通实现: 从Tcp 的四大特点: 有连接, 面向字节流, 可靠传输, 全双工 的四个特点展开介绍 Tcp 的两个主要网络通信的类: ServerSocketSocket 两个类 ,并在代码中充分的使用并结合理解流程。

  2. Tcp 回显服务器的 多线程实现 : 利用多线程解决了一个服务器只能解决一个客户端的问题。

  3. Tcp 回显服务器的线程池实现: 从另外一个线程池的角度更解决大量客户端的问题。

如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正

希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖

在这里插入图片描述

相关内容

热门资讯

安卓手机好的系统,安卓手机操作... 你有没有发现,现在手机市场上的安卓手机真是琳琅满目,让人挑花了眼。不过,你知道吗?在这些安卓手机中,...
安卓系统mac电脑配置,打造安... 亲爱的电脑迷们,你是否曾想过,你的苹果笔记本里也能装上安卓系统?是的,你没听错!今天,就让我带你一起...
状元郎平板安卓系统,引领平板教... 你有没有想过,一款平板电脑,竟然能让你在学习之余,还能畅游安卓世界的海洋?没错,今天我要跟你聊聊的就...
安卓系统哪个传奇好玩,畅玩经典... 手机里的游戏可是咱们休闲娱乐的一大法宝,尤其是安卓系统,那丰富的游戏资源简直让人挑花眼。今天,就让我...
联众支持安卓系统吗,“联众PD... 斗地主爱好者们,是不是在为找不到一款好玩的斗地主游戏而烦恼呢?别急,今天我要给大家揭秘一个好消息——...
康佳电视安卓系统太卡,康佳电视... 亲爱的电视迷们,你们有没有遇到过这样的烦恼:家里的康佳电视用着用着就变得像蜗牛一样慢吞吞的,让人抓狂...
ios对比安卓系统流畅,流畅体... 你有没有发现,用手机的时候,有时候iOS系统就像个优雅的舞者,而安卓系统则像个活力四射的少年?没错,...
安卓系统占用内存小,深度解析优... 你有没有发现,手机用久了,就像人一样,会变得“臃肿”起来?尤其是安卓系统,有时候感觉就像一个超级大胃...
安卓系统怎么下载jdk,JDK... 你有没有想过,在安卓手机上也能编写Java程序呢?没错,就是那种在电脑上写代码的感觉,现在也能在手机...
安卓系统调手机亮度,轻松掌握手... 手机屏幕亮度总是让你眼花缭乱?别急,今天就来手把手教你如何轻松调节安卓系统的手机亮度,让你的手机屏幕...
学习机安卓系统双系统,安卓系统... 你有没有想过,学习机也能玩转安卓系统?没错,就是那个我们平时用来刷剧、玩游戏、看新闻的安卓系统!现在...
安卓系统有哪些兼职,盘点热门兼... 你有没有想过,在手机上也能轻松赚钱呢?没错,就是那个我们每天都离不开的安卓系统,它不仅能让你畅游网络...
别致影音下载安卓系统,轻松享受... 你有没有想过,在这个信息爆炸的时代,找到一款既别致又实用的影音下载APP,简直就像在茫茫人海中找到那...
安卓车机系统和手机系统,共筑智... 你有没有发现,现在汽车也越来越智能了?这不,车机系统都开始流行起来,而且很多车企都选择了安卓系统。那...
爱情银行ios系统与安卓系统,... 亲爱的读者们,今天咱们来聊聊一个让无数人心动的话题——爱情银行iOS系统与安卓系统!想象爱情银行就像...
车载wce系统和安卓系统区别,... 亲爱的车友们,你们有没有想过,为什么你的车载导航有时候会像老牛拉车一样慢吞吞,有时候又像兔子一样活泼...
安卓系统常见app取证,深度解... 你有没有想过,手机里的那些小玩意儿,其实可能藏着大大的秘密呢?没错,就是那些我们每天不离手的安卓系统...
苹果云照片安卓系统,苹果云照片... 你有没有想过,那些在苹果手机上美美哒的照片,怎么才能搬到安卓手机上呢?别急,今天就来给你揭秘这个神奇...
ios系统跟安卓系统都是美国,... iOS与安卓:美国科技的双雄争霸在当今这个数字化的世界里,智能手机已经成为了我们生活中不可或缺的一部...
深度系统可以装安卓,系统兼容安... 亲爱的读者们,你是否曾想过,在电脑上也能畅玩安卓游戏,享受安卓应用带来的便捷?现在,这个梦想成真啦!...