首页 文章 精选 留言 我的

精选列表

搜索[计算机基础],共10007篇文章
优秀的个人博客,低调大师

Python基础(草稿)

#python ex1.py ## # -- coding:utf-8 -- print “Hello World!” print 6+2 print "aa","bb" print "%s %d %i "%(aa,bb,cc) print "%d"%10 print x print y $r False True string+string print aa,bb 逗号即空格 print "."*10 formater="%r %r %r %r" print formater%(1,2,3,4) %r everything \n 换行 """ xx yy xx yy """ #三个引号代表多行 获取用户输入 raw_input() raw_input("how old are you") pydoc raw_input 传参数 from sys import argv script,first,second,third=argv #脚本名字,变量1,2,3 a=open(filename) a.read() from sys import argv script,filename=argv file=open(filename) file.read() file.readline() file.truncate() file.seek(0) file.write("sss") file.close() from sys import argv from os.path import exists script,ffile,tfile=argv input=open(ffile) indata=input.read() len(indata) ##len exists(tfile) ##exists output.write(indata) output.close() input.close() def funt(a1,a2) print "%r %r"%(a1,a2) return 1 funt(1,2) string.split(' ') string.pop(0) if xx: print xx if xx: elif xx: else: xx the_count=[1,2,3,4,5] for nu in the_count: print nu for i in range(1,5) num=[] num.append(i) a=num[1] 字典 del from random import randint randint(0,5) class Employee(Person): def __init__(self,a,b): #######pip distribute nose virtualenv try: except : string.upper() string.lower() string.title() 首字母大写 string.strip() string.rstrip() string.lstrip() str(23) sss=[] sss.append() sss.insert(0,'aa') del sss[0] sss.pop() delete the last sss.pop(0) sss.remove('aa') sss.sort() sss.sort(reverse=True) 永久性排序 sorted(sss) 临时排序 sss.reverse() sss[-1] 最后一个元素 for a in sss: print(a) #缩进即关系 for a in range(1,7): print(a) sss=list(range(1,8)) sss=list(range(2,11,2)) min(sss) max(sss) sum(sss) sss[0:3] sss[0:] aaa=sss[:] sss=(111,2222) #不可更改 for i in range(1,5): if i<=3: print(i) else: print(i) aaa={1:333,2:3333} aaa[1] del for key,value in aaa.items(): for a in aaa.keys(): sorted(aaa.keys()) aaa.values() set(aaa.values()) 不重复的值 raw_input() int() 转成数字 break continue def gree() print def gree(arg1='aaa') print while aaa: print def gree(*arg) print from modulename import fun1,fun2,fun3 import pp as p p.fun2() from modulename import * ################################################################# class Dog(object): def __init__(self,name,age) def sit(self) class Dog(Cat): def __init__(self): super(Dog,self).__init__() from Dog import Dog from Dog import Dog,Cat import Dog as hh hh.cc() from Dog import * ###################################################################### with open('a.txt') as fi: fi.read() print readline() with open('a.txt','w') as fi: fi.write('aa\n') with open('a.txt','a') as fi: fi.write('aa') try: xx except xx: pass import json json.dump() json.load() #################################################################### aa.append aa.insert for a in aa: print(a) aa[0][1][3] isinstance(aa,list) ## for each_item in movies: if isinstance(each_item,list): for ne in each_item: print(ne) else: print(each_item) ## list() range enumerate int id next() ####### pypi ##### thefile=open('xx.txt') thefile.close() import os os.getcwd() os.chdir('') os.getcwd() data=open() data.seek(0) data.close() (a,b)=string.split(':') print(a) print(b) string.find(':') if string.find(':')==-1 xx try: except: pass file.open file.readline file.close file.find string.strip string.lstrip string.rstrip out=open('xx.txt','w') print("xxx",file=out) out.close() try: except: finally: try: with open('xx.txt','w') as data: print('sss',file=data) except: print('error') with 帮助关闭文件 sys.stdout sys.stdint ##################### ###二进制读写文件 import pickle with open('xx.pickle','wb') as aa: pickle.dump('xxx',aa) with open('xx.pickle','rb') as bb: ali=pickle.load(bb) locals() 返回当前作用域的变量集合 ################## data.sort() sorted(data) secs=[m*60 for m in mins] sanitize(t) 转时间格式 set() aa[0:3] class Aa(object): def __init__(self): class Nextlist(list): dict() 空字典 #######################################

