当前位置:首页 » 编程软件 » rdm脚本

rdm脚本

发布时间: 2023-09-02 00:43:51

1. 如何制作安卓平板系统镜像

对Android系统的所有模块进行编译之后,对编译出来的模块文件进行打包。
打包结果就是是获得一系列的镜像文件,例如system.img、boot.img、ramdisk.img、userdata.img和recovery.img等。
些镜像文件最终可以烧录到手机上运行。
Android编译系统在初始化的过程中,会通过根目录下的Makefile脚本加载build/core/main.mk脚本,接着build/core/main.mk脚本又会加载build/core/Makefile脚本,而Android系统镜像文件就是由build/core/Makefile脚本负责打包生成的。
system.img镜像文件描述的是设备上的system分区,即/system目录,它是在build/core/Makefile文件中生成的
build/core/main.mk文件定义了boot.img镜像文件的依赖规则,我们可以通过执行make bootimage命令来执行。其中,bootimage是一个伪目标,它依赖于INSTALLED_BOOTIMAGE_TARGET。
build/core/main.mk文件定义了ramdisk.img镜像文件的依赖规则,我们可以通过执行make ramdisk命令来执行。其中,ramdisk是一个伪目标,它依赖于INSTALLED_RAMDISK_TARGET。
userdata.img镜像描述的是Android系统的data分区,即/data目录,里面包含了用户安装的APP以及数据等等。
recovery.img是设备进入recovery模式时所加载的镜像。recovery模式就是用来更新系统的,我们可以认为我们的设备具有两个系统。一个是正常的系统,它由boot.img、system.img、ramdisk.img和userdata.img等组成,另外一个就是recovery系统,由recovery.img组成。平时我们进入的都是正常的系统,只有当我们需要更新这个正常的系统时,才会进入到recovery系统。因此,我们可以将recovery系统理解为在Linux Kernel之上运行的一个小小的用户空间运行时。这个用户空间运行时可以访问我们平时经常使用的那个系统的文件,从而实现对它的更新。

2. 高分求会制作传世服务端脚本的高手

