Java入坑之语法糖
一、for和for-each
1.1for和for-each概念
for 循环是一种常用的循环结构,它可以通过一个变量(通常是 i)来控制循环的次数和范围。for 循环的语法格式如下:
for (初始化; 布尔表达式; 更新) {//代码语句
}
for-each 循环是 Java 1.5 的新特性之一,它可以方便地遍历数组或集合中的元素,而不需要使用下标或迭代器。for-each 循环的语法格式如下:
for (元素类型t 元素变量x : 遍历对象obj) {//引用了x的java语句;
}
for 和 for-each 循环的效率和适用性取决于遍历对象的数据结构。一般来说,对于数组或 ArrayList 这样基于数组的数据结构,使用 for 循环更快,因为它可以直接通过下标访问元素,而不需要额外的对象创建和类型转换。对于 LinkedList 这样基于链表的数据结构,使用 for-each 循环更快,因为它可以直接获取元素的值,而不需要每次都调用 get 方法进行遍历。
1.2for-each优缺点

二、枚举
枚举是一种特殊的类,它用来表示一组有限的常量,比如季节、颜色、方向等。枚举可以提高代码的可读性和安全性,避免使用硬编码的字符串或整数来表示常量。枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。


Java的enum类型
-所有的enum类型都是Enum的子类,也继承了相应方法
- ordinal()返回枚举值所在的索引位置, 从0开始
// 定义一个枚举类型 Season,表示四个季节 enum Season {SPRING, SUMMER, AUTUMN, WINTER; }// 在主方法中,使用 values() 方法获取所有的枚举值,并打印出它们的 ordinal 值 public class Main {public static void main(String[] args) {// 获取所有的枚举值Season[] seasons = Season.values();// 遍历枚举值for (Season s : seasons) {// 打印出每个枚举值的 ordinal 值System.out.println(s + " 的 ordinal 值是 " + s.ordinal());}} } - compareTo()比较两个枚举值的索引位置大小
public class Test {public static void main(String[] args) {// 定义两个枚举值Season s1 = Season.SPRING;Season s2 = Season.WINTER;// 使用compareTo()方法比较它们的索引位置大小int result = s1.compareTo(s2);// 输出结果System.out.println(result); // -3} }// 定义一个枚举类Season enum Season {SPRING, SUMMER, AUTUMN, WINTER } - toString()返回枚举值的字符串表示
public class Test {public static void main(String[] args) {// 定义三个枚举值Color c1 = Color.RED;Color c2 = Color.GREEN;Color c3 = Color.BLUE;// 使用toString()方法获取它们的字符串表示System.out.println(c1.toString()); // 红色System.out.println(c2.toString()); // 绿色System.out.println(c3.toString()); // 蓝色} }// 定义一个枚举类Color,并重写toString()方法 enum Color {RED, GREEN, BLUE;@Overridepublic String toString() {switch (this) {case RED:return "红色";case GREEN:return "绿色";case BLUE:return "蓝色";default:return "未知颜色";}} } - valueOf()将字符串初始化为枚举对象
public class Test {public static void main(String[] args) {// 定义一个字符串String s = "GREEN";// 使用valueOf()方法将字符串转换为枚举值Color c = Color.valueOf(s);// 输出结果System.out.println(c); // GREEN} }// 定义一个枚举类Color enum Color {RED, GREEN, BLUE } - values()返回所有的枚举值
public class Test {public static void main(String[] args) {// 使用values()方法返回一个包含所有枚举值的数组Season[] seasons = Season.values();// 输出数组的长度和内容System.out.println(seasons.length); // 4for (Season season : seasons) {System.out.println(season); // SPRING, SUMMER, AUTUMN, WINTER}} }// 定义一个枚举类Season enum Season {SPRING, SUMMER, AUTUMN, WINTER }
三、不定项参数
Java不定项参数是一种可以接受不确定个数的同类型参数的方法,它可以用于简化方法的重载和数组的传递。不定项参数的语法是在参数类型后面加上三个点(…),表示该参数可以接受零到多个值,编译器会将这些值封装成一个数组传递给方法。
//定义一个不定项参数的方法,用于求和
public static int sum (int... nums) {int total = 0;for (int num : nums) {total += num;}return total;
}//调用不定项参数的方法,可以传入任意个数的int值
System.out.println (sum ()); //输出0
System.out.println (sum (1)); //输出1
System.out.println (sum (1, 2, 3)); //输出6
System.out.println (sum (new int [] {4, 5, 6})); //输出15,也可以直接传入一个数组

四、静态导入
静态导入是Java 5中引入的一种新特性,它可以让你在不使用类名的情况下,直接访问类中的静态成员变量和方法。静态导入的语法是:
import static package.ClassName.fieldName|methodName;
或者
import static package.ClassName.*;
第一种语法可以导入指定类中的某个静态成员变量或方法,第二种语法可以导入指定类中的所有静态成员变量和方法。例如,如果你想使用Math类中的PI常量和sqrt方法,你可以使用静态导入:
import static java.lang.Math.PI;
import static java.lang.Math.sqrt;

五、自动装箱和拆箱
自动装箱和拆箱是Java中的一种特性,它可以让基本数据类型和对应的包装类之间自动地相互转换。例如,int类型可以自动转换为Integer对象,Integer对象可以自动转换为int值。这样可以方便地在面向对象和基本类型之间进行切换,简化代码的编写。
六、多异常并列
多异常并列是Java 7中引入的一种特性,它可以让你在一个catch块中捕获多个不同类型的异常,并用同样的方式来处理它们。这样可以避免重复的代码和逻辑,简化异常处理的过程。
多异常并列使用时要注意以下几点:
- 一个catch块中只能有一个异常对象,不能写成catch (ExceptionType1 e1 | ExceptionType2 e2 | … e3)这样的形式。
- 多个异常类型之间不能有继承关系,否则会造成编译错误。例如,不能写成catch (IOException | FileNotFoundException e),因为FileNotFoundException是IOException的子类。
- 如果有多个catch块,那么多异常并列的catch块应该放在最前面,否则会被其他catch块覆盖。例如,不能写成catch (Exception e) {…} catch (NumberFormatException | ArithmeticException e) {…},因为Exception是所有异常的父类。
public class Test {public static void main(String[] args) {try {int a = Integer.parseInt("abc"); //可能抛出NumberFormatExceptionint b = 10 / 0; //可能抛出ArithmeticException} catch (NumberFormatException | ArithmeticException e) {//这个catch块可以捕获两种异常,并统一处理System.out.println("发生了数学错误:" + e.getMessage());} catch (Exception e) {//这个catch块可以捕获其他类型的异常,并单独处理System.out.println("发生了其他错误:" + e.getMessage());}}
}
上面的代码中,第一个catch块使用了多异常并列的语法,可以同时捕获NumberFormatException和ArithmeticException,并输出它们的信息。第二个catch块可以捕获其他类型的异常,并输出它们的信息。这样就可以避免重复的代码和逻辑,简化异常处理的过程。
如果你把两个catch块的顺序颠倒,那么就会造成编译错误,因为第一个catch块会捕获所有类型的异常,包括NumberFormatException和ArithmeticException,那么第二个catch块就永远不会被执行。这就违反了多态和重载的规则,所以编译器会提示错误。
七、整数类型用二进制表示
7.1二进制
7.2下划线
八、接口
8.1接口的默认方法
接口的默认方法是Java 8中引入的一种新特性,它可以让接口中定义一些带有具体实现的方法,而不需要实现类去实现这些方法。这样可以方便地为接口添加新的功能,而不影响已有的实现类。接口的默认方法的语法是在方法名前面加上default关键字,
public interface MyInterface {// 普通的抽象方法void abstractMethod();// 默认方法default void defaultMethod() {System.out.println("这是一个默认方法");}
}
接口的默认方法有以下几个作用:
- 兼容性:接口的默认方法可以让接口在不破坏现有代码的情况下,向后兼容地添加新的方法。这样就不需要修改所有实现了该接口的类,而只需要在需要的地方重写或调用默认方法即可。
- 多继承:接口的默认方法可以让一个类实现多个接口,而不用担心接口之间有相同的方法签名。如果一个类实现了多个接口,且这些接口有相同的默认方法,那么这个类必须重写这个默认方法,或者使用super关键字来指定调用哪个接口的默认方法。
- 扩展性:接口的默认方法可以让接口提供一些通用的功能,而不需要在每个实现类中重复编写相同的代码。例如,List接口中就提供了一个sort方法,它可以对列表进行排序,而不需要每个列表类都实现自己的排序算法。
8.2接口的静态方法
接口的静态方法是Java 8中引入的一种新特性,它可以让接口中定义一些带有具体实现的静态方法,而不需要实现类去调用这些方法。这样可以方便地为接口提供一些与接口相关的工具方法,或者一些通用的逻辑。接口的静态方法的语法是在方法名前面加上static关键字,例如:
public interface MyInterface {// 普通的抽象方法void abstractMethod();// 静态方法static void staticMethod() {System.out.println("这是一个静态方法");}
}
接口的静态方法有以下几个特点:
- 接口的静态方法只能通过接口名来调用,不能通过实现类或者实现类的对象来调用。例如,MyInterface.staticMethod(); 可以调用静态方法,但是 MyClass.staticMethod(); 或者 new MyClass().staticMethod(); 都会报错。
- 接口的静态方法不能被实现类继承或者重写,也不能被子接口继承或者重写。如果实现类或者子接口中定义了与接口中静态方法相同签名的方法,那么这个方法和接口中的静态方法没有任何关系,只是一个普通的方法。
- 接口的静态方法可以访问接口中定义的常量,但是不能访问接口中定义的抽象方法和默认方法。如果需要在静态方法中调用抽象方法或者默认方法,可以通过传入一个实现类的对象作为参数来实现。
8.3接口的私有方法
接口的私有方法是Java 9中引入的一种新特性,它可以让接口中定义一些带有具体实现的私有方法,而不需要实现类去实现或调用这些方法。这样可以方便地为接口提供一些与接口相关的工具方法,或者一些通用的逻辑。接口的私有方法的语法是在方法名前面加上private关键字,例如:
public interface MyInterface {// 普通的抽象方法void abstractMethod();// 私有方法private void privateMethod() {System.out.println("这是一个私有方法");}
}
接口的私有方法有以下几个作用:
- 封装性:接口的私有方法可以让接口中的一些细节或者辅助功能被隐藏起来,而不暴露给外部。这样可以保护接口的内部逻辑,避免被误用或者滥用。
- 复用性:接口的私有方法可以让接口中的一些重复或者相似的代码被抽取出来,而不需要在每个默认方法或者静态方法中重复编写。这样可以提高代码的复用性和可维护性。
- 灵活性:接口的私有方法可以让接口中的默认方法或者静态方法更加灵活和简洁,而不需要包含过多的代码或者逻辑。这样可以提高代码的可读性和可扩展性。
8.4接口与抽象类
补充:抽象类
Java抽象类是一种不能被实例化的类,它的作用是为了被其他类继承和实现它的抽象方法。抽象方法是一种只有声明没有具体实现的方法,它需要在子类中被重写。抽象类可以包含非抽象方法和属性,但至少要有一个抽象方法。在Java中,抽象类用abstract关键字来修饰,例如:
abstract class Animal { public abstract void eat(); // 抽象方法 public void sleep() { // 非抽象方法 System.out.println(“Animal is sleeping”); } }

如果类的所有方法都没有实现,那么这个类就算是接口interface。
九、try-with-resources
try-with-resources是Java 7中引入的一种特性,它可以让你在一个try语句中声明一个或多个需要关闭的资源,比如文件,流,套接字等。try-with-resources语句可以确保在语句结束后,每个资源都会被自动关闭,无论是否发生异常。这样可以避免手动关闭资源的麻烦,也可以避免资源泄漏的风险。
try-with-resources语句的语法是:
try (ResourceType resource = new ResourceType(...)) {// 使用资源的代码
} catch (ExceptionType e) {// 处理异常的代码
}
其中,ResourceType是要关闭的资源的类型,它必须实现AutoCloseable接口,这个接口只有一个方法close(),用于释放资源。resource是要关闭的资源的对象,它必须在try语句中声明和初始化。你可以在一个try语句中声明多个资源,只要用分号隔开即可。例如:
try (BufferedReader br = new BufferedReader(new FileReader("input.txt"));PrintWriter pw = new PrintWriter(new FileWriter("output.txt"))) {// 读写文件的代码
} catch (IOException e) {// 处理异常的代码
}
这样,无论读写文件的代码是否正常执行,br和pw都会被自动关闭。

十、ResourceBundle
ResourceBundle是Java中的一个类,它可以用于实现国际化(i18n)的功能,也就是让程序能够根据不同的语言和地区显示不同的信息。ResourceBundle可以从不同的文件中加载语言和地区相关的数据,比如属性文件(.properties)或者Java类文件(.java)。ResourceBundle可以根据用户的Locale(语言和地区)自动选择合适的文件,也可以手动指定要加载的文件。ResourceBundle可以通过键值对的方式存储和获取数据,也可以通过下标的方式存储和获取数据。ResourceBundle有两个常用的子类:PropertyResourceBundle和ListResourceBundle,分别对应属性文件和Java类文件。

10.1多语言支持
在Java程序中实现多语言支持的一种常用方法是使用ResourceBundle类,它可以从不同的文件中加载语言和地区相关的数据,比如属性文件(.properties)或者Java类文件(.java)。ResourceBundle类可以根据用户的Locale(语言和地区)自动选择合适的文件,也可以手动指定要加载的文件。ResourceBundle类可以通过键值对的方式存储和获取数据,也可以通过下标的方式存储和获取数据。
要使用ResourceBundle类,你需要按照以下步骤进行:
- 第一步,创建一个或多个资源文件,每个资源文件都有一个基名和一个本地信息的附加部分,比如messages_zh_CN.properties表示基名为messages,本地信息为zh_CN(简体中文)的属性文件。每个资源文件中都定义了一些键值对,用来存储不同语言的文本信息。例如:
username=用户名
password=密码
- 第二步,创建一个ResourceBundle对象,使用getBundle方法来加载资源文件,并传入基名和Locale对象。例如:
Locale locale = Locale.getDefault(); // 获取默认的语言和地区
ResourceBundle bundle = ResourceBundle.getBundle("messages", locale); // 加载资源文件
- 第三步,使用ResourceBundle对象的getString方法来获取指定键对应的值,并显示在程序中。例如:
String username = bundle.getString("username"); // 获取用户名对应的文本
String password = bundle.getString("password"); // 获取密码对应的文本
System.out.println(username + ": " + password); // 输出文本
十一、var类型
var类型是Java 10中引入的一种特性,它可以让你在声明局部变量时不需要显式地指定变量的类型,而是让编译器根据变量的初始值来推断变量的类型。var类型可以简化代码的编写,避免重复的类型名称,也可以用于处理匿名类型或者复杂的表达式。不过,var类型也有一些限制和注意事项,比如只能用于局部变量,不能用于类的成员变量,必须在声明时赋初始值,不能赋null值,不能用于多个变量的声明等等。



十二、Switch

相关文章:
Java入坑之语法糖
一、for和for-each 1.1for和for-each概念 for 循环是一种常用的循环结构,它可以通过一个变量(通常是 i)来控制循环的次数和范围。for 循环的语法格式如下: for (初始化; 布尔表达式; 更新) {//代码语句 }for-each 循环是 Java …...
VUE响应式
响应式 :::tip 提示 我们了解过响应式可以同步更新数据和视图,但是其工作原理我们最好也要了解一下。这样当你使用时遇到一些常见的错误,也能够快速定位是什么问题导致的。 了解响应式原理之前,你必须要先去了解 ES5 的 Object.defineProper…...
Godot 和 VScode配置C#环境注意事项
前言 尽管有些博主会建议如果我们熟悉C#的话,最好还是使用GDscript,而且对于小白上手也相对简单,但是C#的性能终究还是比动态语言好,也相比CPP简单些,尽管现在Godot还是有些问题,比如不像unity那样适配swit…...
三、Mediasoup进程通信实现的原理
Mediasoup 创建父子进程,js与c进程交互的通道 worker.js构造函数中创建父子进程,c通过libuv的socket可以实现 JavaScript 与 C 之间的相互收发消息 一、 父子进程通信 这是一个简单的示例,演示了如何使用 libuv 在父子进程之间进行通信。以…...
【计算机网络】 TCP——四次挥手
文章目录 流程考点 流程 主动方打算关闭连接,此时会发送一个TCP首部FIN标志位被置为1的报文,也即FIN报文,之后主动方进入FIN_WAIT_1状态。被动方收到该报文后,就向主动方发送ACK应答报文,接着被动方进入CLOSE_WAIT状态…...
「Java开发指南」在MyEclipse中的Spring开发(二)
在上文中(点击这里回顾>>),我们主要介绍了一些Spring的基本概念、Spring项目配置及向导,本章节将继续介绍如何管理多个项目,Spring配置编辑器等,欢迎持续关注~ MyEclipse v2023.1.2离线版下载(Q技术…...
策略模式,一种广泛应用于各种情况的设计模式(设计模式与开发实践 P5)
文章目录 策略模式实现思想实战 - 表单 策略模式 定义:定义一系列算法,把它们一个个封装起来,并且可以互相替换 例如,我们要计算年终奖,年终奖根据绩效 A、B、C 来计算最终数值 实现 最初我们很容易想到用 分支 if…...
90. 子集 II
给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。 示例 1: 输入:nums [1,2,2] 输出…...
Intel汇编语言程序设计(第7版)第四章编程练习题答案
1. 大端序转成小端序 .386 .model flat, stdcall option casemap:none include windows.inc include kernel32.inc includelib kernel32.lib include user32.inc includelib user32.lib.stack 4096.data bigEndian BYTE 12h, 34h, 56h, 78h littleEndian DWORD ?Fmt BYTE &…...
EDA(Exploratory Data Analysis)探索性数据分析
EDA(Exploratory Data Analysis)中文名称为探索性数据分析,是为了在特征工程或模型开发之前对数据有个基本的了解。数据类型通常分为两类:连续类型和离散类型,特征类型不同,我们探索的内容也不同。 1. 特征类型 1.1 连续型特征 …...
Python中的多媒体处理库有哪些?
在Python中,有几个常用的多媒体处理库,包括: Pillow - 一个强大的图像处理库,可以进行图像的读取、保存、剪裁、调整大小、滤镜处理等操作。 OpenCV - 一个用于图像和视频处理的开源计算机视觉库,提供了许多图像处理和…...
LeetCode【28. 找出字符串中第一个匹配项的下标】
不要用珍宝装饰自己,而要用健康武装身体 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 …...
产业互联网开始从简单的概念,逐渐成为可以落地的存在
当流量不再是红利,几乎所有的消费互联网模式开始失效。这一现象,并不仅仅只是体现在流量获取成本的不断增加上,同样还体现在流量激活的难度不断增加上。事实证明,以产业链末端为主要驱动力的发展模式,正在走入到死胡同…...
element-ui tree组件实现在线增删改
这里要实现一个tree 增删改 <!--oracle巡检项--> <template><div class"oracle_instanceType"><el-row type"flex" align"middle" justify"space-between"><iclass"el-icon-s-fold iBox"click&q…...
华为开源自研AI框架昇思MindSpore应用案例:消噪的Diffusion扩散模型
目录 一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例 二、案例实现构建Diffusion模型位置向量ResNet/ConvNeXT块Attention模块组归一化条件U-Net正向扩散数据准备与处理采样训练过程推理过程(从模型中采样) 本文基于Hugging Face&#x…...
华为CD32键盘使用教程
华为CD32键盘使用教程 用爱发电写的教程! 最后更新时间:2023.9.12 型号:华为有线键盘CD32 基本使用 此键盘在不安装驱动的情况下可以直接使用,但是不安装驱动指纹识别是无法使用的!并且NFC功能只支持华为的部分电脑…...
第三节:在WORD为应用主窗口下关闭EXCEL的操作(2)
【分享成果,随喜正能量】凡事好坏,多半自作自受,既不是神为我们安排,也不是天意偏私袒护。业力之前,机会均等,毫无特殊例外;好坏与否,端看自己是否能应机把握,随缘得度。…...
Layui + Flask | 弹出层(组件篇)(04)
提示:点击阅读原文体验更佳 https://layui.dev/docs/2.8/layer/ 弹出层组件 layer 是 Layui 最古老的组件,也是使用覆盖面最广泛的代表性组件。在实现网页弹出层的首选交互方案,使用的非常频繁。 打开弹层 layer.open(options); 参数 options : 基础属性配置项。打开弹层的核…...
Electron和vue3集成(推荐仅用于开发)
本篇我们仅实现Electron和vue3通过先运行起vue3项目,再将vue3的url地址交由Electron打开的方案,仅由Electron在vue3项目上套一层壳来达到脱离本机浏览器运行目的 1、参考快速上手 | Vue.js搭建起vue3初始项目 npm install -g vue npm install -g vue/c…...
Vue.js和TypeScript:如何完美结合
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