优秀的个人博客,低调大师

Android基础概念

最近为了应付老外的Android作业,所以不得不开始学习一下Android。在这里不得不吐槽一下学校,悄悄的将我们选的嵌入式换成Android,而不通知我们。 先简单的介绍一下Android中UI组件的一些通用属性吧: android:id 是指定控件的位置标识,在java程序中可以通过findViewById(“id”)来获取指定的android界面组件。 android:layout_width和android:layout_height用来指定界面组件的宽度和高度,如果这个属性值设置为fill_parent的话,也就是说明这个组件和其父组件具有相同的宽度,如果属性值设置为warp_content的话,说明这个组件的宽度或者高度刚刚能包裹他的内容。 android之所以采用XML文件来定义用户界面,我觉的就是为了解耦。使得java程序专门负责业务逻辑实现。 使用Eclipse开发Android应用比较简单,一般只需要做大体两件事情:使用main.xml定义用户界面,然后使用java编写业务逻辑实现。 下面大致说说几个主要目录的作用,如图: AndroidManifest.xml文件是Android项目的系统清单文件,用来控制android应用的名称,图标,访问权限等的整体属性。 src目录是一个普通的用来保存java源文件的目录 res目录用来存放各种资源文件 比如layout存放布局文件values目录下存放各种XML格式的资源文件,例如字符串文件strings.XML。drawable-mdpi,drawable-ldpi,drawable-hdpi这3个目录是分别用来存放中,小,大三种图片文件。 下面来建立一个基本的例子来看看,首先使用eclipse建立一个android项目,然后修改main.xml文件内容如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/show" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> <!-- 设置按钮的文本为“单击我” --> <Button android:id="@+id/ok" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="单击我" /> </LinearLayout> 然后设置HelloWorldActivity.java文件内容如下: package hello.com; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.LinearLayout; public class HelloWorldActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //设置使用main.xml文件定义的界面布局 setContentView(R.layout.main); //获取UI界面中id为ok的按钮 Button button=(Button)findViewById(R.id.ok); //为按钮绑定一个时间监听器 button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //或许UI界面中id为show的文本框 final TextView show=(TextView)findViewById(R.id.show); //改变文本框的内容 show.setText("Hello Android "+new java.util.Date()); } }); } } 好了,然后运行,结果如下图: ============================================================================== 本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/archive/2012/05/16/2504667.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

docker compose 基础

yum install docker -y systemctl start docker systemctl enable docker docker 加速 vim /etc/docker/daemon.json { "registry-mirrors": [ "http://1206f14f.m.daocloud.io" ], "insecure-registries": [] } docker compose 安装 sudo yum install epel-release -y sudo yum install -y python-pip -y pip install --upgrade pip pip install docker-compose yum upgrade python* docker-compose --version 通过docker compose 来安装wordpress vim docker-compose.yml ////////////////////////////////////////////////// version: '2' services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: wordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_PASSWORD: wordpress volumes: db_data: ///////////////////////////////////////////////////////////// 5.开始运行wordpress docker-compose up -d -d代表在后台执行。 6.打开浏览器,输入(ip address):8000,按提示初始化wordpress。 相关命令 docker-compose up -d docker-compose stop docker-compose ps docker-compose run servicename cmd //对容器执行命令(一次) docker-compose run servicename env //查看web容器环境变量 本文转自 zbill 51CTO博客,原文链接:http://blog.51cto.com/dek701/1965645,如需转载请自行联系原作者

优秀的个人博客,低调大师

docker基础用法

