安卓:UDP通信
目录
一、介绍
网络通信的三要素:
(1)、IP地址:
IPv4:
IPv6:
IP地址形式:
IP常用命令:
IP地址操作类:
(2)、端口:
(3)、协议:
UDP协议:
UDP通信的特点:
二、常用类及其方法
1. DatagramSocket类
常用方法:
2. DatagramPacket 类
常用方法:
3. InetAddress类
常用方法:
三、udp例子
MainActivity:
UdpTool :
activity_main:
权限:
运行结果:
一、介绍
UDP(User Datagram Protocol)是一种无连接的传输协议,它在网络通信中常用于实时应用程序,例如音频、视频流传输和在线游戏。与TCP(Transmission Control Protocol)相比,UDP具有更低的开销和更高的传输速度,但不提供可靠性和错误检测功能。
网络通信的三要素:
(1)、IP地址:
IP地址(Internet Protocol Address)是用于在网络中标识和定位设备的一组数字。它是互联网通信所必需的基本元素之一,用于确定数据包在网络中的传输路径。
IP地址的作用是为每个连接到互联网的设备提供一个唯一的标识符,类似于世界上每个家庭都有一个不同的地址来进行邮件投递。通过IP地址,计算机可以相互识别并建立网络通信。
IP地址分为两部分:网络部分和主机部分。网络部分标识了设备所连接的网络,而主机部分标识了网络中的具体设备。
IP地址由32位或128位二进制数字组成,在常见的使用中通常表示为分组的四个十进制数,例如:192.168.0.1。IPv4(Internet Protocol version 4)地址使用32位,而IPv6(Internet Protocol version 6)地址使用128位,以满足互联网设备的增长需求。
IPv4:
IPv6:
IP地址形式:
- 公网地址、和私有地址(局域网使用)。
- 192.168. 开头的就是常见的局域网地址,范围即为192.168.0.0--192.168.255.255,专门为组织机构内部使用。
IP常用命令:
- ipconfig:查看本机IP地址
- ping IP地址:检查网络是否连通
特殊IP地址:
- 本机IP: 127.0.0.1或者localhost:称为回送地址也可称本地回环地址,只会寻找当前所在本机。
IP地址操作类:
- InetAddress (在下面)
(2)、端口:
端口(Port)是用于在计算机网络中标识应用程序或服务的数字。它是网络通信中的一个重要概念,用于区分不同的网络应用和服务。
在互联网协议(IP)中,每个主机都有一个唯一的IP地址,而端口号则用于标识该主机上特定的应用程序或服务。它可以看作是一个门,通过该门可以与特定的应用程序进行交流。
端口号是一个16位的整数,范围从0到65535。其中,0到1023的端口号被称为“知名端口”(Well-known Ports),用于标识一些常见的服务,如HTTP(端口号80)、FTP(端口号21)等。1024到49151之间的端口号被称为“注册端口”(Registered Ports),用于一些已经注册的应用程序。49152到65535之间的端口号被称为“动态或私有端口”(Dynamic or Private Ports),通常由操作系统动态分配给客户端应用程序。
通过使用源IP地址、目标IP地址和端口号,可以唯一确定网络中的通信路径。发送方将数据发送到目标主机的特定端口,接收方根据目标端口来接收和处理数据。
端口的作用是实现多个应用程序同时在同一台设备上进行网络通信,使得网络上的数据可以正确地路由到目标应用程序。通过将数据包与特定的端口相关联,网络设备可以将数据传递给正确的应用程序,并实现应用层之间的通信。
总结而言,端口是在计算机网络中用于标识不同应用程序或服务的数字,它通过与IP地址一起使用,帮助网络设备正确地路由和交付数据。
注意:我们自己开发的程序选择注册端口,且一个设备中不能出现两个程序的端口号一样,否则出错。
(3)、协议:
协议(Protocol)是在计算机网络中定义数据通信规则和标准的集合。它规定了网络中各个设备之间如何进行通信、数据格式的结构、错误处理等细节,确保信息能够按照特定的方式传输和解释。
在计算机网络中,不同的设备和应用程序需要遵循相同的协议来进行有效的通信。协议定义了数据交换的规则和语义,使得通信双方能够理解和解释彼此发送和接收的数据。
常见的网络协议有很多,其中一些重要的包括:
-
TCP/IP协议:TCP/IP(Transmission Control Protocol/Internet Protocol)是互联网最基本的协议族,它定义了数据在网络中的传输方式和规则,包括IP地址分配、数据路由、数据分片、错误检测和纠错等。TCP/IP协议族包括了多个协议,如IP协议、TCP协议、UDP协议等。
-
HTTP协议:HTTP(Hypertext Transfer Protocol)是一种应用层协议,用于在Web浏览器和Web服务器之间传输超文本数据。它定义了浏览器发送请求和服务器响应请求的格式和规则,是Web应用程序最常用的协议之一。
-
FTP协议:FTP(File Transfer Protocol)是用于在网络上进行文件传输的协议。它定义了客户端和服务器之间进行文件传输的规则,包括建立连接、身份验证、文件上传和下载等。
-
SMTP协议:SMTP(Simple Mail Transfer Protocol)是用于电子邮件传输的协议。它规定了电子邮件的传输方式、信封格式、消息格式等,确保电子邮件能够从发送方传递到接收方。
-
DNS协议:DNS(Domain Name System)是将域名转换为IP地址的协议。它提供了一个分布式的命名系统,将人类可读的域名映射到计算机可识别的IP地址,实现了域名解析的功能。
这些只是众多网络协议中的一小部分,每个协议都有不同的功能和应用领域。通过遵守共同的协议标准,网络设备和应用程序可以相互通信并完成特定的任务。协议的使用使得计算机网络能够高效、可靠地运行,并实现各种功能和服务。
UDP协议:
- UDP是一种无连接、不可靠传输的协议。
- 将数据源IP、目的地IP和端口封装成数据包,不需要建立连接
- 每个数据包的大小限制在64KB内
- 发送不管对方是否准备好,接收方收到也不确认,故是不可靠的
- 可以广播发送 ,发送数据结束时无需释放资源,开销小,速度快。
UDP通信的特点:
- 无连接性:UDP是无连接的传输协议,意味着在发送数据之前不需要建立连接。每个数据包都是独立的,由源主机直接发送到目标主机。
- 速度快:UDP没有像TCP那样的握手过程和其他的控制机制,因此传输速度较快。
- 简单:相对于TCP,UDP协议更加简单,头部开销较小。
- 不可靠:UDP不提供可靠性保证,因为它不处理丢失、重复或乱序的数据包。这意味着在数据传输过程中可能存在丢包的风险。
- 适合实时应用:由于UDP的快速传输和较低的延迟,它在对实时性要求较高的应用中表现良好,如语音通话、视频流等。
二、常用类及其方法
1. DatagramSocket类
DatagramSocket
类表示一个UDP套接字,用于发送和接收数据报。它提供了与底层网络通信相关的方法。
常用方法:
DatagramSocket()
:创建一个未绑定到任何本地地址和端口的新套接字。DatagramSocket(int port)
:创建一个绑定到指定本地端口的新套接字。void send(DatagramPacket packet)
:将指定的数据包发送到目标主机。void receive(DatagramPacket packet)
:从套接字中接收数据包。
2. DatagramPacket 类
DatagramPacket
类表示一个UDP数据包,包含要发送或接收的数据以及目标主机的地址和端口号。
常用方法:
DatagramPacket(byte[] data, int length)
:使用指定的数据和长度创建一个无发送地址或端口号的数据包。DatagramPacket(byte[] data, int offset, int length)
:使用指定的数据、偏移量和长度创建一个无发送地址或端口号的数据包。DatagramPacket(byte[] data, int offset, int length, InetAddress address, int port)
:使用指定的数据、偏移量、长度、目标主机地址和端口号创建一个数据包。byte[] getData()
:获取该数据包的数据。InetAddress getAddress()
:获取该数据包的目标主机地址。int getPort()
:获取该数据包的目标端口号。
3. InetAddress类
InetAddress
类表示一个IP地址,并提供了与IP地址相关的方法。
常用方法:
- public static InetAddress getLocalHost():返回本主机的地址对象。
- public static InetAddress getByName(String host):得到指定主机的IP地址对象,参数是域名或者IP地址。
- public String getHostName():获取此IP地址的主机名。
- public String getHostAddress():返回IP地址字符串。
- public boolean isReachable(int timeout):在指定毫秒内连通该IP地址对应的主机,连通返回true。
三、udp例子
MainActivity:
package com.example.udpdemo;import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends Activity {Button sendBtn, decideBtn;EditText sendMsg, ipEd;TextView receiveMsg;// 对方的ip地址String ip;UdpTool udpTool;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();// 发送信息的函数sendBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//在Android通信协议必须要放在线程里面进行String str = sendMsg.getText().toString();Log.v("发送", str);if (ip!=null){udpTool.sendMessage(str,ip);}else {Toast.makeText(MainActivity.this, "请输入对方ip和端口", Toast.LENGTH_SHORT).show();}}});decideBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {ip = ipEd.getText().toString();Toast.makeText(MainActivity.this, "确定成功!", Toast.LENGTH_SHORT).show();}});// 接收信息的函数try {udpTool.receiveMessage(receiveMsg);;} catch (Exception e) {e.printStackTrace();}}private void initView() {sendBtn = findViewById(R.id.send_btn);sendMsg = findViewById(R.id.send_message);receiveMsg = findViewById(R.id.receive_message);ipEd = findViewById(R.id.target_ip_ed);decideBtn = findViewById(R.id.decide_btn);udpTool = new UdpTool(this);}@Overrideprotected void onDestroy() {super.onDestroy();// 释放资源udpTool.closeSocket();}
}
UdpTool :
package com.example.udpdemo;import android.content.Context;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;public class UdpTool {private String TAG = "UdpTool";DatagramSocket mSocket;Context context;public UdpTool(Context context){this.context = context;}/*** 发送信息* @param msg 信息内容* @param ip 对方ip地址*/public void sendMessage(String msg, String ip){// 需要开线程来发数据new Thread(new Runnable() {@Overridepublic void run() {if (mSocket == null){try {// 这个是本机的端口号mSocket = new DatagramSocket(20010);} catch (SocketException e) {e.printStackTrace();}}// 将字符串转换成字节流,因为底层的传输都是字节传输byte[] data = msg.getBytes();try {// 对方ip和端口DatagramPacket pack = new DatagramPacket(data, data.length, InetAddress.getByName(ip), 60011);mSocket.send(pack);Log.d(TAG, "发送成功!");} catch (IOException e) {Log.d(TAG, "发送失败!");e.printStackTrace();}}}).start();}/*** 接收消息的函数*/public void receiveMessage(TextView tv) throws Exception {// 创建线程,同理,接收信息也要放在线程里面接收new Thread(new Runnable() {public void run() {try {if (mSocket == null) {mSocket = new DatagramSocket(60011);}String str;while (true) {// 创建一个空的字节数组byte[] data = new byte[1024];// 将字节数组和数组的长度传进DatagramPacket 创建的对象里面DatagramPacket pack2 = new DatagramPacket(data, data.length);Log.v("s", "pack2");Log.v("s", "开始 接收");try {// socket对象接收pack包,程序启动的时候,socket会一直处于阻塞状态,直到有信息传输进来mSocket.receive(pack2);} catch (IOException e) {e.printStackTrace();}// 获取发送数据的IP地址String ip = pack2.getAddress().getHostAddress();// 获取发送数据端的端口号int port = pack2.getPort();str = new String(pack2.getData(), 0, pack2.getLength()); // 将字节数组转化成字符串表现出来// 开启接收端口后会持续接收数据,只有页面可见的时候才将收到的数据写入tv.setText(str);Toast.makeText(context, "IP地址:"+ip+"端口:"+port, Toast.LENGTH_SHORT).show();}} catch (Exception e) {e.printStackTrace();}}}).start();}/*** 关闭通信*/public void closeSocket() {if (mSocket != null) {mSocket.close();mSocket = null;}}
}
activity_main:
<?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:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:gravity="center"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20sp"android:text="对方IP地址:"/><EditTextandroid:id="@+id/target_ip_ed"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="20sp"/></LinearLayout><Buttonandroid:id="@+id/decide_btn"android:layout_width="80dp"android:layout_height="50dp"android:layout_gravity="center"android:gravity="center"android:textSize="20sp"android:text="确定"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="25dp"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20sp"android:text="发送信息端:"/><EditTextandroid:id="@+id/send_message"android:layout_width="match_parent"android:layout_height="55dp"android:textSize="20sp"android:hint="发送的消息"android:background="@color/teal_200"android:gravity="center"/><Buttonandroid:id="@+id/send_btn"android:layout_width="80dp"android:layout_height="50dp"android:layout_gravity="center"android:gravity="center"android:textSize="20sp"android:text="发送"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="25dp"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20sp"android:text="接收信息端:"/><TextViewandroid:id="@+id/receive_message"android:layout_width="match_parent"android:layout_height="55dp"android:hint="接收到的消息"android:textSize="20sp"android:background="@color/purple_500"android:gravity="center"/></LinearLayout></LinearLayout>
权限:
<uses-permission android:name="android.permission.INTERNET"/>
运行结果:
相关文章:

安卓:UDP通信
目录 一、介绍 网络通信的三要素: (1)、IP地址: IPv4: IPv6: IP地址形式: IP常用命令: IP地址操作类: (2)、端口: (3)、协议: UDP协…...

clickhouse安装
clickhouse安装 在线安装和离线安装 一、环境准备: 1.检查系统是否支持clickhouse安装 (向量化支持) grep -q sse4_2 /proc/cpuinfo && echo “SSE 4.2 supported” || echo “SSE 4.2 not supported.” 2.下载对应的clickhouse包 复制运行之后,就会将对应的包加入…...

Cpp学习——string(2)
目录 编辑 容器string中的一些函数 1.capacity() 2.reserve() 3.resize() 4.push_back()与append() 5.find系列函数 容器string中的一些函数 1.capacity() capacity是string当中表示容量大小的函数。但是string开空间时是如何开的呢?现在就来看一下。先写…...

python进阶编程
lambda匿名函数 python使用lambda表达式来创建匿名函数 语法 // lambda 参数们:对参数的处理 lambda x : 2 * x // x 是参数, 2*x 是返回值 //使用lambda实现求和 sum lambda arg1, arg2 : agr1 arg2 print(sum(10,20)) // 将匿名函数封装在一…...

算法练习--leetcode 链表
文章目录 合并两个有序链表删除排序链表中的重复元素 1删除排序链表中的重复元素 2环形链表1环形链表2相交链表反转链表 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。 新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入&…...

Android性能优化—Apk瘦身优化
随着业务迭代,apk体积逐渐变大。项目中积累的无用资源,未压缩的图片资源等,都为apk带来了不必要的体积 增加。而APK 的大小会影响应用加载速度、使用的内存量以及消耗的电量。在讨论如何缩减应用的大小之前,有必要了解下应用 APK …...

前端主题切换方案——CSS变量
前言 主题切换是前端开发中老生常谈的问题,本文将介绍主流的前端主题切换实现方案——CSS变量 CSS变量 简介 编写CSS样式时,为了避免代码冗余,降低维护成本,一些CSS预编译工具(Sass/Less/Stylus)等都支…...

Java8 list多属性去重
大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。 在 Java 开发中,我们经常会面临对 List 中的对象属性去重的需求。然而,当需要根据多个属性来进行去重时,情况会稍微复杂一些。本篇…...

kafka-保证数据不重复-生产者开启幂等性和事务的作用?
1. 生产者开启幂等性为什么能去重? 1.1 场景 适用于消息在写入到服务器日志后,由于网络故障,生产者没有及时收到服务端的ACK消息,生产者误以为消息没有持久化到服务端,导致生产者重复发送该消息,造成了消…...

[AI in security]-214 网络安全威胁情报的建设
文章目录 1.什么是威胁情报2. 威胁情报3. 智能威胁情报3.1 智能威胁情报的组成3.2 整合威胁情报3.3 最佳实践4. 威胁情报的作用5.威胁情报模型6.反杀链模型7.基于TI的局部优势模型参考文献相关的研究1.什么是威胁情报 威胁情报是循证知识,包括环境、机制、指标、意义和可行性…...

Javaweb学习(2)
Javaweb学习 一、Maven1.1 Maven概述1.2 Maven简介1.3、Maven基本使用1.4、IDEA配置Maven1.6、依赖管理&依赖范围 二、MyBatis2.1 MyBatis简介2.2 Mybatis快速入门2.3、解决SQL映射文件的警告提示2.4、Mapper代理开发 三、MyBaits核心配置文件四、 配置文件的增删改查4.1 M…...

leetcode410. 分割数组的最大值 动态规划
hard:https://leetcode.cn/problems/split-array-largest-sum/ 给定一个非负整数数组 nums 和一个整数 m ,你需要将这个数组分成 m 个非空的连续子数组。 设计一个算法使得这 m 个子数组各自和的最大值最小。 示例 1:输入:nums [7,2,5,1…...

C函数指针与类型定义
#include <stdio.h> #define PI 3.14 typedef int uint32_t; /* pfun is a pointer and its type is void (*)(void) */ void (*pfun)(void); /* afer typedef like this we can use “pfun1” as a data type to a function that has form like: / -------…...

最新2024届【海康威视】内推码【GTK3B6】
最新2024届【海康威视】内推码【GTK3B6】 【内推码使用方法】 1.请学弟学妹们登录校招官网,选择岗位投递简历; 2.投递过程中填写内推码完成内推步骤,即可获得内推特权。 内推码:GTK3B6 内推码:GTK3B6 内推码&…...

边写代码边学习之LSTM
1. 什么是LSTM 长短期记忆网络 LSTM(long short-term memory)是 RNN 的一种变体,其核心概念在于细胞状态以及“门”结构。细胞状态相当于信息传输的路径,让信息能在序列连中传递下去。你可以将其看作网络的“记忆”。理论上讲&a…...

Elasticsearch8.8.0 SpringBoot实战操作各种案例(索引操作、聚合、复杂查询、嵌套等)
Elasticsearch8.8.0 全网最新版教程 从入门到精通 通俗易懂 配置项目 引入依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency><dependency>&l…...

《MySQL高级篇》十五、其他数据库日志
文章目录 1. MySQL支持的日志1.1 日志类型1.2 日志的弊端 2. 慢查询日志(slow query log)3. 通用查询日志3.1 问题场景3.2 查看当前状态3.3 启动日志3.4 查看日志3.5 停止日志3.6 删除\刷新日志 4. 错误日志(error log)4.1 启动日志4.2 查看日志4.3 删除\刷新日志4.4 MySQL8.0新…...

【Linux】【预】配置虚拟机的桥接网卡+nfs
【Linux】【预】配置虚拟机的桥接网卡 1. 配置VM虚拟机的桥接网络2 配置Win10中的设置3.配置Linux中的IP4. 串口连接开发板,配置nfs5 修改网络文件6 验证nfs 是否成功总结 1. 配置VM虚拟机的桥接网络 右击设置,选择添加网络,按照如下顺序操作…...

【Android】Retrofit2和RxJava2新手快速上手
写这篇博客的目的 网上关于Retrofit2和RxJava2的博客特别多,但是内容特别复杂,一上来就讲解很高级的用法 其实我们没必要像高考做题家一样,把每个API都背的滚瓜烂熟 熟悉基本用法,高阶用法需要的时候再逐个了解就行了 因为博客…...

1.4 Nacos注册中心
目录 什么是Nacos Nacos下载和安装 下载和安装 启动 Nacos服务注册与发现 Nacos的服务分级存储模型 什么是分级存储模型 配置实例集群 配置同集群优先的负载均衡 权重配置 点击编辑按钮 配置所需的权重 环境隔离 创建namespace 什么是Nacos Nacoshttps://nacos.i…...

AOJ 2200 Mr. Rito Post Office 最短路径+动态规划+谨慎+思维
我写了好多注释,一看就能看懂,这个题目我想了6,7个小时,一开始忽略了船的位置和要把船安置的位置一致的情况,补上就对了。 #include <iostream> using namespace std; int inf 0x3f3f3f3f, num[1007], dp[1007…...

红米电视 ADB 安装 app 报错 failed to authenticate xxx:5555
开启电视开发者模式,允许安装未知来源应用及开启 ADB 调试电脑端下载 adb 工具 点击下载同一局域网的电脑使用 adb 工具连接(提前查看电视 IP)D:\adb>adb connect 192.168.1.7 * daemon not running; starting now at tcp:5037 * daemon s…...

Linux 下设置开机自启动的方法
文章目录 事先准备对于普通的 Linux对于 RedHat Enterprise Linux 9 笔者的运行环境: 设置成功过的 Linux: RedHat Enterprise Linux 9 x86_64 CentOS 8 x86_64 事先准备 进行这个教程之前,必须要先安装好一个 Linux 操作系统。这个 Linux…...

MySQL常见问题处理(三)
MySQL 常见问题解决 夕阳留恋的不是黄昏,而是朝阳 上一章简单介绍了MySQL数据库安装(二), 如果没有看过, 请观看上一章 一. root 用户密码忘记,进行重置操作 复制内容来源链接: https://blog.csdn.net/weixin_48927364/article/details/123556927 一.…...

maven中常见问题
文章目录 一、配置项提示二、父子打包三、打包之后不显示target四、自定义打包之后的jar包名称五、整个项目打包5.1、父项目管理插件和微服务打包 一、配置项提示 SpringBoot中提示错误信息 表示的是SpringBoot中的注释提示没有配置!那么可以来使用一下springboot官…...

vue2中bus的使用
说明:为了解决组件间的通信,也就是组件与组件间的数据传递(它们之间毫无关系); 这里以组件1传递数据到组件2为例 1.首先新建一个Bus.js文件 import Vue from vue const Bus new Vue() export default Bus 2.在组件1中引用 传递数据 imp…...

实证研究在机器学习中的应用
实证研究是一种基于实际数据和事实的科学研究方法,目的是通过观察、测量、分析和解释数据来验证或否定某个假设、理论或研究问题。这种研究方法通常用于社会科学、自然科学和医学等领域。以下是实证研究的详细解释: 研究目标:实证研究旨在通过…...

IO进程线程day8(2023.8.6)
一、Xmind整理: 管道的原理: 有名管道的特点: 信号的原理: 二、课上练习: 练习1:pipe 功能:创建一个无名管道,同时打开无名管道的读写端 原型: #include <unist…...

【5G NR】逻辑信道、传输信道和物理信道的映射关系
博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…...

tmux基础教程
tmux基础教程 Mac安装 brew install tmuxubuntu安装 sudo apt-get install tmux入门使用 会话 (Session) Ctrlb d: 分离当前会话。Ctrlb s: 列出所有会话。Ctrlb $: 重命名当前会话。 窗口(Window) Ctrlb c: 创建一个新窗口, 状态栏会显示多个窗…...