首页 文章 精选 留言 我的

精选列表

搜索[基础搭建],共10017篇文章
优秀的个人博客,低调大师

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文件内的断开请求数据,同意断开连接。

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

Android json基础

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。 ——JSON官网:http://www.json.org/json-zh.html 一.定义 JSON建构于两种结构: 列表内容“名称/值”对的集合(A collection of name/value pairs)。 不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。 这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。 对象模式: {“name”: “xiaoluo”} , 这就是一个最简单的json对象,对于这种数据格式,key值必须要是string类型,而对于value,则可以是string、number、object、array等数据类型 数组模式:这种形式被称为是jsonArray,数组是值(value)的有序集合。一个数组以“[”开始,“]”结束。值之间使用“,”(逗号)分隔。 二.解析JSON数据 Android提供的Json解析类: JSONObject: Json对象,可以完成Json字符串与Java对象的相互转换 JSONArray: Json数组,可以完成Json字符串与Java集合或对象的相互转换 JSONStringer:Json文本构建类,这个类可以帮助快速和便捷的创建JSON text, 每个JSONStringer实体只能对应创建一个JSON text JSONException:Json异常 JSONObject简单使用示例: infoMap = new HashMap<String, Object>(); try { JSONObject root = new JSONObject(stringBuilder.toString()); Iterator actions = root.keys(); //key()方法返回一个key的迭代器(String类型) while (actions.hasNext()) { String param = actions.next().toString(); Object value = root.get(param); infoMap.put(param, value); } } catch (JSONException e) { e.printStackTrace(); } 执行以上代码就将JSON中的 ”键值“ 输送到HashMap中。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

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

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册