1、安装 vim /etc/yum.repos.d/CentOS-Base.repo [dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/ enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg yum install -y docker-engine chkconfig docker on 2、镜像 查看镜像库镜像 docker search centos 从镜像库下载镜像 docker pull centos docker pull nginx [root@docker data]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest db079554b4d2 31 hours ago 182 MB centos latest 67591570dd29 2 months ago 192 MB 删除镜像 [root@docker grafana]# docker rmi db079554b4d2 如果镜像删除不掉,请查看镜像是否已生成容器 查看镜像详细信息 [root@docker ~]# docker inspect nginx 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [ { "Id":"sha256:db079554b4d2f7c65c4df3adae88cb72d051c8c3b8613eb44e86f60c945b1ca7", "RepoTags":[ "nginx:latest" ], "RepoDigests":[ "nginx@sha256:4296639ebdf92f035abf95fee1330449e65990223c899838283c9844b1aaac4c" ], "Parent":"", "Comment":"", "Created":"2017-02-16T00:54:56.752000751Z", "Container":"30e0e527a56283658abfc1c1bff8650f9c924b70749d2e4c14930af78485ed02", "ContainerConfig":{ "Hostname":"33842653d6db", "Domainname":"", "User":"", 3、根据镜像创建容器 docker container旨在提供一个共享kernel的 OS 级虚拟化方法,在执行时不用重复加载Kernel, 且container的kernel与host共享,因此可以大大加快container的 启动过程,并显著减少内存消耗,容器在提供隔离的同时,还通过共享这些资源节省开销,这意味着容器比真正的虚拟化的开销要小得多。 Docker container运行时所构造的运行环境,实际上是由具有依赖关系的多个Layer组成的。nginx容器需要依赖centos镜像的kernel才能运行。 启动nginx容器 注释:docker run 命令 -d 后台运行 -p 端口映射,容器端口映射到服务器端口(-p 服务器端口:容器端口)。 -v 挂载目录 --restart=waways 随着docker服务启动一起启动容器 [root@docker grafana]# docker run --name=nginx -d -p 80:80 -p 443:443 -v /tmp/logs:/var/log/nginx/ --restart=always nginx 1caa1c76f4a0cc19979c6fa1c7cb2c1b29d5039d9578b2747675e39eafc9015b [root@docker grafana]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1caa1c76f4a0 nginx "nginx -g 'daemon ..." 10 minutes ago Up 10 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx 4、容器 查看容器 [root@docker grafana]# docker exec -it nginx /bin/bash root@1caa1c76f4a0:/# ls bin boot devetc home liblib64 media mnt optproc root run sbin srv sys tmp usr var 重启/停止/启动容器(restart/stop/start) [root@docker grafana]# docker restart 1caa1c76f4a0 删除容器(自能删除非运行状态的容器) [root@docker grafana]# docker rm 1caa1c76f4a0 更新容器 使用docker exec可以进入容器查修改容器的相关配置,但是容器一旦重启启动就会还原。如果想要修改永久生效有两种方式。 1、修改dockerfile后重新生成镜像,然后由镜像生成新容器(旧容器和镜像可以删除) 2、使用docker commit命令更新镜像 1 2 3 4 5 6 7 8 9 [root@docker~] #dockercommit376c169391b7python sha256:389a76ab6473e78cc4777bfa280eed80f1c0240f8af257992b42d28174498a9c [root@docker~] #dockerimages REPOSITORYTAGIMAGEIDCREATEDSIZE pythonlatest389a76ab647313secondsago350MB grafana4.0.4latest69e6c963b0f82weeksago465MB grafanalatest12bfbc0626592weeksago464MB nginxlatestdb079554b4d23weeksago182MB centoslatest67591570dd292monthsago192MB docker commit可以直接更新原来的镜像,也可以生产新的镜像。(建议后者) 5、自定义镜像 FROM 基于那个镜像 RUN 安装软件或执行命令使用 MAINTAINER 镜像创建者 CMD Container启动时执行的命令,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD.CMD主要用于container时启动指定的服务,当Docker run command的命令匹配到CMD command时,会替换CMD执行的命令。 备注:Docker容器在启动的时候开启单个进程,比如,一个 ssh 或者 apache 的 daemon 服务。但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令放到一个启动脚本里面,启动的时候直接启动这个脚本,另外就是安装进程管理工具。CMD结合supervisor一起使用,实现多服务同时启动。 USER 使用哪个用户跑container EXPOSE container内部服务开启的端口。主机上要用还得在启动container时,做host-container的端口映射。例如上面:docker run --name=nginx -d -p 80:80 -p 443:443 -v /tmp/logs:/var/log/nginx/ --restart=always nginx ENV 设置环境变量 COPY 拷贝本地数据到容器中,经常用于配置文件拷贝 VOLUME VOLUME指令用来设置一个挂载点,可以用来让其他容器挂载以实现数据共享或对容器数据的备份、恢复或迁移。 参考:https://hujb2000.gitbooks.io/docker-flow-evolution/content/cn/basis/dockerfiledetail.html 下面是一个实现python界面接口访问的服务实例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 FROMcentos MAINTAINER test 123456789@qq.com #设置本地时区并安装需要的插件和supervisor RUN rm -rf /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&yum-y install wgetpython-setuptools&&easy_installpip&&pip install supervisor #安装redis等安装包 RUNpip install redis&&yum install -yMySQL-python RUNyum-y install httpd #拷贝配置好的配置文件到容器中 COPYhttpd.conf /etc/httpd/conf/httpd .conf COPY*.py /var/www/cgi-bin/ RUN chmod +x /var/www/cgi-bin/ *.py #supervisord.conf设置启动的命令,随着容器一起启动 COPYsupervisord.conf /etc/supervisord .conf CMD[ "/usr/bin/supervisord" ] #container内部服务开启的端口 EXPOSE80 vim supervisord.conf 1 2 3 4 [supervisord] nodaemon= true [program:httpd] command =httpd-kstart 创建镜像 docker build -t python . 镜像保存 docker save -o centos.tar centos 1 2 [root@docker~] #ls centos. tar 还原镜像 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@docker~] #dockerrmicentos Untagged:centos:latest Untagged:centos@sha256:c577af3197aacedf79c5a204cd7f493c8e07ffbce7f88f7600bf19c688c38799 [root@docker~] #dockerimages REPOSITORYTAGIMAGEIDCREATEDSIZE pythonlatest389a76ab647316minutesago350MB grafana4.0.4latest69e6c963b0f82weeksago465MB grafanalatest12bfbc0626592weeksago464MB [root@docker~] #dockerload-icentos.tar Loadedimage:centos:latest [root@docker~] #dockerimages REPOSITORYTAGIMAGEIDCREATEDSIZE pythonlatest389a76ab647316minutesago350MB grafana4.0.4latest69e6c963b0f82weeksago465MB grafanalatest12bfbc0626592weeksago464MB centoslatest67591570dd292monthsago192MB 本文转自 irow10 51CTO博客,原文链接:http://blog.51cto.com/irow10/1898922,如需转载请自行联系原作者

优秀的个人博客,低调大师

ansible基础使用

ansible的安装 Ansible —基于 Python paramiko开发,分布式,无需客户端,轻量级,配置语法使用 YMAL 及 Jinja2模板语言,更强的远程命令执行操作。 类似的自动化运维工具有很多常用的还有: Puppet: —基于 Ruby 开发,采用 C/S架构,扩展性强,基于SSL,远程命令执行相对较弱. SaltStack: —基于 Python 开发,采用 C/S 架构,相对 puppet 更轻量级,配置语法使用 YMAL,使得配置脚本更简单。 Ansible 工作机制 Ansible 在管理节点将 Ansible 模块通过 SSH 协议(或者 Kerberos、LDAP)推送到被管理端执行,执行完之后自动删除,可以使用 SVN 等来管理自定义模块及编排。 由上面的图可以看到 Ansible 的核心组件组成由 5 个部分组成: Ansible core: 核心; core Modules: 包括 Ansible 自带的核心模块及自定义模块; connect Plugins: 完成模块功能的补充,包括连接插件、邮件插件等; Playbooks: 定义 Ansible 多任务配置文件,由 Ansible 自动执行; host Inventory: 定义 Ansible 管理主机的清单、主机池、主机列表; yum安装ansible yum install ansible (ansible依赖于Python 2.6或更高的版本、paramiko、PyYAML及Jinja2。) 三台主机: 192.168.38.3 192.168.38.4 192.168.38.5 (安装ansible) 使用ssh-keygen生成ssh秘钥,通过ssh-copy-id -i root@192.168.38.3 将秘钥传送到另外两台被管理的主机,测试登录被管理主机。 ansible的参数: -u 远程执行命令的user,默认为root。 -i 指定主机清单,默认为/etc/ansible/hosts。 -m 指定模块的名称,默认command命令模块。 -a 模块的具体参数。 -k 提示输入远程主机的密码。 vim /etc/ansible/hosts 主机清单配置文件。 [test] test组有2台机器。 192.168.38.4 192.168.38.3 也可以用":"来定义一系列连续的主机,下面那样写也是ok的。 [test] 192.168.38.[3:4] [root@192 ansible]# ansible -m ping 'test' ping模块测试,返回pong,代表ok。 192.168.38.3 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.38.4 | SUCCESS => { "changed": false, "ping": "pong" } [root@192 ansible]# ansible -m command -a 'uptime' 'test' -m命令模块,具体执行uptime命令。 192.168.38.4 | SUCCESS | rc=0 >> 19:23:51 up 1:02, 2 users, load average: 0.00, 0.01, 0.05 192.168.38.3 | SUCCESS | rc=0 >> 19:23:51 up 1:02, 2 users, load average: 0.00, 0.02, 0.05 [root@192 ansible]# ansible -u root -m command -a date 'test'-u 指定用户。 192.168.38.3 | SUCCESS | rc=0 >> 2016年 11月 05日 星期六 19:24:45 CST 192.168.38.4 | SUCCESS | rc=0 >> 2016年 11月 05日 星期六 19:24:45 CS ansible组的划分定义,2台主机分别属于2个组,但同时又属于一个大组。 cat /etc/ansible/hosts test1和test2同属于test组。 [test:children] test1 test2 [test1] 192.168.38.3 [test2] 192.168.38.4 [root@192 ansible]# ansible -a date 'test' 192.168.38.3 | SUCCESS | rc=0 >> 2016年 11月 05日 星期六 19:44:25 CST 192.168.38.4 | SUCCESS | rc=0 >> 2016年 11月 05日 星期六 19:44:25 CST [root@192 ansible]# ansible -a date 'test1' 192.168.38.3 | SUCCESS | rc=0 >> 2016年 11月 05日 星期六 19:44:31 CST [root@192 ansible]# ansible -a date 'test2' 192.168.38.4 | SUCCESS | rc=0 >> 2016年 11月 05日 星期六 19:44:34 CST 本文转自青衫解衣 51CTO博客,原文链接:http://blog.51cto.com/215687833/1869847

优秀的个人博客,低调大师

安全基础-E

1、安全策略是一种正式申明,定义了安全如何在一个特定的组织中实施。 2、安全策略的每个部分通常都包含了几个标准组成:策略申明、标准、指导方针、规程。 3、常见安全策略类型:可接受的使用策略(AUP)、隐私策略、审计策略、外联网策略、密码策略、无线标准策略、社交媒体策略等。 4、组策略是一种集中式的账户管理功能,在windows server系统的活动目录中可用。 5、安全文档的类型:系统架构、变更文档、日志、存货清单。 6、变更管理是一种用于批准并执行变更的系统化方法,以确保信息技术服务最大化的安全性、稳定性和可用性。 7、档案处理方法:分类、保留与留存、处理与销毁。 本文转自 eth10 51CTO博客,原文链接:http://blog.51cto.com/eth10/1981854

优秀的个人博客,低调大师

Android 基础题目

1. BroadcastReceiver 在UI thread? BroadcastReceiver 总是在UI thread, If you register yourBroadcastReceiverusing a validHandlerrunning on a different thread: For example: 1 2 3 4 5 HandlerThread handlerThread = new HandlerThread( "ht" ); handlerThread.start(); Looper looper = handlerThread.getLooper(); Handler handler = new Handler(looper); context.registerReceiver(receiver, filter, null , handler); // Will not run on main thread 参考 2. 为什么要使用IntentServie IntentService是Service的子类,比普通的Service增加了额外的功能。先看Service本身存在两个问题: Service不会专门启动一条单独的进程,Service与它所在应用位于同一个进程中; Service也不是专门一条新线程,因此不应该在Service中直接处理耗时的任务; IntentService特征 会创建独立的worker线程来处理所有的Intent请求; 会创建独立的worker线程来处理onHandleIntent()方法实现的代码,无需处理多线程问题; 所有请求处理完成后,IntentService会自动停止,无需调用stopSelf()方法停止Service; 为Service的onBind()提供默认实现,返回null; 为Service的onStartCommand提供默认实现,将请求Intent添加到队列中; 本文转自Work Hard Work Smart博客园博客,原文链接:http://www.cnblogs.com/linlf03/p/6429338.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android DEX 基础

转载请标明出处:http://www.cnblogs.com/zhaoyanjun/p/5736305.html本文出自【赵彦军的博客】 1、什么是dex? 简单说就是优化后的android版.exe。每个apk安装包里都有。相对于PC上的java虚拟机能运行.class;android上的Davlik虚拟机能运行.dex。为何要研究dex格式?因为dex里面包含了所有app代码,利用反编译工具可以获取java源码。理解并修改dex文件,就能更好的apk破解和防破解。 2、dex好处 dex文件有个天大的好处:它可以直接用DexClassLoader类加载,这叫动态加载。于是我们只要在dex上加壳,在程序运行时脱壳,就可以规避静态反编译的风险。 3、一般的反编译流程是什么样子的。 1、下载apk文件,然后解压 ,得到 class.dex 文件 2、用dex2jar 把 class.dex 还原成classes-dex2jar.jar 文件 3、用jd-gui.exe 把classes-dex2jar.jar 文件打开,就可以看到源码了。 4、Android 为什么会出现 65536限制问题? 在Android系统中,一个App的所有代码都在一个Dex文件里面。Dex是一个类似Jar的包,存储了很多Java编译字节码的归档文件。因为Android系统使用Dalvik虚拟机,所以需要把使用Java Compiler编译之后的class文件转换成Dalvik能够执行的class文件。这里需要强调的是,Dex和Jar一样是一个归档文件,里面仍然是Java代码对应的字节码文件。当Android系统启动一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt。DexOpt的执行过程是在第一次加载Dex文件的时候执行的。这个过程会生成一个ODEX文件,即Optimised Dex。执行ODex的效率会比直接执行Dex文件的效率要高很多。但是在早期的Android系统中,DexOpt有一个问题,也就是这篇文章想要说明并解决的问题。DexOpt会把每一个类的方法id检索起来,存在一个链表结构里面。但是这个链表的长度是用一个short类型来保存的,导致了方法id的数目不能够超过65536个。当一个项目足够大的时候,显然这个方法数的上限是不够的。尽管在新版本的Android系统中,DexOpt修复了这个问题,但是我们仍然需要对老系统做兼容。

优秀的个人博客,低调大师

Web服务基础

一、HTTP概述 HTTP是HyperText Transfer Protocol的缩写,即超文本传输协议。HTTP是应用层协议,同其他应用层协议一样,是为了实现某一类具体应用的协议,并由某一运行在用户空间的应用程序来实现其功能。HTTP是一种协议规范,这种规范是记录在文档上的,为真正通过HTTP协议进行通信的HTTP的实现程序。我们知道,HTTP协议是基于C/S架构的进行通信的,而HTTP协议的服务器端实现程序有httpd、nginx等,其客户端的实现程序主要是Web浏览器,例如Firefox、Internet Explorer、Google chrome、Safari、Opera等,此外,客户端的命令行工具还有elink、crul等。Web服务是基于TCP的,因此为了能够随时响应客户端的请求,Web服务器需要监听在80/TCP端口。这客户端浏览器和Web服务器之间就可以通过HTTP协议进行通信了。 二、IANA定义的端口 我们知道,Web服务器为了让所有客户浏览器程序能够与之通信,通常都需要监听在80端口。用户在浏览器上键入URL时,例如:www.baidu.com,默认端口就是80。这一端口是由IANA(InternetAssigned Numbers Authority)分配指定的。另外,IANA是由ICANN管理的,其定义的端口如下: ①0-1023:众所周知的端口,永久地分配给固定的应用使用,这些端口的使用需要特定的应用去注册,属于特权端口,例如Web服务的80/tcp,FTP的21/tcp等。该类端口只有系统管理员才有权限启用,并让进程监听,而普通用户则没有权限。 ②1024-41951:亦为注册端口,但要求不是特别严格,这些端口分配给程序,并注册为某个应用使用,但这些应用并不是很常见,例如mysql服务的3306/tcp,memcache的11211/tcp等。 ③41952+:客户端程序随机使用的端口,为动态端口,或私有端口。在Linux上该类端口范围定义在/proc/sys/net/ipv4/ip_local_port_range中。 三、BSD Socket BSD Socket最早是BSD Unix系统的进程通信机制。Socket即为套接字,作为IPC(Inter-Process Communication,进程间通信)的一种实现,允许位于不同主机上(也可以是同一主机上)的进程间通信机制。Socket可理解为“插座”,只要电线插上了这个“插座”,就可以进行通信了。Socket本质上应该是Socket API,它封装了内核中socket通信相关的通信细节,也就是封装了通信子网(传输层、网络层、数据链路层、物理层)要实现的具体的通信细节,而程序员通过调用Socket API就可以编写能够实现网络通信的程序了。 Socket描述的是IP地址和端口。不同的服务所对应的端口号不同,每种服务需要绑定并监听在一个端口上,打开一个Socket,而客户端可以通过一个Socket跟服务器上的Socket建立连接,这样二者就能实现通信了,我们把正处于通信状态的一对套接字称为已连接套接字。总的来说,Socket是应用层与传输层之间的桥梁,如图。 前面提到,Socket是对IP地址和端口号的描述,一个IP地址+一个端口就是一个套接字(socket)。根据Socket在传输层使用的协议可分为以下三类: (1)SOCK_STREAM:tcp套接字 (2)SOCK_DGRAM:udp套接字 (3)SOCK_RAW:raw套接字 这里的raw套接字指的是在不使用任何传输层协议(例如tcp, udp等)的情况下直接通过发送或接收IP数据包实现通信的一种方式,也就是应用层直接绕过像tcp/udp这样的协议直接基于IP数据包通信。 根据Socket监听的地址格式,Socket Domain可分为: (1)AF_INET:Address Family,IPv4地址格式 (2)AF_INET6:Address Family,IPv6地址格式 (3)AF_UNIX:Address Family,同一主机上不同进程间基于Socket套接字通信所使用的一种地址格式,这种地址的表现形式就是一个套接字文件(Linux一切皆文件);这种地址又称为Unix_SOCK. 接下来介绍TCP客户端和服务器是如何通过TCP套接字接口进行通信的。如图。 对于TCP服务器端来说,首先需要调用socket()函数,向内核注册申请创建TCP套接字(IP地址+端口);一旦申请成功了,就要通过bind()函数绑定程序到这个套接字上;绑定之后,需要调用listen()函数,使服务器进程监听在这个套接字上,允许套接字进行连接,但此时还不能接收用户请求;只有再调用accept()函数之后才开始负责接收客户端请求,并在客户端请求到达之前一直处于阻塞状态,此时TCP服务器进程的状态为LISTEN。 对于TCP客户端来说,同样需要调用socket()函数创建套接字,但不需要监听;当客户端向服务器发起连接请求时,即调用connect()函数,其中在括号中的参数包括对方服务器的IP地址和端口;如果服务器接收连接请求,则双方进行了tcp三次握手,建立双向的虚链路,此时客户端和服务器之间的套接字处于已连接状态(ESTABLISHED),之后的http请求/响应报文都是基于此前建立的虚链路进行发送。 在Linux上,当连接建立之后,客户端就可以在与服务器建立连接的socket文件上填写需要请求的数据,写入数据就相当于向服务器发送数据了,此过程通过调用write()函数完成;而服务器端则可以在与客户端建立连接的socket文件上读取数据,即调用read()函数,这一过程相当于接收客户端请求的数据,二者之间具体的通信细节由底层的通信子网完成。服务器读取到客户端发送过来的请求报文后,接着进行解析请求、处理请求并构建响应报文,再通过调用write()函数把响应报文写入socket文件,通过通信子网传送到客户端的socket文件上,客户端就可以通过这个socket文件得到服务器的响应报文了。如此往复循环多次,直到客户端请求断开连接(一般是由客户端主动请求断开连接,在使用keep-alive连接方式时则有可能是服务器主动请求断开连接)。 一旦客户端请求断开连接,TCP服务器通过调用read()函数读取socket文件内的断开请求数据,同意断开连接。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册