升级武器 脚本
自动升武器脚本 H1dq;M
现在SF龙纹,谷玉,血饮遍地暴,想要多少有多少,这个脚本理论上可以升到服务器允许的最高的属性,但是实际情况就不好说了,毕竟用的是商店首饰,不过,先用脚本升几把10的龙纹,然后再手升也不错。我写这个脚本也就是为了好玩,实用不是很大。有兴趣的朋友可以一试。 6=g(NKd[
下面把“无垫刀脚本”发出来。 ,FuBFid
F.edYN,<Ag
如果$成功="" .'6P\w34
那么$成功=0 ?^)z 8$o|
如果$失败="" tVBz`- z
那么$失败=0 k#mbR%o
如果$概率="" u-mpyx](
那么$概率=0 Y.- Q_T
如果$好刀="" EdL A!A
那么$好刀=0 * hNb,{VN
如果$上次时间="" WZ1,!$"/%
那么$上次时间=[当前时间] a>S(eTLG
$等待时间=300000 p[K4"U)
如果$起始时间="" yN$6wf e
那么$起始时间=[当前时间] x^Iviw=Y
$休息时间=20000 |1>WFw98
$矿石=黑铁矿 %W<H n
$首饰=竹笛 <UU+8J
$武器=龙纹剑 bbDu7jWu
$属性=道术 ]?k5K
$普通=6 <".u3k
$点数=$普通+2 %RAcxQA V
$计数器=0 |i[9XO78
如果$容量="" HI"bRbe0'
那么$容量=39 4&xt m="
m]V'DT#_]
触发器:提示:升级成功!!! V |nGKEE<
$成功=$成功+1 FwEX+MLgH
跳转到<成功> jtCb8|U
触发器结束 nRP%Qb
<2DJ7K\<
触发器:提示:武器破碎!!! 6XHU T
$失败=$失败+1 -#%CKM
$成功=0 lwO0>lU^?o
跳转到<失败> 7v?g@U9[
触发器结束 LC1ca:e-l
>GHr7+xb
<全局脚本开始>  UX<
<全局脚本结束> M`ZN#wL(
<挂机脚本开始> GloLR'
<分析位置> S'(] x`nbU
系统显示[看看我在哪] P8'i|\)r
如果[当前地图名]=5 C $o*H 3
那么跳转到<回盟重>  ,b{6S/(
如果[当前地图名]=3 M:v]vIRi
那么跳转到<回城> e(T]>Zi5
如果[当前地图名]=0151 E+Db6SX!
那么跳转到<想想该干什么> N(r$|J+*
(!mtA<
<回城> wFu;Fx"b
系统显示[回来了,该买东西了!] tpj#<WA,2
关闭全局脚本 %Be~*)C
躲避PKER关闭 >QxCk2~'Ej
停止战斗 q1|m0?
如果[3,333,332][距离]>50 DukYKI
那么使用[回城卷] =GB`BBq
否则走到[3,334,327] QAopUgs(
跳转到<总控> "xj#[aQVP
如果[回城卷][数量]<1 )+;e3gm
那么跳转到<分析位置> FVt?/}W9&
跳转到<回城> %+=.WE?
jhIj#z\
<总控> :f5?GwI
如果[回城卷][数量]<2 \-l}''Kr
那么调用<杂物购买> ;iyg/Hp}
如果[$矿石][数量]<4 WxmlsgeN@
那么调用<换黑铁矿> "H4kJuvy
如果[$首饰][数量]<4 }~+TlW/fQ
那么调用<买首饰> 1Ml]M~[Vy1
0,jS|T)
<出发> F)&MS*ZW
$挂机时间_1=[当前时间]-$起始时间 bM&`V>;$
$挂机时间=$挂机时间_1/1000 n!5>#h~
系统显示[欢迎使用≮夺命刀客≯全智能武器升级脚本] fHn`Kp>
系统显示[本次挂机[$挂机时间]秒,现在库存为[$容量],升级成功高属性[$武器][$好刀]把] glI1Z
等待[200000]毫秒 S~1xd)d
找到NPC[传送员,3,325,333] ]36@Z$WAm
对话[传送员] +xl g
选择[城市传送] zo5y}&
等待[1000]毫秒 y{_sEh -
选择[沙巴克外] m~5*Dc=
等待[1000]毫秒 `` LBF4/
开启全局脚本 MwbJo#k_'
躲避PKER开启 78^g/DrO4
系统显示[出发,砸几手去!] @Bg }1xpP
走到[3,638,316] . D Q4`
RWR9# S_D
<想想该干什么> )$YjF9C3
系统显示[考虑一下] GeHS4]
如果[自己][武器][名称]=$武器 8A}V#Y9"M
那么跳转到<升刀> eM4*Vxw0
否则跳转到<返回升级> Zn<NMto%C
EgxK,lu#f
<升刀> iLq4JN
走到[0151,12,15] [*z'4;_n+
系统显示[看看运气,砸一手!] ^ge@D,1!P%
找到NPC[沙城炼武器老板,0151,12,10] CS9{`G`v
对话[沙城炼武器老板] X%pc/&l>
选择[开始武器升级] Rs5jXA.f
等待[1000]毫秒 #D5ab*z_!
选择[确认修炼] <O)&3:`p
等待[1000]毫秒 Y?'bh
选择[请求修炼] l( [FOOp
等待[3000]毫秒 =>J_uSV
$上次时间=[当前时间] c]5_a|Z
跳转到<回城> R.|9]6zt?
/+8XxGA o
<返回升级> :619A H5(
走到[0151,12,15] @f@<tx5
如果[当前时间]-$上次时间>=$等待时间 -+tKhit
那么系统显示[把刀给我] !$@V:=Qu
那么找到NPC[沙城炼武器老板,0151,12,10] e WNCX9*TD
那么对话[沙城炼武器老板] >R'6)%Y
那么选择[返回武器升级] UCkjU-K l
那么等待[1000]毫秒 &e;< ^
那么装备[$武器]到[武器] ]JR='_gX
那么跳转到<开刀> coI.5^=6
否则跳转到<等待> dR_o]klR l
^vh &jZ8>e
<开刀> 7t8V[L81Gh
系统显示[运气怎么样?试一下就知道了!] }#V:0b]A
如果[自己][武器][名称]<>$武器 D3eTSn0
那么跳转到<仓库取刀> /bazeew
走到[0151,8,13] ^;oHo`
攻击NPC[沙城铁匠铺老板]8次 58xb)o!)
等待[2000]毫秒 \s w.uAO?'
跳转到<开刀> Hk%JPR 
J*"LP\E
<成功> IST5xv
系统显示[成了啊!连续成了[$成功] 手了] suHrrrU0j
如果$成功=1 e"SYzs+ys
那么$概率=$失败 Dh@8);A&5
那么$失败=0 %~~l|X!
跳转到<看属性> sjj(?vL
TuCe3 F
<失败> AO/ e3[.W
系统显示[哎!这次不行了!连续碎了[$失败]手了] nS)3
如果$失败=$概率&&$好刀>0 C#h9NJ^|
那么跳转到<仓库取好刀> $Af ]#{_
否则跳转到<仓库取刀> ?!7J/5`p
d6<9d/~M
<等待> fJ[>(w`
系统显示[等一会,没到时间呢!] [)-\r&}{
等待[$休息时间]毫秒 Zie#aZt
跳转到<返回升级> 4-Uxz=T)H_
eSQw@,Wn
<看属性> /,@&{^?3
系统显示[看看我的刀几的了?]  t+~HY2
如果[武器][$属性]>=$点数 *X'~e"B wM
那么$好刀=$好刀+1 nc"CF/vz
那么跳转到<换普通刀> te=R;|Uy
否则跳转到<升刀> 1_O*7mx
=D5]DUp~
<换普通刀> AvlU@6,("
系统显示[好刀啊!小心点的好,换把普通的。] NG:r'^,H-
$容量=$容量+1 i'-? *hP_
走到[3,640,245] G6|"]KP
走到[3,638,243] z 3j"Q
等待[3000]毫秒 ts<ogSkT
走到[0152,8,13] U{(pkjn0~
等待[2000]毫秒 0HqB#ar
跳转到<取普通刀> WN~[v#Qe
2=h2L!_
<仓库取刀> Xh5P0oPF
系统显示[找把普通的去升] w7[&zu]w(
走到[3,640,245] uV801P"
走到[3,638,243] mU]Kx,eJ
等待[3000]毫秒 XbX.lR2<{
走到[0152,8,13] nj<xo<C@
等待[2000]毫秒 NAi7=^['}
TIH?V_Gn
<取普通刀> `(cp0hiU
如果$计数器>$容量 A CtR3D
那么$计数器=0 nrpb%k<7
那么跳转到<回去休息> Ix{W jZVP
否则找到NPC[沙城仓库管理员,0152,7,12] I3I7zCSX$
对话[沙城仓库管理员] $$ An|o5yI
取物[$武器]1个 vgFw (( _#
等待[1000]毫秒 "Wx0.Io-
$计数器=$计数器+1 {,&dl&-B
装备[$武器]到[武器] $=) &
等待[1000]毫秒 ?(W^x X
对话NPC[沙城仓库管理员] z-;;UyuR=
自动存物 =Y'<7
等待[1000]毫秒  r_rdm#
如果[武器][$属性]=$普通 .@Z _Ais6/
那么$计数器=0 WT+$_.k<_
那么$容量=$容量-1 \ 4~ZQ
那么跳转到<升刀> Tj u%P1
否则跳转到<取普通刀> #e"aVR4oi
?X^2~K{
<仓库取好刀> LYk>m&x2a
系统显示[该出手时就得出手,拿把好刀碰碰运气!] Y_?N={}
走到[3,640,245] {qK1{( 
走到[3,638,243] l1d'3iE
等待[3000]毫秒 jl5~`d-[
走到[0152,8,13] rx<l2 l[
等待[2000]毫秒 7I;fNB
#il%x0:
<取> 0;OFPJ
如果$计数器>$容量 hOx83Sd
那么$计数器=0 [z%! M5~
那么$点数=$点数+1 *2^EJ6e<p
那么跳转到<取> B1Jezf/*
否则找到NPC[沙城仓库管理员,0152,7,12] AR $bH^='J
对话[沙城仓库管理员] Wo1,e8",B@
取物[$武器]1个 os lG {8i
等待[1000]毫秒 QFT2l|{{;=
$计数器=$计数器+1 Qwf]Q!}
装备[$武器]到[武器] b:W=^1uM'
等待[1000]毫秒 p<Wbmk>
对话NPC[沙城仓库管理员] f*nAejs+p
自动存物 .cJ"Jcw><
等待[1000]毫秒 BO8iI-`4
如果[武器][$属性]=$点数 q[4`c FN
那么系统显示[找到一把[$点数]的刀] W><B9eQ
那么$好刀=$好刀-1 S)`AJn5
那么$容量=$容量-1 f^=;7 ![q
那么$计数器=0 74ghQH
那么$点数=$普通+2 N Ydn}z f
那么跳转到<升刀> B5'FI_Y-EW
否则跳转到<取> 7;{Ni~[@@
X ydAP
<杂物购买> k7}u%*~/
系统显示[买杂物去] z_P31@"
找到NPC[盟重流浪汉,3,346,334] jPy1$8!
对话[盟重流浪汉] rPd"zh1u
等待[1000]毫秒 *kcxo5 .
买够[回城卷]3个 U4TO"=
等待[1000]毫秒 hPt;Y
返回 75 Z5j9"
w+pH$<Ir
<换黑铁矿> RKD4uz
系统显示[换几个矿] |5 ):nt
如果[$矿石][数量]<2 }#G m#3*
那么找到NPC[高级服务生,3,336,331] qc{z=]1
那么对话[高级服务生] Ba7p!g
那么选择[泡点兑换] t 5xQxyC
那么等待[1000]毫秒 YV3KX7^r
那么选择[兑换矿石] :Fi 4QpV+
那么等待[1000]毫秒 |qhCq5i
那么选择[黑铁矿石] \ KCH
那么等待[1000]毫秒 W  [yECY
那么选择[释放能量] g?v+O?K
那么跳转到<换黑铁矿> o/EZ;JJZg
否则返回 /.~OZ}WV
"3'dtNF<Fb
<买首饰> TPJ' OtR
系统显示[买几个项链] 'Gv1p-h`
找到NPC[盟重老兵,3,326,326] c4mJa- w
对话[盟重老兵] R'ZZ.|D{
选择[想去商店] wCEj+w3o1
等待[1000]毫秒 QcdcPF>F
选择[首饰店] PNDya
等待[1000]毫秒 }:D5?
找到NPC[盟重项链店老板,0158,4,21] uwX;mq Q
对话[盟重项链店老板] t. WanEmV
买够[$首饰]2个 (O$'M
如果[$首饰][数量]<2 k(',nCe
那么跳转到<买首饰> 6:ERL+r37
使用[回城卷] O tu NKK
返回 HvC.\j\bP
qwEua~l~
<回盟重> adY1yB
系统显示[回土城去] tu<wp`yyv
走到[5,141,339] 1F%/gn i
对话[苍月传送员] )DJ5OcJ/
选择[城市传送] Uwgs&+
等待[1000]毫秒 #5SgoSU
选择[盟重土城] 0`Dw*C|
等待[1000]毫秒  tS'w@s
跳转到<回城> % 3 D}
SQTzwH4
<回去休息> ,J~.8VQ
系统显示[刀都升没了,回去吧,休息一下!] C7`K 2
使用[回城卷] }bKR$
等待[1000]毫秒 [vB~8Gq
走到[3,335,325] bdOFa7'X&i
停止脚本 Wmw||
HZJ~Q )
<挂机脚本结束>

3. 程序员用Mac都有哪些必备的app

Mac上程序员必备的10大软件

1、IDEA

作为一个开发者,必须使用IDEA的,以前的elipse基本很少有用了,除非那些10多年的老员工对它有太大的感情了。

2、安装JDK11或者JDK8

我觉得应该安装JDK11吧,毕竟JDK14都出来这么久了。

3、Pycharm

Python开发工具,作为程序员也许你不是做Python开发的,但是偶尔还是用Python的。

4、Git

不用多说,当你在公司开发时候,一个项目是由很多人完成的,Git就是用来版本控制的,不仅要安装还要熟悉使用。

5、VMware Fusion和Navicat

Navicat是一个数据库管理工具,值得拥有,VMware是虚拟机软件。我现在还是学生,电脑配置也不太好,我一般使用阿里云服务器,然后连接IDEA工具,感觉太方便了,写完代码可以直接操作虚拟机。

6、Visual Studio for Mac

这是一款微软推出的跨平台开发工具,我一般用来写前端的。

7、Xcode

Xcode是苹果产品的,适用于ios开发工具,同时支持c++,对于学习c的同学来说值得拥有,就算做c开发,也值得安装,因为真的太强大了。

8、Google浏览器

9、ClenMyMacX

系统杀毒软件及清理垃圾等等。

10、Typora

作为一个程序员,不管学习也好总是做笔记叭,它就是一款最好的Markown,非常方便,它的语法我之前也写过一篇文章,可以抽30分钟学习即可熟练基本用法。

11、MindNode

我个人蔽森比较喜欢使用这块来做思维导图

12、Processon

在线画图工具,也可以做思维导图等,非常不错。

13、Rdm

学习Redis使用可视化工具

14、PDF Expert

Mac最好用的一款PDF

15、Xnip

个人觉得挺好用的截图工具

16、Be Focused

类似番茄薯仔,时间管理工具

17、eZip

压缩解压工具

18、网络网盘

19、uPic

图床,当你发表博客时候,每次粘贴有点太耗时间了,所以使用uPic配置Typora就完美了。

20、其他工具

qq、微信、OmniFocus项目管理工具、AE、PR视频剪辑等工具,看个人爱好下载使用,还有一些工具,暂时想不出了,但是上面所提到的我基本使用。

我的回答希望对你有帮助。

用了8年的Mac电脑,个人介绍下一些常用的APP,仅供参考。

1.终端iterm2
作为一名程序员,少不了需要用命令行处理事情。

通过它可以处理本地电脑的事情,也可以连接远程服务器操作。

补充:当然有些朋友喜派唤欢zshell环境,也可以使用ohmyzsh,看个人实际需求吧,我还是喜欢bash环境。

2.Alfred

Alfred 是一个用键盘通过热键、关键字、自定义插件来加快操作效率的工具,它不但是搜索工具,还是快速启动工具,甚至能够操作许多系统功能,扩充性极强。

比如程序员经常需要查看unix时间,用这个搜索框就能快速得到答案,按下回车键即可复制结果。

3.DBeaver免费开源数据库

一个免费开源的软件,支持Oracle、MySQL等数据库,但是速度相比Navicat Premium慢,但是胜在免费。

4.IntelliJ IDEA 开发工具IDE

java代码,怎么可能少了这个软件,吃饭干活的工具。

当然有些人也会用Visual Studio,用得人也不少,只要适合自己需求就可以了。

5.Android Studio安卓开发

Android Studio是一个Android开发环境,基于IntelliJ IDEA。通过这个开发工具,可以开发手机APP。

6.PyCharm

人生苦短,我学Python,通过这个工具,可以快速开发,但是唯一缺点就是耗内存。

7.Sourcetree管理代码工具

Sourcetree是个免费的Git客户端工具,通过它宏羡亩可以进行可视化操作,适合对Git有基础需求的人。但是有时候一些复杂的操作,个人还是喜欢命令行处理。

8.Markdown文档编写工具Typora

Typora支持跨平台,配合快捷键,轻松的写接口文档、数据库表结构等文档,图片也可以复制粘贴进来,十分便利。

同时支持导出PDF,Word多种格式。

9.Sublime Text跨平台的文本编辑器

Sublime Text 是一款流行的代码编辑器软件,支持各类插件,可运行在Linux,Windows和Mac OS X。

我经常用它来编写一些简单的Python脚本,或者看Java代码进行Review。

10.WireShark抓包软件

作为程序员,有时候要分析别人提供的网络数据包文件,安装这个跨平台软件,可以直观的分析网络数据包。

其他还有很多软件,这里就写前10个常用的软件推荐给你,希望能解答到你的问题。

作为一名前端,来推荐几个自己一直用的软件。
Visual Studio Code

vs code 是微软开发的良心编辑器,功能强大而且插件多,主要是启动速度还挺快,是原来的Eclipse开发团队的大佬来开发的,就是好用。

链接 https://code.visualstudio.com/
Sip: Mac 上最好的色彩管理工具

一款高效实用的Mac屏幕取色软件,可以便捷地对屏幕上的颜色进行采样和编码,从而高效地辅助用户对色彩的调整程度。支持 CSS、UIColor 等多种格式,适用于 Swift、Android、Java、.NET 等多种开发环境。

mac store 搜索 : sip
Moom: Mac窗口管理工具

一款实用的系统增强软件,操作极其方便简单,它可以通过拖拽的操作方式实现对窗口的任意操作,大小、位置、左右上下全方位移动以及最大最小化,这款Mac窗口管理器能够快速修改当前窗口大小并放置在指定位置,操作简单易上手。

mac store 搜索 : moom
Irvue Unsplash 壁纸工具

每天一张新壁纸,换来好的心情。

mac store 搜索 : Irvue。

1.vscode,美观,融合性强,插件多。

2.termius,完美替代xshell,用着舒服。

3.navicat16,相较于之前版本,ui是真漂亮,加上mac字体,简直是好用又艺术。

4.有道云笔记,多客户端同步,加上有代码块功能,代码笔记存储和查找就很方便了。

5.chrome,好处不用多说。

6.pd runner,偶尔用windows且不用花钱使用虚拟机pd的好工具。

Mac自带的工具大部分人都没发挥极致。

推荐一:PD,虚拟机利器。

推荐二:XmindZen 整理你的思维笔记,开个脑洞啥的。

推荐三:HomeBrew

推荐四:QuickTime 自带的录屏工具,录点视频很轻松。

从brew开始,剩下的就是一键安装了。必备!

1、xcode

mac自带的开发工具,好用舒服。

2、IDEA

java开发的首选工具,对比eclipse那就是质的提升。

3、Visual Studio Code

微软的花大力气做的开发工具。全平台都可以使用。

4、iStat Menus

可以让你详细掌握系统状态,特别是流量现实,非常精准。

5、vMware Fusion

虚拟机选择vMware Fusion确实是最省心的。超过其他虚拟机的太多。谁用谁知道。

6、CleanMyMac X

CleanMyMac X是被查询最多的Mac电脑优化软件。

7、Sublime Text

这个软件应该是前端和好多轻度开发者的必爱了。

8、iTerm2

iTerm2可以肩负起打造终极版Mac的终端。更改为Oh my zsh的shell,安装powerlevel9k插件。你的终端就可以飞起来了。

9、Homebrew

作为Mac电脑的软件管家,Homebrew一直没有让我们失望。

10、docker

程序员经常要做一些环境的调整,docker是一个很好的生产工具,调整好了就留下,不好就删除,对本机环境没有任何影响。而且可以快速部署到生产环境中。

我说的对不对呢,请大家拍砖。

我们程序员在Mac上的工具大致分为三类1)编程类 2)笔记类 3)任务管理类
一、编程类
1.1 首当其冲,当然是神之编辑器Emacs,而Emacs本身又是瑞士军刀包含编程,笔记,任务管理等,尤其是org,乃是许多人对Emacs欲罢不能的理由;

1.2 既然提到了emacs,自然少不了vim,相比emacs更加灵活轻便,适合于对配置作快速而简单的修改。

1.3 vscode,对编程新手而言,emacs与vim上手难度较高,因此推荐从vscode入手编程。

当然还有jetbrain等,但是笔者不喜欢,因此不做推荐。
二、笔记类
程序员首先是办公室白领,日常文档总结,工作复盘等,Mac上最为推荐的笔记工具,

2.1 BearNote极为精美且便捷,令人爱不释手,当然既然用macbook,缺点就是要fufei;

2.2 印象笔记,在macbook出人意料之外的好用,13年末的时候,笔者就是因为看到同事在macbook上精美的印象笔记,而种草买了第一台MBP。

2.3 Typora 是最优秀的所见即所得的markdown标记语言工具,是程序员写文章之必备。

三、任务与时间管理
3.1 任务管理当然要用omnifocus,只有在macbook上才能享用这款效率工具。

3.2 项目管理工具Omniplan,编程是青春饭,我们最终都要往产品经理,往管理岗位上迈进。因此项目管理工具必不可少。同样的,Omni系列的工具,只有MBP上才有。

3.3 花时间学学Emads的org-mode,用其作任务管理等。

作为一名大数据开发工程师,M1的Mac安装软件如下

1、IDEA 主力开发工具

2、VS Code 主力开发工具

3、Sublime 文本编辑工具

4、Item2 终端工具

5、Termius SSH工具

6、Postman 接口测试

7、Chrome 浏览器

8、SourceTree git管理工具

9、Typora 笔记管理

这个因人而异,我主要装了这些

基本上主要就这些了

4. socket在php主要是什么作用用在哪些方面

PHP 使用Berkley的socket库来创建它的连接。你可以知道socket只不过是一个数据结构。你使用这个socket数据结构去开始一个客户端和服务器之间的会话。这个服务器是一直在监听准备产生一个新的会话。当一个客户端连接服务器,它就打开服务器正在进行监听的一个端口进行会话。这时,服务器端接受客户端的连接请求,那么就进行一次循环。现在这个客户端就能够发送信息到服务器,服务器也能发送信息给客户端。
产生一个Socket,你需要三个变量:一个协议、一个socket类型和一个公共协议类型。产生一个socket有三种协议供选择,继续看下面的内容来获取详细的协议内容。
定义一个公共的协议类型是进行连接一个必不可少的元素。下面的表我们看看有那些公共的协议类型。

表一:协议
名字/常量 描述
AF_INET 这是大多数用来产生socket的协议,使用TCP或UDP来传输,用在IPv4的地址
AF_INET6 与上面类似,不过是来用在IPv6的地址
AF_UNIX 本地协议,使用在Unix和Linux系统上,它很少使用,一般都是当客户端和服务器在同一台及其上的时候使用
表二:Socket类型
名字/常量 描述
SOCK_STREAM 这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的socket类型,这个socket是使用TCP来进行传输。
SOCK_DGRAM 这个协议是无连接的、固定长度的传输调用。该协议是不可靠的,使用UDP来进行它的连接。
SOCK_SEQPACKET 这个协议是双线路的、可靠的连接,发送固定长度的数据包进行传输。必须把这个包完整的接受才能进行读取。
SOCK_RAW 这个socket类型提供单一的网络访问,这个socket类型使用ICMP公共协议。(ping、traceroute使用该协议)
SOCK_RDM 这个类型是很少使用的,在大部分的操作系统上没有实现,它是提供给数据链路层使用,不保证数据包的顺序

表三:公共协议
名字/常量 描述
ICMP 互联网控制消息协议,主要使用在网关和主机上,用来检查网络状况和报告错误信息
UDP 用户数据报文协议,它是一个无连接,不可靠的传输协议
TCP 传输控制协议,这是一个使用最多的可靠的公共协议,它能保证数据包能够到达接受者那儿,如果在传输过程中发生错误,那么它将重新发送出错数据包。

现在你知道了产生一个socket的三个元素,那么我们就在php中使用socket_create()函数来产生一个socket。这个 socket_create()函数需要三个参数:一个协议、一个socket类型、一个公共协议。socket_create()函数运行成功返回一个包含socket的资源类型,如果没有成功则返回false。
Resourece socket_create(int protocol, int socketType, int commonProtocol);

现在你产生一个socket,然后呢?php提供了几个操纵socket的函数。你能够绑定socket到一个IP,监听一个socket的通信,接受一个socket;现在我们来看一个例子,了解函数是如何产生、接受和监听一个socket。

<?php
$commonProtocol = getprotobyname(“tcp”);
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, ‘localhost’, 1337);
socket_listen($socket);
// More socket functionality to come
?>

上面这个例子产生一个你自己的服务器端。例子第一行,
$commonProtocol = getprotobyname(“tcp”);
使用公共协议名字来获取一个协议类型。在这里使用的是TCP公共协议,如果你想使用UDP或者ICMP协议,那么你应该把getprotobyname() 函数的参数改为“udp”或“icmp”。还有一个可选的办法是不使用getprotobyname()函数而是指定SOL_TCP或SOL_UDP在 socket_create()函数中。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
例子的第二行是产生一个socket并且返回一个socket资源的实例。在你有了一个socket资源的实例以后,你就必须把socket绑定到一个IP地址和某一个端口上。
socket_bind($socket, ‘localhost’, 1337);
在这里你绑定socket到本地计算机(127.0.0.1)和绑定socket到你的1337端口。然后你就需要监听所有进来的socket连接。
socket_listen($socket);
在第四行以后,你就需要了解所有的socket函数和他们的使用。

表四:Socket函数
函数名 描述
socket_accept() 接受一个Socket连接
socket_bind() 把socket绑定在一个IP地址和端口上
socket_clear_error() 清除socket的错误或者最后的错误代码
socket_close() 关闭一个socket资源
socket_connect() 开始一个socket连接
socket_create_listen() 在指定端口打开一个socket监听
socket_create_pair() 产生一对没有区别的socket到一个数组里
socket_create() 产生一个socket,相当于产生一个socket的数据结构
socket_get_option() 获取socket选项
socket_getpeername() 获取远程类似主机的ip地址
socket_getsockname() 获取本地socket的ip地址
socket_iovec_add() 添加一个新的向量到一个分散/聚合的数组
socket_iovec_alloc() 这个函数创建一个能够发送接收读写的iovec数据结构
socket_iovec_delete() 删除一个已经分配的iovec
socket_iovec_fetch() 返回指定的iovec资源的数据
socket_iovec_free() 释放一个iovec资源
socket_iovec_set() 设置iovec的数据新值
socket_last_error() 获取当前socket的最后错误代码
socket_listen() 监听由指定socket的所有连接
socket_read() 读取指定长度的数据
socket_readv() 读取从分散/聚合数组过来的数据
socket_recv() 从socket里结束数据到缓存
socket_recvfrom() 接受数据从指定的socket,如果没有指定则默认当前socket
socket_recvmsg() 从iovec里接受消息
socket_select() 多路选择
socket_send() 这个函数发送数据到已连接的socket
socket_sendmsg() 发送消息到socket
socket_sendto() 发送消息到指定地址的socket
socket_set_block() 在socket里设置为块模式
socket_set_nonblock() socket里设置为非块模式
socket_set_option() 设置socket选项
socket_shutdown() 这个函数允许你关闭读、写、或者指定的socket
socket_strerror() 返回指定错误号的详细错误
socket_write() 写数据到socket缓存
socket_writev() 写数据到分散/聚合数组

(注: 函数介绍删减了部分原文内容,函数详细使用建议参考英文原文,或者参考PHP手册)

以上所有的函数都是PHP中关于socket的,使用这些函数,你必须把你的socket打开,如果你没有打开,请编辑你的php.ini文件,去掉下面这行前面的注释:
extension=php_sockets.dll
如果你无法去掉注释,那么请使用下面的代码来加载扩展库:
<?php
if(!extension_loaded(‘sockets’))
{
if(strtoupper(substr(PHP_OS, 3)) == “WIN”)
{
dl(‘php_sockets.dll’);
}
else
{
dl(‘sockets.so’);
}
}
?>

如果你不知道你的socket是否打开,那么你可以使用phpinfo()函数来确定socket是否打开。你通过查看phpinfo信息了解socket是否打开。如下图:

查看phpinfo()关于socket的信息

◆产生一个服务器

现在我们把第一个例子进行完善。你需要监听一个指定的socket并且处理用户的连接。

<?php
$commonProtocol = getprotobyname("tcp");
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, 'localhost', 1337);
socket_listen($socket);
// Accept any incoming connections to the server
$connection = socket_accept($socket);
if($connection)
{
socket_write($connection, "You have connected to the socket.../n/r");
}
?>

你应该使用你的命令提示符来运行这个例子。理由是因为这里将产生一个服务器,而不是一个Web页面。如果你尝试使用Web浏览器来运行这个脚本,那么很有可能它会超过30秒的限时。你可以使用下面的代码来设置一个无限的运行时间,但是还是建议使用命令提示符来运行。
set_time_limit(0);
在你的命令提示符中对这个脚本进行简单测试:
Php.exe example01_server.php
如果你没有在系统的环境变量中设置php解释器的路径,那么你将需要给php.exe指定详细的路径。当你运行这个服务器端的时候,你能够通过远程登陆(telnet)的方式连接到端口1337来测试这个服务器。如下图:

上面的服务器端有三个问题:1. 它不能接受多个连接。2. 它只完成唯一的一个命令。3. 你不能通过Web浏览器连接这个服务器。
这个第一个问题比较容易解决,你可以使用一个应用程序去每次都连接到服务器。但是后面的问题是你需要使用一个Web页面去连接这个服务器,这个比较困难。你可以让你的服务器接受连接,然后些数据到客户端(如果它一定要写的话),关闭连接并且等待下一个连接。
在上一个代码的基础上再改进,产生下面的代码来做你的新服务器端:

<?php
// Set up our socket
$commonProtocol = getprotobyname("tcp");
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, 'localhost', 1337);
socket_listen($socket);
// Initialize the buffer
$buffer = "NO DATA";
while(true)
{
// Accept any connections coming in on this socket

$connection = socket_accept($socket);
printf("Socket connected/r/n");
// Check to see if there is anything in the buffer
if($buffer != "")
{
printf("Something is in the buffer...sending data.../r/n");
socket_write($connection, $buffer . "/r/n");
printf("Wrote to socket/r/n");
}
else
{
printf("No Data in the buffer/r/n");
}
// Get the input
while($data = socket_read($connection, 1024, PHP_NORMAL_READ))
{
$buffer = $data;
socket_write($connection, "Information Received/r/n");
printf("Buffer: " . $buffer . "/r/n");
}
socket_close($connection);
printf("Closed the socket/r/n/r/n");
}
?>

这个服务器端要做什么呢?它初始化一个socket并且打开一个缓存收发数据。它等待连接,一旦产生一个连接,它将打印“Socket connected”在服务器端的屏幕上。这个服务器检查缓冲区,如果缓冲区里有数据,它将把数据发送到连接过来的计算机。然后它发送这个数据的接受信息,一旦它接受了信息,就把信息保存到数据里,并且让连接的计算机知道这些信息,最后关闭连接。当连接关闭后,服务器又开始处理下一次连接。(翻译的烂,附上原文)
This is what the server does. It initializes the socket and the buffer that you use to receive
and send data. Then it waits for a connection. Once a connection is created it prints
“Socket connected” to the screen the server is running on. The server then checks to see if
there is anything in the buffer; if there is, it sends the data to the connected computer.
After it sends the data it waits to receive information. Once it receives information it stores
it in the data, lets the connected computer know that it has received the information, and
then closes the connection. After the connection is closed, the server starts the whole
process again.

◆产生一个客户端

处理第二个问题是很容易的。你需要产生一个php页连接一个socket,发送一些数据进它的缓存并处理它。然后你又个处理后的数据在还顿,你能够发送你的数据到服务器。在另外一台客户端连接,它将处理那些数据。
To solve the second problem is very easy. You need to create a PHP page that connects to
a socket, receive any data that is in the buffer, and process it. After you have processed the
data in the buffer you can send your data to the server. When another client connects, it
will process the data you sent and the client will send more data back to the server.

下面的例子示范了使用socket:

<?php
// Create the socket and connect
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$connection = socket_connect($socket,’localhost’, 1337);
while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ))
{
if($buffer == “NO DATA”)
{
echo(“<p>NO DATA</p>”);
break;
}
else
{
// Do something with the data in the buffer
echo(“<p>Buffer Data: “ . $buffer . “</p>”);
}
}
echo(“<p>Writing to Socket</p>”);
// Write some test data to our socket
if(!socket_write($socket, “SOME DATA/r/n”))
{
echo(“<p>Write failed</p>”);
}
// Read any response from the socket
while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ))
{
echo(“<p>Data sent was: SOME DATA<br> Response was:” . $buffer . “</p>”);
}
echo(“<p>Done Reading from Socket</p>”);
?>

这个例子的代码演示了客户端连接到服务器。客户端读取数据。如果这是第一时间到达这个循环的首次连接,这个服务器将发送“NO DATA”返回给客户端。如果情况发生了,这个客户端在连接之上。客户端发送它的数据到服务器,数据发送给服务器,客户端等待响应。一旦接受到响应,那么它将把响应写到屏幕上。

热点内容
安卓手机用什么软件防止别人蹭网 发布:2024-11-20 09:37:18 浏览:837
顶级asmr助眠解压赫敏 发布:2024-11-20 09:36:34 浏览:427
帝瓦雷算法 发布:2024-11-20 09:16:11 浏览:51
怎么查看一个ip地址服务器关闭 发布:2024-11-20 09:12:26 浏览:442
金钻文件夹加密大师是啥 发布:2024-11-20 09:01:22 浏览:881
苹果看手机配置怎么看 发布:2024-11-20 09:01:15 浏览:998
mysql慢sql语句 发布:2024-11-20 09:01:14 浏览:312
电脑搭建虚拟中文服务器 发布:2024-11-20 08:58:57 浏览:525
python服务器搭建 发布:2024-11-20 08:54:56 浏览:104
文件夹标绿 发布:2024-11-20 08:54:02 浏览:816