小编给大家分享一下GO语言ini配置文件的读取操作示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!go适合做什么go是golang的简称,而golang可以做服务器端开发,且golang很适合做日志处理、数据打包、虚拟机处理、数据库代理等工作。在网络编程方面,它还广泛应用于web应用、API应用等领域。iniconf描述使用iniconf更简单的读取go的ini配置文件以及根据特定格式的各种配置文件。安装方法go get github.com/clod-moon/goconf使用方法ini配置文件格式样列[database]username = rootpassword = passwordhostname = localhost[admin]username = rootpassword = password[nihao]username = rootpassword = password初始化conf := goini.InitConfig("./conf/conf.ini") //iniconf.InitConfig(filepath) 其中filepath是你ini 配置文件的所在位置获取单个配置信息username := conf.GetValue("database", "username") //database是你的[section],username是你要获取值的key名称fmt.Println(username) //root删除一个配置信息conf.DeleteValue("database", "username") //username 是你删除的keyusername = conf.GetValue("database", "username")if len(username) == 0 { fmt.Println("username is not exists") //this stdout username is not exists}添加一个配置信息conf.SetValue("database", "username", "chun") username = conf.GetValue("database", "username") fmt.Println(username) //chun 添加配置信息如果存在[section]则添加或者修改对应的值,如果不存在则添加section获取所有配置信息conf.GetAllSetion() //返回map[string]map[string]string的格式 即setion=>key->valueiniconfAbout使用iniconf更简单的读取go的ini配置文件以及根据特定格式的各种配置文件。examplefunc main() { conf := iniconf.InitConfig("./config.ini") for key,value :=range conf.Conflist { fmt.Println(key) for k,v := range value{ fmt.Println(k,":",v) } } fmt.Println(conf.GetValue("esinfo","addr")) conf.SetValue("esinfo","addr","127.100.100.100") fmt.Println(conf.GetValue("esinfo","addr")) }outputesinfoaddr : 127.0.0.1port : 9200index : casetype : case127.0.0.1127.100.100.100Process finished with exit code 0补充:GoLang 使用goconfig读取配置文件(.ini、.json、.yaml)一、goconfig读取.ini类型配置文件1、配置文件(config.ini)如下:[RabbitMQ]MQUrl = amqp://trkj:trkj@192.168.5.62:5672/testExchange = EX.WALLDATAExchangeType = fanoutRoutingKey = RK.WALLDATA [Base]messageFrequency = 52、解析配置文件:package main import ( "fmt" "github.com/hyahm/goconfig") type RabbitMQ struct { MQUrl string Exchange string ExchangeType string RoutingKey string} type BaseConfig struct { MsgFrequency int64 // 消息发送频率 RabbitMQ // MQ信息} func ReadBaseConfig(bconfig *BaseConfig, confFile string) { goconfig.InitConf(confFile, goconfig.INI) bconfig.MsgFrequency = goconfig.ReadInt64("Base.messageFrequency", 3) bconfig.RabbitMQ.MQUrl = goconfig.ReadString("RabbitMQ.MQUrl", "") bconfig.RabbitMQ.Exchange = goconfig.ReadString("RabbitMQ.Exchange", "") bconfig.RabbitMQ.ExchangeType = goconfig.ReadString("RabbitMQ.ExchangeType", "") bconfig.RabbitMQ.RoutingKey = goconfig.ReadString("RabbitMQ.RoutingKey", "") } func main() { baseConfig := BaseConfig{} ReadBaseConfig(&baseConfig, "./Config.ini") fmt.Printf("mq.MQUrl = %s \t mq.Exchange = %s \t mq.ExchangeType = %s \t mq.RoutingKey = %s\n", baseConfig.RabbitMQ.MQUrl, baseConfig.RabbitMQ.Exchange, baseConfig.RabbitMQ.ExchangeType, baseConfig.RabbitMQ.RoutingKey) fmt.Printf("msgFrequency = %d\n", baseConfig.MsgFrequency) }以上是“GO语言ini配置文件的读取操作示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注辰讯云资讯频道!...
这篇文章给大家分享的是有关android studio如何打包自动生成版本号与日期的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。一. 打开项目选择如图示1 (build.gradle 项目位置)二. 1. build.gradle 文件添加内容如下。gradle是【com.android.tools.build:gradle:3.0.0 以下版本】android{ defaultConfig {...} 自动追加版本号和版本名称 android.applicationVariants.all { variant->variant.outputs.each { output-> output.outputFile = new File(output.outputFile.parent,"app_device_v"+defaultConfig.versionName+"_"+new Date().format("yyyy-MM-dd")+"_"+buildType.name+".apk") } } }output.outputFile.parent 可以指定输出到指定文件夹2. build.gradle 文件添加内容如下。 gradle是【com.android.tools.build:gradle:3.0.0及其以上版本】android{ defaultConfig {...} //release版本输出包名自动追加版本号和版本名称 applicationVariants.all { variant -> variant.outputs.all { //只处理生产版本 if (buildType.name == 'release') { def createTime = new Date().format("YYYY-MM-dd", TimeZone.getTimeZone("GMT+08:00")) // app包名称 outputFileName = "app_v" + defaultConfig.versionName + "_" + createTime + "_" + buildType.name + ".apk" ////指定release输出到指定文件夹 variant.getPackageApplication().outputDirectory = new File(config.appReleaseDir + "/${createTime}") } } } }三. 打包查看结果:图示3(直接点击assembleRelease即可)补充知识:Android编译gradle 动态修改版本号在构建代码的时候不想每次都修改版本号,需能够增加一个功能在特定的条件下动态的修改版本号在manifest里面加入占位符号<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="${versioncode}" android:versionName="${versionname}">修改build.gradleimport com.google.gson.Gsonclass Version { int versionCode String versionName } def versionJsonFile = file('./version.json')//这个文件最好放一个所有项目人员都能够访问的地方 def versionJsonObject = new Gson().fromJson(versionJsonFile.text, Version.class) android.applicationVariants.all { variant -> println("variants name : " + variant.name) //只有满足特定条件的情况下才会版本自增一,这个可以看看各个项目的特定配置 if (variant.name.toLowerCase().contains("ceshirelease") ) { println("variants name : versionCode " + versionJsonObject.versionCode + "versionname: " + versionJsonObject.versionName) versionJsonObject.versionCode = versionJsonObject.versionCode + 1 int lastIndexPoint = versionJsonObject.versionName.lastIndexOf(".") String newStr = versionJsonObject.versionName.substring(0, lastIndexPoint) println("newStr" + newStr) versionJsonObject.versionName = newStr + "." + versionJsonObject.versionCode println("versonJsonStr.versionName " + versionJsonObject.versionName) } //这句是核心,可以调整版本号和版本明,修改了这个会影响到BuildConfig.class里面的属性 variant.mergedFlavor.versionCode = versionJsonObject.versionCode variant.mergedFlavor.versionName = versionJsonObject.versionName //如果没有加下面这句,当应用安装后会出现应用信息没有版本号的问题,这个必须有 variant.mergedFlavor.manifestPlaceholders.put("versioncode", versionJsonObject.versionCode) variant.mergedFlavor.manifestPlaceholders.put("versionname", versionJsonObject.versionName) } //为了记住最新的版本号,是需要进行文件的回写的,什么时候回写会好一点 //个人认为只有当打包apk的动作执行成功后 回写文件记录的版本号最优 afterEvaluate { project -> gradle.taskGraph.afterTask { task, taskState -> //这里如果assembleceshirelease 就具体的打包的变种项目,各个应用肯定不一样,需要调整下 if (task.name.toLowerCase().contains("assembleceshirelease") && taskState.getFailure() == null) { println("try assemble ceshi release" ) //回写文件操作 versionJsonFile.withPrintWriter { out -> out.println(new Gson().toJson(versionJsonObject)) } } } }给apk重新命名也是同样的道理 variant.getOutputs().all { File file = it.outputFile; println(" file property file.canRead() " + file.canRead() + " file.canWrite " + file.canWrite()) String pathString = file.getPath(); println(" path String : " + pathString + " File.pathSeparator: " + File.separator) //指定最终输出的文件的目录和名字 pathString = file.getParent() + File.separator + "test.apk"; println(" path pathString : " + pathString) file.renameTo(pathString) }感谢各位的阅读!关于“android studio如何打包自动生成版本号与日期”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!...
这篇文章主要介绍Android Gradle依赖管理、去除重复依赖、忽略的方式有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。常用依赖 //1.直接依赖第三方开源库,一般是托管在 jitpack 或者 jcenter implementation 'com.google.code.gson:gson:2.2.4' implementation 'com.android.support:cardview-v7:25.0.0' implementation 'com.android.support:design:25.0.0' //2.直接依赖本地的aar文件,一般是在libs目录下 implementation(name: 'LiteAVSDK_Professional_5.1.5293', ext: 'aar') //3.直接依赖本地的jar文件 implementation files('libs/bdasr_V3_20170801_60da871.jar') //4.依赖本地的model implementation project(':wavelibrary') implementation project(':android-ffmpeg')库工程依赖传递问题1、依赖常用的基本类型有:provided和compile,provided 只在编译生效不会打包到 apk 或 aar 中;compile 是会打包到 apk或 aar 中的(如果是库工程的话有特殊情况,参考下面3).2、app 工程的当前(compile+) 的依赖都会打包到 app 中3、库工程中:1) jar 包:远程依赖不会打包到 aar 中;本地依赖会;2) aar:远程和本地都不不会打包到 aar中.3) 如果你要提供你的库工程的 aar 给他人,你需要同时告诉他这个库工程依赖的其他aar 和远程 jar包(因为他们没有打包到 aar 中)4) 如果通过工程依赖(即compile project(':lib')的方式), 依赖是可以传递的,所以不需要在声明一次依赖.去掉重复依赖1.第三方库中同样使用了implementation或者compile依赖相同的库 implementation('com.allenliu.versionchecklib:library:2.0.5') { exclude group: 'com.android.support', module: 'appcompat-v7' exclude group: 'com.android.support.constraint', module: 'constraint-layout' exclude group: 'org.greenrobot', module: 'eventbus' exclude group: 'com.squareup.okhttp3', module: 'okhttp' }2.在不同的库中出现相同的so文件pickFirst只会打包第一个遇到的冲突的so,merge(碰到冲突会合并)和exclude(直接排除匹配到的文件,不建议使用) packagingOptions { pickFirst 'lib/arm64-v8a/libgnustl_shared.so' pickFirst 'lib/armeabi-v7a/libgnustl_shared.so' }遇到这种错误可以通过上面方法尝试解决Error:Execution failed for task ‘:app:transformNativeLibsWithMergeJniLibsForDebug'. > More than one补充知识:Gradle依赖的统一管理,解决依赖冲突看见别人在用implementation rootProject.ext.dependencies["xxxx"]不知道是什么意思,上网查了一下,原来是为了解决或者说预防gradle依赖冲突的问题。在项目开发中我们会经常引入多个Module,然而每个Module中又包含了V4、V7,为了升级新版本依赖包只用更改一次,我们决定采用Gradle依赖的统一管理,避免重复繁琐的劳动。记录get到的新知识,用法如下:1.在Project目录下新建config.gradle文件,文件名可自定义具体内容如下:ext { android = [ compileSdkVersion : 27, buildToolsVersion : "27.0.0", minSdkVersion : 21, targetSdkVersion : 27, versionCode : 6, versionName : "1.2.2", renderscriptTargetApi : 21 ] version = [ supportLibraryVersion : "26.1.1", okhttpVersion : "3.9.0", retrofitVersion : "2.3.0", glideVersion : "4.0.0", butterknifeVersion : "8.8.1", fragmentationVersion : "1.1.9", ] dependencies = [ //base "appcompat-v7" : "com.android.support:appcompat-v7:${version["supportLibraryVersion"]}", "cardview-v7" : "com.android.support:cardview-v7:${version["supportLibraryVersion"]}", "design" : "com.android.support:design:${version["supportLibraryVersion"]}", "constraint-layout" : "com.android.support.constraint:constraint-layout:1.0.2", //net "gson" : "com.google.code.gson:gson:2.8.2", "okhttp" : "com.squareup.okhttp3:okhttp:${version["okhttpVersion"]}", "logging-interceptor" : "com.squareup.okhttp3:logging-interceptor:${version["okhttpVersion"]}", "retrofit" : "com.squareup.retrofit2:retrofit:${version["retrofitVersion"]}", "converter-gson" : "com.squareup.retrofit2:converter-gson:${version["retrofitVersion"]}", "adapter-rxjava2" : "com.squareup.retrofit2:adapter-rxjava2:${version["retrofitVersion"]}", //dao "greendao" : "org.greenrobot:greendao:3.2.2", //rx "rxjava" : "io.reactivex.rxjava2:rxjava:2.1.5", "rxandroid" : "io.reactivex.rxjava2:rxandroid:2.0.1", "rxbinding" : "com.jakewharton.rxbinding2:rxbinding:2.1.0", "rxpermissions" : "com.tbruyelle.rxpermissions2:rxpermissions:0.9.5@aar", //di "javax_annotation" : "org.glassfish:javax.annotation:10.0-b28", "butterknife" : "com.jakewharton:butterknife:${version["butterknifeVersion"]}", "butterknife-compiler" : "com.jakewharton:butterknife-compiler:${version["butterknifeVersion"]}", //multidex "multidex" : "com.android.support:multidex:1.0.3", //kotlin "kotlin-stdlib" : "org.jetbrains.kotlin:kotlin-stdlib:1.2.10", //ui test "espresso-core" : "com.android.support.test.espresso:espresso-core:3.0.2", "espresso-idling-resource" : "com.android.support.test.espresso:espresso-idling-resource:3.0.2", //unit test , 为了整合mockito和PowerMockito,mockito暂时最高只支持2.8.9 "junit" : "junit:junit:4.12", "mockito" : "org.mockito:mockito-core:2.8.9", "powermock-module-junit4" : "org.powermock:powermock-module-junit4:1.7.4" ] }2.在Project的build.gradle中添加apply from: "config.gradle"3.在modle的build.gradle中添加引用apply plugin: 'com.android.application'android { compileSdkVersion rootProject.ext.android["compileSdkVersion"] buildToolsVersion rootProject.ext.android["buildToolsVersion"] defaultConfig { applicationId "json.chao.com.wanandroid" minSdkVersion rootProject.ext.android["minSdkVersion"] targetSdkVersion rootProject.ext.android["targetSdkVersion"] versionCode rootProject.ext.android["versionCode"] versionName rootProject.ext.android["versionName"] //AndroidJunitRunner必须要显示指定在defaultConfig中,使用Gradle依赖管理无法使其生效 testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner' renderscriptTargetApi rootProject.ext.android["renderscriptTargetApi"] renderscriptSupportModeEnabled true // Enable RS support multiDexEnabled true vectorDrawables.useSupportLibrary = true } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //base implementation rootProject.ext.dependencies["appcompat-v7"] implementation rootProject.ext.dependencies["cardview-v7"] implementation rootProject.ext.dependencies["design"] implementation rootProject.ext.dependencies["constraint-layout"] //net implementation rootProject.ext.dependencies["gson"] implementation rootProject.ext.dependencies["okhttp"] implementation rootProject.ext.dependencies["retrofit"] implementation rootProject.ext.dependencies["converter-gson"] implementation rootProject.ext.dependencies["adapter-rxjava2"] //dao implementation rootProject.ext.dependencies["greendao"] //rx implementation rootProject.ext.dependencies["rxjava"] implementation rootProject.ext.dependencies["rxandroid"] implementation rootProject.ext.dependencies["rxbinding"] implementation rootProject.ext.dependencies["rxpermissions"] //UI测试 androidTestImplementation (rootProject.ext.dependencies["espresso-core"]) { exclude group: 'com.android.support', module: 'support-annotations' } implementation (rootProject.ext.dependencies["espresso-idling-resource"]) { exclude module: 'support-annotations' } }以上是“Android Gradle依赖管理、去除重复依赖、忽略的方式有哪些”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注辰讯云资讯频道!...
小编给大家分享一下Linux如何使用ss命令查看系统的socket状态,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是Linux系统Linux是一种免费使用和自由传播的类UNIX操作系统,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统,使用Linux能运行主要的Unix工具软件、应用程序和网络协议。 Linux系统中,ss命令可用于查看系统的socket的状态,而socket作为系统的进程通信机制,了解其状态是很有必要的,下面小编就给大家介绍下Linux如何使用ss命令查看socket的状态。 ss是Socket Statistics的缩写。顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。可能你不会有切身的感受,但请相信我,当服务器维持的连接达到上万个的时候,使用netstat等于浪费 生命,而用ss才是节省时间。天下武功唯快不破。ss快的秘诀在于,它利用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux 内核中第一手的信息,这就确保了ss的快捷高效。当然,如果你的系统中没有tcp_diag,ss也可以正常运行,只是效率会变得稍慢。(但仍然比 netstat要快。) 1.命令格式: ss [参数] ss [参数] [过滤] 2.命令功能: ss(Socket Statistics的缩写)命令可以用来获取 socket统计信息,此命令输出的结果类似于 netstat输出的内容,但它能显示更多更详细的 TCP连接状态的信息,且比 netstat 更快速高效。它使用了 TCP协议栈中 tcp_diag(是一个用于分析统计的模块),能直接从获得第一手内核信息,这就使得 ss命令快捷高效。在没有 tcp_diag,ss也可以正常运行。 3.命令参数: -h, --help 帮助信息 -V, --version 程序版本信息 -n, --numeric 不解析服务名称 -r, --resolve 解析主机名 -a, --all 显示所有套接字(sockets) -l, --listening 显示监听状态的套接字(sockets) -o, --options 显示计时器信息 -e, --extended 显示详细的套接字(sockets)信息 -m, --memory 显示套接字(socket)的内存使用情况 -p, --processes 显示使用套接字(socket)的进程 -i, --info 显示 TCP内部信息 -s, --summary 显示套接字(socket)使用概况 -4, --ipv4 仅显示IPv4的套接字(sockets) -6, --ipv6 仅显示IPv6的套接字(sockets) -0, --packet 显示 PACKET 套接字(socket) -t, --tcp 仅显示 TCP套接字(sockets) -u, --udp 仅显示 UCP套接字(sockets) -d, --dccp 仅显示 DCCP套接字(sockets) -w, --raw 仅显示 RAW套接字(sockets) -x, --unix 仅显示 Unix套接字(sockets) -f, --family=FAMILY 显示 FAMILY类型的套接字(sockets),FAMILY可选,支持 unix, inet, inet6, link, netlink -A, --query=QUERY, --socket=QUERY QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY] -D, --diag=FILE 将原始TCP套接字(sockets)信息转储到文件 -F, --filter=FILE 从文件中都去过滤器信息 FILTER := [ state TCP-STATE ] [ EXPRESSION ] 4.使用实例: 实例1:显示TCP连接 命令:ss -t -a 输出: 代码如下: [root@localhost ~]# ss -t -a State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 0 127.0.0.1:smux *:* LISTEN 0 0 *:3690 *:* LISTEN 0 0 *:ssh *:* ESTAB 0 0 192.168.120.204:ssh 10.2.0.68:49368 [root@localhost ~]# 实例2:显示 Sockets 摘要 命令:ss -s 输出: 代码如下: [root@localhost ~]# ss -s Total: 34 (kernel 48) TCP: 4 (estab 1, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 3《/p》 《p》Transport Total IP IPv6 * 48 - - RAW 0 0 0 UDP 5 5 0 TCP 4 4 0 INET 9 9 0 FRAG 0 0 0 [root@localhost ~]# 说明:列出当前的established, closed, orphaned and waiting TCP sockets 实例3:列出所有打开的网络连接端口 命令:ss -l 输出: 代码如下: [root@localhost ~]# ss -l Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 127.0.0.1:smux *:* 0 0 *:3690 *:* 0 0 *:ssh *:* [root@localhost ~]# 实例4:查看进程使用的socket 命令:ss -pl 输出: 代码如下: [root@localhost ~]# ss -pl Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 127.0.0.1:smux *:* users:((“snmpd”,2716,8)) 0 0 *:3690 *:* users:((“svnserve”,3590,3)) 0 0 *:ssh *:* users:((“sshd”,2735,3)) [root@localhost ~]# 实例5:找出打开套接字/端口应用程序 命令:ss -lp | grep 3306 输出: 代码如下: [root@localhost ~]# ss -lp|grep 1935 0 0 *:1935 *:* users:((“fmsedge”,2913,18)) 0 0 127.0.0.1:19350 *:* users:((“fmsedge”,2913,17)) [root@localhost ~]# ss -lp|grep 3306 0 0 *:3306 *:* users:((“mysqld”,2871,10)) [root@localhost ~]# 实例6:显示所有UDP Sockets 命令:ss -u -a 输出: 代码如下: [root@localhost ~]# ss -u -a State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 127.0.0.1:syslog *:* UNCONN 0 0 *:snmp *:* ESTAB 0 0 192.168.120.203:39641 10.58.119.119:domain [root@localhost ~]# 实例7:显示所有状态为established的SMTP连接 命令:ss -o state established ‘( dport = :smtp or sport = :smtp )’ 输出: 代码如下: [root@localhost ~]# ss -o state established ‘( dport = :smtp or sport = :smtp )’ Recv-Q Send-Q Local Address:Port Peer Address:Port [root@localhost ~]# 实例8:显示所有状态为Established的HTTP连接 命令:ss -o state established ‘( dport = :http or sport = :http )’ 输出: 代码如下: [root@localhost ~]# ss -o state established ‘( dport = :http or sport = :http )’ Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 75.126.153.214:2164 192.168.10.42:http [root@localhost ~]# 实例9:列举出处于 FIN-WAIT-1状态的源端口为 80或者 443,目标网络为 193.233.7/24所有 tcp套接字 命令:ss -o state fin-wait-1 ‘( sport = :http or sport = :https )’ dst 193.233.7/24 实例10:用TCP 状态过滤Sockets: 命令: 代码如下: ss -4 state FILTER-NAME-HERE ss -6 state FILTER-NAME-HERE 输出: 代码如下: [root@localhost ~]#ss -4 state closing Recv-Q Send-Q Local Address:Port Peer Address:Port 1 11094 75.126.153.214:http 192.168.10.42:4669 说明: FILTER-NAME-HERE 可以代表以下任何一个: 代码如下: established syn-sent syn-recv fin-wait-1 fin-wait-2 time-wait closed close-wait last-ack listen closing all : 所有以上状态 connected : 除了listen and closed的所有状态 synchronized :所有已连接的状态除了syn-sent bucket : 显示状态为maintained as minisockets,如:time-wait和syn-recv. big : 和bucket相反。 实例11:匹配远程地址和端口号 命令: 代码如下: ss dst ADDRESS_PATTERN ss dst 192.168.1.5 ss dst 192.168.119.113:http ss dst 192.168.119.113:smtp ss dst 192.168.119.113:443 输出: 代码如下: [root@localhost ~]# ss dst 192.168.119.113 State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.119.103:16014 192.168.119.113:20229 ESTAB 0 0 192.168.119.103:16014 192.168.119.113:61056 ESTAB 0 0 192.168.119.103:16014 192.168.119.113:61623 ESTAB 0 0 192.168.119.103:16014 192.168.119.113:60924 ESTAB 0 0 192.168.119.103:16050 192.168.119.113:43701 ESTAB 0 0 192.168.119.103:16073 192.168.119.113:32930 ESTAB 0 0 192.168.119.103:16073 192.168.119.113:49318 ESTAB 0 0 192.168.119.103:16014 192.168.119.113:3844 [root@localhost ~]# ss dst 192.168.119.113:http State Recv-Q Send-Q Local Address:Port Peer Address:Port [root@localhost ~]# ss dst 192.168.119.113:3844 State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.119.103:16014 192.168.119.113:3844 [root@localhost ~]# 实例12:匹配本地地址和端口号 命令: 代码如下: ss src ADDRESS_PATTERN ss src 192.168.119.103 ss src 192.168.119.103:http ss src 192.168.119.103:80 ss src 192.168.119.103:smtp ss src 192.168.119.103:25 输出: 代码如下: [root@localhost ~]# ss src 192.168.119.103:16021 State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.119.103:16021 192.168.119.201:63054 ESTAB 0 0 192.168.119.103:16021 192.168.119.201:62894 ESTAB 0 0 192.168.119.103:16021 192.168.119.201:63055 ESTAB 0 0 192.168.119.103:16021 192.168.119.201:2274 ESTAB 0 0 192.168.119.103:16021 192.168.119.201:44784 ESTAB 0 0 192.168.119.103:16021 192.168.119.201:7233 ESTAB 0 0 192.168.119.103:16021 192.168.119.103:58660 ESTAB 0 0 192.168.119.103:16021 192.168.119.201:44822 ESTAB 0 0 192.168.119.103:16021 10.2.1.206:56737 ESTAB 0 0 192.168.119.103:16021 10.2.1.206:57487 ESTAB 0 0 192.168.119.103:16021 10.2.1.206:56736 ESTAB 0 0 192.168.119.103:16021 10.2.1.206:64652 ESTAB 0 0 192.168.119.103:16021 10.2.1.206:56586 ESTAB 0 0 192.168.119.103:16021 10.2.1.206:64653 ESTAB 0 0 192.168.119.103:16021 10.2.1.206:56587 [root@localhost ~]# 实例13:将本地或者远程端口和一个数比较 命令: 代码如下: ss dport OP PORT ss sport OP PORT 输出: 代码如下: [root@localhost ~]# ss sport = :http [root@localhost ~]# ss dport = :http [root@localhost ~]# ss dport \》 :1024 [root@localhost ~]# ss sport \》 :1024 [root@localhost ~]# ss sport \《 :32000 [root@localhost ~]# ss sport eq :22 [root@localhost ~]# ss dport != :22 [root@localhost ~]# ss state connected sport = :http [root@localhost ~]# ss \( sport = :http or sport = :https \) [root@localhost ~]# ss -o state fin-wait-1 \( sport = :http or sport = :https \) dst 192.168.1/24 说明: ss dport OP PORT 远程端口和一个数比较;ss sport OP PORT 本地端口和一个数比较。 OP 可以代表以下任意一个: 《= or le : 小于或等于端口号 》= or ge : 大于或等于端口号 == or eq : 等于端口号 != or ne : 不等于端口号 《 or gt : 小于端口号 》 or lt : 大于端口号 实例14:ss 和 netstat 效率对比 命令: 代码如下: time netstat -at time ss 输出: 代码如下: [root@localhost ~]# time ss real 0m0.739s user 0m0.019s sys 0m0.013s [root@localhost ~]# [root@localhost ~]# time netstat -at real 2m45.907s user 0m0.063s sys 0m0.067s [root@localhost ~]# 说明: 用time 命令分别获取通过netstat和ss命令获取程序和概要占用资源所使用的时间。在服务器连接数比较多的时候,netstat的效率完全没法和ss比。以上是“Linux如何使用ss命令查看系统的socket状态”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注辰讯云资讯频道!...
这篇文章给大家分享的是有关linux如何使用cat命令查看文件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是Linux系统Linux是一种免费使用和自由传播的类UNIX操作系统,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统,使用Linux能运行主要的Unix工具软件、应用程序和网络协议。Linux系统中查看文件内容时,可以使用cat命令来查看,但是cat命令一般只适合查看文件内容较少的文件。1、cat命令的语法格式为:cat [参数] [文件]对于一般的查看,可以直接使用cat 文件名的方式,比如说查看yum.conf文件。命令为:cat yum.conf2、如果需要显示文件内容的行数,可以使用参数-n命令为:cat -n yum.conf3、-n参数会对文件的每行内容都编制一个编号,及时是空行。如果需要多个空行算为一个编号,可以使用-s参数命令为:cat -s yum.conf4、如果显示文件内容要求不对空行编号,可以使用命令-b命令为:cat -b yum.conf5、有的时候为了区分每行的结束部分,可以使用命令-E,在每行结束出显示$符号命令为:cat -E yum.conf6、在特殊情况下,需要将TAB字符显示为 ^I符号,可以使用参数-T命令为:cat -T yum.conf7、如果需要查看cat的具体用法,可以使用命令–help显示帮助信息命令为:cat --help或者cat --h8、可以使用参数-version查看版本信息命令为:cat version感谢各位的阅读!关于“linux如何使用cat命令查看文件”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!...
本篇文章给大家分享的是有关利用java怎么编写一个超市管理系统,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。实现功能使用选择结构,循环结构,数组的知识实现一个超市管理系统运行结果:货物清单:添加商品功能:删除商品功能:修改商品:商品货物实体类import java.util.Arrays;public class Goods { private int id; private double price; private String name; public Goods(int id, double price, String name) { this.id = id; this.price = price; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Goods() { } //增加商品 public Goods[] add(Goods[]goods,Goods newGood){ goods= Arrays.copyOf(goods,goods.length+1); goods[goods.length-1]=newGood; return goods; } //删除商品 public static Goods[] del(Goods[]goods,int id){ int i=0; while(true){ if(goods[i].getId()==id){ goods[i]=null; return goods; } i++; if(i>=goods.length){ return goods; } } } //添加商品 public static Goods[] change(Goods[]goods,int id,int newId,double newPrice,String newName){ int i=0; while (true){ if(goods[i].getId()==id){ goods[i].setId(newId); goods[i].setPrice(newPrice); goods[i].setName(newName); return goods; } i++; if(i>=goods.length){ return goods; } } } }超市管理系统类import java.util.Scanner;public class marketManager { public static void main(String[] args) { Scanner sc = new Scanner(System.in); Goods g1=new Goods(1000,10,"笔记本"); Goods g2=new Goods(1001,2,"西红柿"); Goods g3=new Goods(1002,5,"辣条"); Goods []goods={g1,g2,g3}; while (true) { System.out.println("========超市管理系统======="); System.out.println("1.货物清单 2.增加商品 3.删除商品 4.修改商品 5.退出"); System.out.println("请输入你要操作的编号:"); int i = sc.nextInt(); switch (i){ case 1: System.out.println("=======商品清单======="); System.out.println("商品编号"+"\t\t"+"商品单价"+"\t\t"+"商品名称"); for (Goods a:goods) { if(a==null){ continue; } System.out.println(a.getId()+"\t\t"+a.getPrice()+"\t\t"+a.getName()); } continue; case 2: System.out.println("你选择的是增加商品的功能"); System.out.println("请输入你要添加的编号:"); int Id = sc.nextInt(); System.out.println("请输入你要添加的商品价格:"); double price = sc.nextDouble(); System.out.println("请输入你要添加的商品名称"); String name = sc.next(); Goods good=new Goods(Id,price,name); goods = good.add(goods, good); System.out.println("添加成功!"); continue; case 3: System.err.println("你选择的是删除商品功能"); System.out.println("请输入你要操作的编号:"); Id = sc.nextInt(); goods=Goods.del(goods,Id); System.out.println("删除成功!"); continue; case 4: System.out.println("你选择的是修改商品功能"); System.out.println("请输入你要操作的编号:"); Id=sc.nextInt(); System.out.println("请输入修改后的编号:"); int newId = sc.nextInt(); System.out.println("请输入修改后的价格:"); double newPrice = sc.nextDouble(); System.out.println("请输入修改后的商品名称:"); String newName=sc.next(); goods=Goods.change(goods,Id,newId,newPrice,newName); continue; case 5: return; } } } }以上就是利用java怎么编写一个超市管理系统,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注辰讯云资讯频道。...
小编给大家分享一下Java基础中注释方法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!本教程操作环境:windows7系统、java10版,DELL G3电脑。1.单行注释对程序的某一行代码进行解释例://这是一个简单的注释2.多行注释注释的内容可以为多行以/*开头,以*/结尾,表示这区间的代码是注释.例1:/* * 这还是一个 * 多行注释 */3.文档注释:/**注释内容*/对一段代码的解释说明,可以通过javadoc命令将文档注释提取出来生成帮助文档/**这是我们第一次学习javadoc * @author ChenJiaYi * @version jdk11.0 */ /* 单行注释和多行注释的作用: ①对缩写的程序进行解释说明,增强可读性 ②调试所写的代码 */public class DocNote { /* 如下的main方法是程序的入口, main的格式是固定的 */ /**如下的方式是main(),作用:程序的入口 * @param args 输出HelloWorld */ public static void main(String[] args) { //单行注释:如下语句表示输入到控制台 System.out.println("HelloWorld"); } }我们在java中使用注释,是为了方便在大家在能够更容易理解代码,和python中的注释有相同之处。java中的注释有单行注释、多行注释、文档注释三种类型。以上是“Java基础中注释方法有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注辰讯云资讯频道!...
小编给大家分享一下java如何从键盘输入一个数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架。2.Shiro,Apache Shiro是Java的一个安全框架。3.Mybatis,MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。4.Dubbo,Dubbo是一个分布式服务框架。5.Maven,Maven是个项目管理和构建自动化工具。6.RabbitMQ,RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。7.Ehcache,EhCache 是一个纯Java的进程内缓存框架。键盘输入可以让用户在程序运行过程中向程序输入数据,达到人机交互的效果,提高用户体验。1、键盘输入过程(1)导包(importjava.util.Scanner)告诉程序这个工具在哪里。(2)创建对象(Scannersc=newScanner(http://System.in)。(3)获取数据(intnum=sc.nextInt();)使用工具。2、实例import java.util.Scanner; public class Test{ public static void main(String[] args){ Scanner sc = new Scanner(http://System.in); System.out.println("请输入您的年龄:"); int age = sc.nextInt(); if(age<18){ System.out.println("毛头小子"); }else{ System.out.println("成年人了"); } } }以上是“java如何从键盘输入一个数”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注辰讯云资讯频道!...
这篇文章给大家分享的是有关JavaScript中jquery框架的写法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。JavaScript是什么JavaScript是一种直译式的脚本语言,其解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript是被广泛用于客户端的脚本语言,最早是在HTML网页上使用,用来给HTML网页增加动态功能。什么是jQuery?jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。利用CSS选择器,来操作DOM对象进行一系列操作,并且具有强大的插件机制。下载http://jquery.com/ 下载jQuery框架特点轻量级框架:占用资源少,运行速度快;免费开源,提供了强大的功能函数;解决浏览器兼容性问题,实现丰富的 UI 和插件;纠正错误的脚本知识。jQuery 添加到网页中<head><script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script></head>感谢各位的阅读!关于“JavaScript中jquery框架的写法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!...
这篇文章主要介绍deepin系统安装成功后网速很慢怎么办?,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!deepin是基于Linux系统开发的,在网络这方面还是会存在不兼容而导致网速过慢,具体方法如下:1、首选点击启动器,然后打开deepin的终端,终端的位置和mac os系统有些类似,与windows稍微有一些不同。2、打开终端之后,在终端中输入下面的代码:sudo deepin-editor /etc/modprobe.d/iwlwifi.conf3、点击enter运行上述代码,这时候系统会需要我们输入用户密码,输入密码之后点击enter。tips:基于linux的系统在输入密码时是不显示内容的这是个正常现象。4、将“options iwlwifi 11n_disable=1 bt_coex_active=0 power_save=0 swcrypto=1”中的“11n_disable=1”修改为“11n_disable=0”5、然后保存修改后的代码关闭编辑器,重启一下电脑,然后重新体验一下,看一下网速是否得到了提升。6、如果网速没有变化的话也可以将:“options iwlwifi 11n_disable=1 bt_coex_active=0 power_save=0 swcrypto=1”中的“11n_disable=1”修改为“11n_disable=8”以上是“deepin系统安装成功后网速很慢怎么办?”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注辰讯云资讯频道!...