哪一天 哪一天 我有吃有穿有住有钱 不再流浪 流浪

bluehost nohup不能使用

bluehost貌似限制了nohup的使用

一旦终端离开了

nohup也结束了

所以只能通过ctontab变相的解决这个问题.

mysql中int整型数字范围

Type Bytes Minimum Value Maximum Value
(Signed/Unsigned) (Signed/Unsigned)
TINYINT 1 -128 127
0 255
SMALLINT 2 -32768 32767
0 65535
MEDIUMINT 3 -8388608 8388607
0 16777215
INT 4 -2147483648 2147483647
0 4294967295
BIGINT 8 -9223372036854775808 9223372036854775807
0 18446744073709551615

ubuntu下如何使用rc.local

打开/etc/rc.local文件
将需要执行的命令写在exit 0前面即可
譬如我要在开机时自动执行一个test.php文件
那么我的rc.local可以这样写
php /var/www/test.php
exit 0
注意test.php中的路径不要写死
用dirname之类的函数判断一下
我的ubuntu是8.10版本
如果你的/etc下没有rc.local文件
请google一下如何解决.

BLUEHOST SSH命令大全

Bluehost美国主机的cPanel目前的版本是Version 11.18.1已经相当的强大,足以满足我们日常的常规的操作,但如果你希望更加完全的自主,启用SSH吧,下面是搜集的SSH命令,也适合类似的虚拟主机。
rm -rf mydir /* 删除mydir目录 */
cd mydir /* 进入mydir目录 */
cd – /* 回上一级目录 */
cd ~ /* 回根目录 */
mv tools tool /* 把tools目录改名为tool */
ln -s tool bac

/* 给tool目录创建名为bac的符号链接,最熟悉的应该就是FTP中www链接到public_html目录了 */

cp -a tool /home/leavex/www /* 把tool目录下所有文件复制到www目录下 */
rm go.tar /* 删除go.tar文件 */
find mt.cgi /* 查找文件名为mt.cgi的文件 */
df –h /* 查看磁盘剩余空间,好像没这个必要,除非你太那个了 */
tar xvf wordpress.tar /* 解压tar格式的文件 */
tar -tvf myfile.tar /* 查看tar文件中包含的文件 */
gzip -d ge.tar.gz /* 解压.tar.gz文件为.tar文件 */
unzip phpbb.zip /* 解压zip文件,windows下要压缩出一个.tar.gz格式的文件还是有点麻烦的 */
tar cf toole.tar tool /* 把tool目录打包为toole.tar文件 */
tar cfz geek.tar.gz tool
/* 把tool目录打包且压缩为geek.tar.gz文件,因为.tar文件几乎是没有压缩过的,MT的.tar.gz文件解压成.tar文件后差不多是10MB */

wget http://www.sevenapart.com/download/wp.tar.gz
/*下载远程服务器上的文件到自己的服务器,连上传都省了,服务器不是100M就是1000M的带宽,下载一个2-3兆的MT还不是几十秒的事 */
wget -c http://www.eightapart.com/undone.zip
/* 继续下载上次未下载完的文件 */

tar cfz geek.tar.gz tool
/* 把tool目录打包且压缩为geek.tar.gz文件,因为.tar文件几乎是没有压缩过的,MT的.tar.gz文件解压成.tar文件后差不多是10MB */

还有一些是VIM里要用到的,也罗列出来吧!

移动类的:
h/j/k/l: 左/下/上/右 移一格
w : 向后词移动 (前面加数字移动多少个词)
b : 向前词移动 (前面加数字移动多少个词)
e : 向后移到词末
ge : 向前移到词末
$ : 行末
0 : 行首
tx : 向右查找本行的x并移到那儿(大写时向左)
33G : 移到文件的第33行
gg : 文件首行
G : 文件尾行
33% : 文件的33%处
H/M/L : 屏幕的首/中/尾行
zt/zz/zb : 当前行移到屏幕的首/中/底部

跳转:
” : 回到跳转来的地方
CTRL-O : 跳到一个 “较老” 的地方
CTRL-I : 则跳到一个 “较新” 的地方

查找:
/ : 向下查找(后加关键字)
? : 向上查找(后加关键字)
n : 下一条符合的记录

编辑:
i : 转换到插入模式
x : 删除当前字符
. : 重复最后一次的修改操作(同PS里ctrl+f执行滤镜)
u : 撤销操作
CTRL-R : 重做
p : 将删除的字符插入到当前位置(put)

退出保存:
:q : 退出
:q! : 不保存退出
ZZ : 保存后退出
:e! : 放弃修改重新编辑

退出SSH后,继续运行!
#nohup wget http://www.phpv.net/file.tar.gz &

wget是一个Linux环境下用于从World Wide Web上提取文件的工具,这是一个GPL许
可证
下的自由软件,其作者为Hrvoje Niksic 。wget支持HTTP和
FTP协议
,支持代理服务器和断点续传功能,能够自动递归远程主机的目录,找到合乎条件
的文
件并将其下载到本地硬盘上;如果必要,wget将恰当地转换页面中的超级连接以在
本地
生成可浏览的镜像。由于没有交互式界面,wget可在后台运行,截获并忽略
HANGUP信号
,因此在用户推出登录以后,仍可继续运行。通常,wget用于成批量地下载
Internet网
站上的文件,或制作远程网站的镜像。

语法:

wget [options] [URL-list]
URL地址格式说明:可以使用如下格式的URL:

http://host[:port]/path

例如:

http://fly.cc.fer.hr/

ftp://ftp.xemacs.org/pub/xemacs/xemacs-19.14.tar.gz
ftp://username:password@host/dir/file
在最后一种形式中,以URL编码形式为FTP主机提供了用户名和密码(当然,也可以
使用
参数提供该信息,见后)。

参数说明:

wget的参数较多,但大部分应用只需要如下几个常用的参数:
-r 递归;对于HTTP主机,wget首先下载URL指定的文件,然后(如果该文
件是
一个HTML文档的话)递归下载该文件所引用(超级连接)的所有文件(递归深度由
参数
-l指定)。对FTP主机,该参数意味着要下载URL指定的目录中的所有文件,递归方
法与
HTTP主机类似。

-N 时间戳:该参数指定wget只下载更新的文件,也就是说,与本地目录中
的对
应文件的长度和最后修改日期一样的文件将不被下载。

-m 镜像:相当于同时使用-r和-N参数。

-l 设置递归级数;默认为5。-l1相当于不递归;-l0为无穷递归;注意,
当递
归深度增加时,文件数量将呈指数级增长。

-t 设置重试次数。当连接中断(或超时)时,wget将试图重新连接。如
果指
定-t0,则重试次数设为无穷多。

-c 指定断点续传功能。实际上,wget默认具有断点续传功能,只有当你使
用别
的ftp工具下载了某一文件的一部分,并希望wget接着完成此工作的时候,才需要
指定
此参数。

使用举例:
wget -m -l4 -t0 http://oneweb.com.cn/
将在本地硬盘建立http://oneweb.com.cn/的镜像,镜像文件存入当前目录下一个
名为
oneweb.com.cn的子目录中(你也可以使用-nH参数指定不建立该子目录,而直接在
当前
目录下建立镜像的目录结构),递归深度为4,重试次数为无穷(若连接出现问题

wget将坚韧不拔地永远重试下去,知道任务完成!)

另外一些使用频率稍低的参数如下:
-A acclist / -R rejlist:
这两个参数用于指定wget接受或排除的文件扩展名,多个名称之间用逗号隔开。例
如,
假设我们不想下载MPEG视频影像文件和.AU声音文件,可使用如下参数:
-R mpg,mpeg,au

其它参数还有:
-L 只扩展相对连接,该参数对于抓取指定站点很有用,可以避免向宿主
主机
的其他目录扩散。例如,某个人网站地址为:http://www.xys.org/~ppfl/,使用
如下
命令行:
wget -L http://www.xys.org/~ppfl/
则只提取该个人网站,而不涉及主机www.xys.org上的其他目录。

-k 转换连接:HTML文件存盘时,将其中的非相对连接转换成为相对连接。

-X 在下载FTP主机上的文件时,排除若干指定的目录

另外,下面参数用于设置wget的工作界面:
-v 设置wget输出详细的工作信息。
-q 设置wget不输出任何信息。

如果我们已经在一个HTML文档(或普通文本文档)中存储了所要提取的文件的连接
,可
以让wget直接从该文件中提取信息,而不用在命令行中提供URL地址,参数格式为

-i filename
地址文件也可以不是HTML文档,例如,一个普通的文本文件,其中有需要下载的
URL列
表即可。
我们可以用以下技巧提高下载速度:由于Linux是一个多任务系统,我们可以同时
运行
多个wget进程以提高下载速度,例如,先下载某主页文件(index.html),然后将
该文
件所列出的所有地址分别用一个独立的wget进程进行下载。

至于其他的参数,可参考wget的man手册页,命令为:
man wget

Post in LAMP | No Comments »

DreamHost中shell使用指南
01月 28th, 2008
DreamHost中shell使用指南

1. Basic Instructions基本操作命令
通常来说,使用”$[Instructions] –help”可以获得以下各个命令[instructions]的帮助,包含其参数列表的定义。

-ls 列出当前文件夹下所有内容
$ls -o 列出当前文件夹中所有内容,含详细信息,但不列出group
$ls -l 同上,含group信息
$ls -a 列出当前文件夹中所有内容,包含以”.”开头的文件
$ls -t 按更改时间排序
$ls -v 按版本先后排序

-cd [dir] 进入文件夹

-pwd 显示当前路径

-mkdir [dir] 新建文件夹

-chmod 更改文件/文件夹权限
$chmod [Mode] [dir],其中Mode形如”755″或”777″等。
$chmod [Mode] [file]
$chmod -R [Mode] [dir],递归形式,即将目标文件夹内所有文件均改变权限
Mode还有另一种表达方式,”755″即为”-rwxr-xr-x”,不列举了。

-rm [file] 删除文件/文件夹
$rm -f [file] 强行删除,忽略不存在的文件,无提示
$rm -r [file] 递归删除所有内容

-cp 拷贝
$cp [options] [source] [destination]
其中[options]可以为-f(强行拷贝)或-r(递归拷贝)

-mv 重命名或移动
$mv [options] [source] [destination]
[options]常用:-f(强行移动/重命名), -i(移动/重命名前尝试), -u(更新)
例如
$mv wwwroot/cgi-bin . 将/cgi-bin目录移动到当前目录下
$mv cronfile.txt myfile.txt 将cronfile.txt重命名为myfile.txt

2. wget下载工具
wget是一种非交互式的网络文件下载工具,在linux下可以使用该工具快速地从网络上下载所需要的文件而不需要经由本地硬盘中转,而且速度极快。以下是一些使用方法:

wget [参数列表] URL

最简单的用法:

$wget http://targetdomain.com/file.tar

wget的常用参数:
· -t [nuber of times]:尝试次数,当wget无法与服务器建立连接时,尝试连接多少次。比如”-t120″表示尝试120次。当这一项为”0″的时候,指定尝试无穷多次直到连接成功为止,这个设置非常有用,当对方服务器突然关机或者网络突然中断的时候,可以在恢复正常后继续下载没有传完的文件;

· -c:断点续传,这也是个非常有用的设置,特别当下载比较大的文件的时候,如果中途意外中断,那么连接恢复的时候会从上次没传完的地方接着传,而不是又从头开始,使用这一项需要远程服务器也支持断点续传,一般来讲,基于UNIX/linux的Web/FTP服务器都支持断点续传;

· -T [number of seconds]:超时时间,指定多长时间远程服务器没有响应就中断连接,开始下一次尝试。比如”-T120″表示如果120秒以后远程服务器没有发过来数据,就重新尝试连接。如果网络速度比较快,这个时间可以设置的短些,相反,可以设置的长一些,一般最多不超过900,通常也不少于60,一般设置在 120左右比较合适;

· -w [number of seconds]:在两次尝试之间等待多少秒,比如”-w 100″表示两次尝试之间等待100秒;

· -nd:不下载目录结构,把从服务器所有指定目录下载的文件都堆到当前目录里;

· -x:与”-nd”设置刚好相反,创建完整的目录结构,例如”wget -nd http://www.gnu.org/ “,实际的目录结构一级一级建下去,直到所有的文件都传完为止;

· -nH:不创建以目标主机域名为目录名的目录,将目标主机的目录结构直接下到当前目录下;

· -r:递归下载,在本机建立服务器端目录结构;

· -l [depth]:下载远程服务器目录结构的深度,例如”-l 5″下载目录深度小于或者等于5以内的目录结构或者文件;

· -m:做站点镜像时的选项,如果你想做一个站点的镜像,使用这个选项,它将自动设定其他合适的选项以便于站点镜像;

· -np:只下载目标站点指定目录及其子目录的内容。这也是一个非常有用的选项,我们假设某个人的个人主页里面有一个指向这个站点其他人个人主页的连接,而我们只想下载这个人的个人主页,如果不设置这个选项,甚至–有可能把整个站点给抓下来,这显然是我们通常不希望的;

· –http-user=username
· –http-passwd=password:如果Web服务器需要指定用户名和口令,用这两项来设定;

· -O 将数据写入文件中。

3. Crontab 定时执行任务

DreamHost系统下, 通过Shell可以建立自己的crontab. 具体使用如下:
使用支持shell登录的终端(如fterm或putty), 地址栏输入 username@hostguide.cn:22即可以SSH方式登录至服务器.

常用的crontab命令:
crontab -l 显示所有现存cron job.

crontab -r 删除当前cron jobs.

crontab -e 编辑当前 “crontab file”. DH推荐使用nano

注意你的crontab包含所有的cron jobs, 每个cron一行, 断行结尾. 一个正常的cron如下所示:

45 2 * * * /home/user/script.pl
第一个数字是每小时的第几分钟,
第二个数字是每天的第几小时,
第三个数字是每月的第几天,
第四个数字是每年的第几月,
第五个数字是每周的第几天.

使用方式例如:
32 * * * * : 表示每小时的第32分钟.
12,42 * * * * : 表示每小时的第12及第42分钟两次
*/15 */2 * * *: 表示0:00, 0:15, 0:30, 0:45, 2:00, 2:15, 2:30, …
43 18 * * 7: 表示每个周日的6:43pm运行命令行.

在DreamHost下使用nano编辑完文件后,使用ctrl+o保存,ctrl+x退出编辑。

4. tar命令
tar命令的使用方法如下:

tar [参数列表] [文件名]

参数列表:
-c 生成新的备份,并同时覆盖旧的备份文件
-x 从备份文件中解压缩
-t 列出备份文件内的文件目录
-v 显示所有被操作文件列表
-f 在指定位置生成备份
-u 将不存在于备份中的文件,或将已经被更改的文件加入该备份中。

举例说明:
tar cvf filename.tar /*制作备份*/
tar cvf tarfile.tar ./filename /*将filename的文件备份到tarfile.tar里面*/
tar tvf filename.tar /*列出tar文档的内容*/
tar xvf filename.tar /*从tar文档中导出文件*/
tar zxpvf filename.tar.gz /*从tar.gz文档中导出文件*/
tar zxvf filename.tar.gz /*同上*/
tar xvf tarfile.tar ./filename /*导出tar文件中的单个文件*/

5. vi编辑器
Linux下很易用的一种编辑器,只需要稍微知道几个指令即可应用。

打开vi:
$vi [filename]:打开或新建文件,并将光标置于第一行首
$vi +n [filename] :打开文件,并将光标置于第n行首
$vi + [filename] :打开文件,并将光标置于最后一行首
$vi +/pattern [filename]:打开文件,并将光标置于第一个与pattern匹配的串处
$vi -r [filename] :在上次正用vi编辑时发生系统崩溃,恢复filename
$vi [filename]….[filename] :打开多个文件,依次编辑

如果filename不存在,则自动生成一个名字filename的新文件。

vi共有两种状态:命令状态/编辑状态

编辑状态下:
第一次按下insert键为”insert”模式,再按一下为”replace”模式,使用ESC返回命令状态;
在此状态下键盘的PgUp/PgDn/Insert/Delete/Home/End/方向键,均处于正常功能状态。

命令状态下:
输入的字符串作为命令处理,使用”insert”键切换到编辑状态;
以下是命令状态下的命令清单:

移动光标类命令
h :光标左移一个字符
l :光标右移一个字符
space:光标右移一个字符
Backspace:光标左移一个字符
k或Ctrl+p:光标上移一行
j或Ctrl+n :光标下移一行
Enter :光标下移一行
w或W :光标右移一个字至字首
b或B :光标左移一个字至字首
e或E :光标右移一个字j至字尾
) :光标移至句尾
( :光标移至句首
}:光标移至段落开头
{:光标移至段落结尾
nG:光标移至第n行首
n+:光标下移n行
n-:光标上移n行
n$:光标移至第n行尾
H :光标移至屏幕顶行
M :光标移至屏幕中间行
L :光标移至屏幕最后行
0:(注意是数字零)光标移至当前行首
$:光标移至当前行尾

屏幕翻滚类命令
Ctrl+u:向文件首翻半屏
Ctrl+d:向文件尾翻半屏
Ctrl+f:向文件尾翻一屏
Ctrl+b;向文件首翻一屏
nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。

插入文本类命令
i :在光标前
I :在当前行首
a:光标后
A:在当前行尾
o:在当前行之下新开一行
O:在当前行之上新开一行
r:替换当前字符
R:替换当前字符及其后的字符,直至按ESC键
s:从当前光标位置处开始,以输入的文本替代指定数目的字符
S:删除指定数目的行,并以所输入文本代替之
ncw或nCW:修改指定数目的字
nCC:修改指定数目的行

删除命令
ndw或ndW:删除光标处开始及其后的n-1个字
do:删至行首
d$:删至行尾
ndd:删除当前行及其后n-1行
x或X:删除一个字符,x删除光标后的,而X删除光标前的
Ctrl+u:删除输入方式下所输入的文本

搜索及替换命令 :
/pattern:从光标开始处向文件尾搜索pattern
?pattern:从光标开始处向文件首搜索pattern
n:在同一方向重复上一次搜索命令
N:在反方向上重复上一次搜索命令
:s/p1/p2/g:将当前行中所有p1均用p2替代
:n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g:将文件中所有p1均用p2替换

选项设置
all:列出所有选项设置情况
term:设置终端类型
ignorance:在搜索中忽略大小写
list:显示制表位(Ctrl+I)和行尾标志($)
number:显示行号
report:显示由面向行的命令修改过的数目
terse:显示简短的警告信息
warn:在转到别的文件时若没保存当前文件则显示NO write信息
nomagic:允许在搜索模式中,使用前面不带“\”的特殊字符
nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始
mesg:允许vi显示其他用户用write写到自己终端上的信息

最后行方式命令
:n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下
:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下
:n1,n2 d :将n1行到n2行之间的内容删除
:w :保存当前文件
:e filename:打开文件filename进行编辑
:x:保存当前文件并退出
:q:退出vi
:q!:不保存文件并退出vi
:!command:执行shell命令command
:n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指
定n1,n2,则表示将整个文件内容作为command的输入
:r!command:将命令command的输出结果放到当前行 。Adminis

Post in LAMP | No Comments »

mysql的一些乱七八糟的东西
01月 27th, 2008
mysql的一些乱七八糟的东西 使用MYSQL半年,自己经常用的东西- -

Mysql –h192.168.0.110 –uks –p –P4444登录

Mysqladmin –h192.168.0.110-uks –p reload重新加载用户表

Mysqldump –R –h192.168.0.110 –uks –p test>c:/test.sql备份

Mysql –h192.168.0.110 –uks –p test

Windows下net stop mysql关闭服务

Net start mysql 开启服务

Linux下 service mysql stop关闭

Service mysql start 开启

Service mysql restart重启服务

Linux下开机自动启动mysql

#>chkconfig –add mysql 开机启动

Chkconfig –del mysql 关闭自动启动

Chkconfig – -list 查看服务启动情况

Mysql命令行下

Explain select……..查看该SELECT语句信息

Show variables查看系统变量

Show status 常看当前服务器状态

Show databases;

Show tables;

Show processlist

Show warnings;(查看最近一个警告或错误)

Set global xxxx=xxxx;

Flush ……清楚mysql使用的部分内部缓存

Information_schema.tables表信息

Mysql动态语句5.1

只支持create table,delete,do ,insert,replace,select set ,update语句

Describe tablename查看该表结构

Optimize table XXX 清理该表中已删除的链接(可以释放一些资源)

Source c:abc.sql 在MYSQL命令行中执行脚本

Select

Create

Insert

Update

Alter

Grant

revoke

就不说了= =

Mysql 数据库名最长 64位字符串

表名….. 64位字符串

字段名……. 64位字符串

用户名…….. 16位字符串

密码……… 貌似没限制

Handler(很牛X的东东)

Handler testt open as abc;

Handler abc read id=(123456);

Handler abc close;

Benchmark(n,expr)执行N次EXPR并测算时间

Post in LAMP | No Comments »

MYSQL在命令行创建存储过程
01月 27th, 2008
MYSQL在命令行创建存储过程 如何在MYSQL命令行创建存储过程

今天早上在百度知道碰到这个问题,我开始没看明白…….后来才知道提问人的意思是要在命令行下创建存储过程。很感谢这个问题,因为我也不会呵呵,我一直都用EMS创建这些东西…….

我也尝试了一些方法,但是第一个分号mysql就以为语句结束了,就拿那个例子来说:

CREATE PROCEDURE p7 (IN b INTEGER(12))

begin

declare a INTEGER(12);

set a=5;

INSERT INTO t VALUES (a);

SELECT s1*a FROM t WHERE b<=s1;

End

这个存储过程,在命令行直接创建的话,在第三排你输入分号后就报错了……因为MYSQL以为这个语句结束了,那对于MYSQL而言

CREATE PROCEDURE p7 (IN b INTEGER(12))

begin

declare a INTEGER(12);

肯定是个错误语句。

然后看了些东西,原来要加分隔符- -……….

DELIMITER //

CREATE PROCEDURE p7 (IN b INTEGER(12))

begin

declare a INTEGER(12);

set a=5;

INSERT INTO t VALUES (a);

SELECT s1*a FROM t WHERE b<=s1;

End

//

就OK了…………意思就是说在//……//之间的当成一个语句执行所以MYSQL接到的才是这个存储过程完整的创建语句。

Post in LAMP | No Comments »

mysql 基本命令
01月 27th, 2008
基础介绍:

1.在linux下使用下列命令,请确认mysql的bin目录是否已经加入到PATH路径中,或者是已经进入到mysql安装路径下的bin目录
查看PATH
shell> echo $PATH
或者
shell> cd /usr/local/mysql/bin

2.windows下,请运行cmd后,同样检查mysql的bin目录是否已加入到系统的PATH路径中,或直接进入mysql的安装目录

下面所有操作都是确认你以检查mysql的bin目录已加入到系统的PATH路径中,或已经进入mysql的安装目录的bin目录下

1]如何创建mysqld数据库的管理用户?

数据库安装好后,我们应该为mysql数据库创建一个管理帐号。要把root用户设置为管理员,我们应该运行下面的命令;

shell> mysqladmin -u root password 123456

通过上面的命令,我们可以知道,mysql数据库的管理员是root,密码是123456。

2]如何进入mysql数据库?以mysql数据库管理员root,密码为123456为例;

shell> mysql -uroot -p123456

输出上面的命令后,出现的是如下的提示;

Welcome to the MySQL monitor. Commands end with ; or /g.
Your MySQL connection id is 6 to server version: 3.23.58

Type ‘help;’ or ‘/h’ for help. Type ‘/c’ to clear the buffer.

mysql>

注意:操作这些命令的时候,应该把mysqld服务器打开。这些新手兄弟早就知道了吧:)

3]如何在数据库中操作命令呢,我想这是mysql手册都有的,我主要说几个要注意的地方。其实我也会不了几个命令。如果自己想学的弟兄,也不是什么难事;在windows中操作过mysql的,其实在这里也是一样的,mysql是跨平台的数据库,用法都是相同的。

在mysql数据库中,每操作一个命令,都是;号结尾的,可能有的新手弟兄,忘记输入了;号结尾,结果退不出来。:):)

1]查看mysql中都有哪些数据库?

代码:
mysql>
show databases;
+———-+
| Database |
+———-+
| mysql |
| test |
+———-+
2 rows in set (0.00 sec) mysql>
在mysql安装好,设置好管理员后,第一次进入系统,我们用show databases;命令查看数据库的列表,发现有两个数据库,mysql和test,这是系统自建的,是让大家练习用的。

4]如何创建和删除一个数据库?

比如我要创建一个名为linux的数据库,应该运行如下命令

mysql> create database [数据库名];

所以我们应该运行如下的命令,来创建名为linux的数据库

mysql> create database linux;
Query OK, 1 row affected (0.00 sec)

是不是建好了呢??肯定是建好了,因为都有OK了:)

查看是不是有linux这个数据库了呢?

代码:
mysql> show databases;
+———-+
| Database |
+———-+
| linux |
| mysql |
| test |
+———-+
3 rows in set (0.00 sec)

那我们如何删除一个数据库呢??
mysql> drop database [数据库名];

比如我们要把刚才创建的linux数据库删除,应该用下面的命令;
mysql> drop database linux;
Query OK, 0 rows affected (0.00 sec)

是不是已经删除了呢??

代码:
mysql> show databases;
+———-+
| Database |
+———-+
| mysql |
| test |
+———-+
2 rows in set (0.00 sec)

5]如何操作一个数据库呢,这个问题就比较多了,建议还是看一下mysql的手册吧。里面的东西太多了。如果操作一个数据库,首先是要指定一个数据库为当前数据库,应该用use命令

mysql>use [数据库];

比如我想指定linux这个数据库为当前数据库,应该是

mysql> use linux;
Database changed

6]如何备份数据库??

比如我们要备份mysql中已经存在的名为linux的数据库,要用到命令mysqldump

命令格式如下:

shell> mysqldump -uroot -p linux > /root/linux.sql
Enter password:在这里输入数据库的密码

通过上面的命令,我们要明白两件事,首先备份数据库是要以数据库管理员的身份备份;其次:备份目的地是/root,备份的文件名是linux.sql。其实备份的位置和文件名,根据自己的情况来定。文件名可以自己来取,路径也可以自己来安排;

比如我想把linux的数据库备份到/home/beinan,数据库的文件名为linuxsir031130.sql,所以应该输入如下的命令。
shell> mysqldump -uroot -p linux > /home/beinan/linuxsir031130.sql
Enter password:在这里输入数据库管理员root的数据库密码

这样我们到/home/beinan目录下就能发现mysql中名为linux的数据库的备份文件linuxsir031130.sql

综上所述,我们学习时要学会变通。:):)

5]如何把把备份的数据库导入到数据库中?

首先我们还是要操作上面几个过程,比如添加数据库管理员(如果您没有添加过mysql数据库管理员的话),创建数据库等。

比如我们要把在/home/beinan这个目录中的linuxsir031130.sql这个备份,导入名为linux的数据库中,应该如下操作;

shell> mysql -uroot -p linux < /home/beinan/linuxsir031130.sql
Enter password:在这里输入密码

如果机器好,数据库比较小,几分钟就好了。

6]其它一些比较常用的mysql指令;

查看状态
mysql> show status;

查看进程

代码:
mysql> show processlist;
+—-+——+———–+——+———+——+——-+——————+| Id | User | Host | db | Command | Time | State | Info |
+—-+——+———–+——+———+——+——-+——————+| 16 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+—-+——+———–+——+———+——+——-+——————+
1 row in set (0.00 sec)

查看表,应该先指定一个数据库为当前数据库;比如是名为linux的数据库;

mysql>use linux;
mysql> show tables;
Empty set (0.00 sec)

7]对mysql数据库常用命令的一点补充;

几个常用的mysql相关的管理命令

mysql 命令:基本文本的,显示和使用的mysql数据库。前面已经简单的提过用法;比如登录等。

mysqladmin 命令,用来创建和维护mysql数据库的命令,前面已经简单的提过;

isamchk 是用来修复、检查和优化.ism后缀的数据库文件;

mysqldump 是用于备份数据库,前面已经简单的说明过;

myisamchk 用来修复.myi后缀的数据库文件;

比如我们要检查名为linux的数据库.myi数据库表是否存在问题,应该用下面的命令;

要把mysqld服务器停下来
shell> ../share/mysql.server stop

然后执行
shell> myisamchk ../var/linux/*.MYI

上面的命令的意思就是检查所有的.myi文件,数据库的目录在../var/linux/目录中

如果有问题,应该用-r参数来修复
shell> myisamchk -r ../var/linux/*.MYI

6]mysqlshow 命令:显示用户选择的数据库和表
shell> mysqlshow -uroot -p [数据库名]

比如我要查看名为linux的数据库;应该是:

shell> mysqlshow -uroot -p linux

好了,到这里,你可能已经知道命令行下的所有基本操作了~

ps:补充一个。。

更改ROOT帐号名。

update set user=”新名字” where user=”旧名字”;

自己补充:
在windows中的关闭mysql命令 net stop mysql ;启动是net start mysql
OPTIMIZE TABLE “;优化表

Post in LAMP | No Comments »

ib_logfile0和ib_logfile1,为INNODB数据LOG文件
01月 27th, 2008
ASK:我的系统是windows2003,最近装了MYSQL5.0后发现C盘容量剧减,后来仔细检查了一下,发现ib_logfile0和 ib_logfile1竟然用了600多M,现在C盘8G的空间就剩余200M了,请问我要怎样转移ib_logfile0和ib_logfile1文件到D盘呢?

DA: ib_logfile0和ib_logfile1,为INNODB数据LOG文件,先停下数据库.
将这三个文件拷到它处
修改MY.INI配置文件, 参数改为新目录
—————————
innodb_log_group_home_dir

The directory path to the InnoDB log files. It must have the same value as innodb_log_arch_dir. If you do not specify any InnoDB log parameters, the default is to create two 5MB files names ib_logfile0 and ib_logfile1 in the MySQL data directory.
————
再启动

不过有个问题,LOG文件是固定不变,用来存储未提交的数据,一般设为几十兆就可以了,你的是否设置有问题.
本文转自(么么在线)

nohup让Linux下程序永远在后台执行

nohup 命令
用途:LINUX命令用法,不挂断地运行命令。
语法:nohup Command [ Arg ... ] [ & ]
描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。
如果不将 nohup 命令的输出重定向,输出将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。
退出状态:该命令返回下列出口值:
126 可以查找但不能调用 Command 参数指定的命令。
127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。
否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。
nohup命令及其输出文件
nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。
该命令的一般形式为:nohup command &
使用nohup命令提交作业
如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:
nohup command > myout.file 2>&1 &
在上面的例子中,输出被重定向到myout.file文件中。
使用 jobs 查看任务。
使用 fg %n 关闭。
另外有两个常用的ftp工具ncftpget和ncftpput,可以实现后台的ftp上传和下载,这样我就可以利用这些命令在后台上传和下载文件了。

Linux crontab-自动化的任务

原文链接 http://www.eygle.com/digest/2006/01/hwoto_linux_crontab.html

在 Linux 中,任务可以被配置在指定的时间段、指定的日期、或系统平均载量低于指定的数量时自动运行。红帽企业 Linux 预配置了对重要系统任务的运行,以便使系统能够时时被更新。譬如,被 locate 命令使用的 slocate 数据库每日都被更新。系统管理员可使用自动化的任务来执行定期备份、监控系统、运行定制脚本等等。

红帽企业 Linux 随带几个自动化任务的工具:cron、at、和 batch。
37.1. cron

cron 是一个可以用来根据时间、日期、月份、星期的组合来调度对重复任务的执行的守护进程。

cron 假定系统持续运行。如果当某任务被调度时系统不在运行,该任务就不会被执行。

要使用 cron 服务,你必须安装了 vixie-cron RPM 软件包,而且必须在运行 crond 服务。要判定该软件包是否已安装,使用 rpm -q vixie-cron 命令。要判定该服务是否在运行,使用 /sbin/service crond status 命令。
37.1.1. 配置 cron 任务

cron 的主配置文件是 /etc/crontab,它包括下面几行:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

前四行是用来配置 cron 任务运行环境的变量。SHELL 变量的值告诉系统要使用哪个 shell 环境(在这个例子里是 bash shell);PATH 变量定义用来执行命令的路径。cron 任务的输出被邮寄给 MAILTO 变量定义的用户名。如果 MAILTO 变量被定义为空白字符串(MAILTO=”"),电子邮件就不会被寄出。HOME 变量可以用来设置在执行命令或脚本时使用的主目录。

/etc/crontab 文件中的每一行都代表一项任务,它的格式是:

minute hour day month dayofweek command

*

minute — 分钟,从 0 到 59 之间的任何整数
*

hour — 小时,从 0 到 23 之间的任何整数
*

day — 日期,从 1 到 31 之间的任何整数(如果指定了月份,必须是该月份的有效日期)
*

month — 月份,从 1 到 12 之间的任何整数(或使用月份的英文简写如 jan、feb 等等)
*

dayofweek — 星期,从 0 到 7 之间的任何整数,这里的 0 或 7 代表星期日(或使用星期的英文简写如 sun、mon 等等)
*

command — 要执行的命令(命令可以是 ls /proc >> /tmp/proc 之类的命令,也可以是执行你自行编写的脚本的命令。)

在以上任何值中,星号(*)可以用来代表所有有效的值。譬如,月份值中的星号意味着在满足其它制约条件后每月都执行该命令。

整数间的短线(-)指定一个整数范围。譬如,1-4 意味着整数 1、2、3、4。

用逗号(,)隔开的一系列值指定一个列表。譬如,3, 4, 6, 8 标明这四个指定的整数。

正斜线(/)可以用来指定间隔频率。在范围后加上 / 意味着在范围内可以跳过 integer。譬如,0-59/2 可以用来在分钟字段定义每两分钟。间隔频率值还可以和星号一起使用。例如,*/3 的值可以用在月份字段中表示每三个月运行一次任务。

开头为井号(#)的行是注释,不会被处理。

如你在 /etc/crontab 文件中所见,它使用 run-parts 脚本来执行 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 目录中的脚本,这些脚本被相应地每小时、每日、每周、或每月执行。这些目录中的文件应该是 shell 脚本。

如果某 cron 任务需要根据调度来执行,而不是每小时、每日、每周、或每月地执行,它可以被添加到 /etc/cron.d 目录中。该目录中的所有文件使用和 /etc/crontab 中一样的语法。

# record the memory usage of the system every monday
# at 3:30AM in the file /tmp/meminfo
30 3 * * mon cat /proc/meminfo >> /tmp/meminfo
# run custom script the first day of every month at 4:10AM
10 4 1 * * /root/scripts/backup.sh

例 37-1. crontab 的例子

根用户以外的用户可以使用 crontab 工具来配置 cron 任务。所有用户定义的 crontab 都被保存在 /var/spool/cron 目录中,并使用创建它们的用户身份来执行。要以某用户身份创建一个 crontab 项目,登录为该用户,然后键入 crontab -e 命令,使用由 VISUAL 或 EDITOR 环境变量指定的编辑器来编辑该用户的 crontab。该文件使用的格式和 /etc/crontab 相同。当对 crontab 所做的改变被保存后,该 crontab 文件就会根据该用户名被保存,并写入文件 /var/spool/cron/username 中。

cron 守护进程每分钟都检查 /etc/crontab 文件、etc/cron.d/ 目录、以及 /var/spool/cron 目录中的改变。如果发现了改变,它们就会被载入内存。这样,当某个 crontab 文件改变后就不必重新启动守护进程了。
37.1.2. 控制对 cron 的使用

/etc/cron.allow 和 /etc/cron.deny 文件被用来限制对 cron 的使用。这两个使用控制文件的格式都是每行一个用户。两个文件都不允许空格。如果使用控制文件被修改了,cron 守护进程(crond)不必被重启。使用控制文件在每次用户添加或删除一项 cron 任务时都会被读取。

无论使用控制文件中的规定如何,根用户都总是可以使用 cron。

如果 cron.allow 文件存在,只有其中列出的用户才被允许使用 cron,并且 cron.deny 文件会被忽略。

如果 cron.allow 文件不存在,所有在 cron.deny 中列出的用户都被禁止使用 cron。
37.1.3. 启动和停止服务

要启动 cron 服务,使用 /sbin/service crond start 命令。要停止该服务,使用 /sbin/service crond stop 命令。推荐你在引导时启动该服务

jabber协议概述中文版(转载六)

7. 使用用例

这一部分提供一些在Jabber协议上略有不同的观点,通过用例来阐述。下面每一个例子都展示一个Jabber用户完成一个完整的任务的消息流程,该流程包括接收和发送,如注册到一台服务器,登陆,改变当前状态,或者发送一条消息。如果时间允许,我将把这部分引申的更远。

7.1. Jabber用户注册

本用例同时邪显示Jabber用户向服务器开启一个socket的连接,以及服务器的响应(如:<stream:stream>标签)。

1. Jabber用户通过开启一个从客户端到服务器端的XML流,来申请一个在服务器上的socket连接。

SEND: <stream:stream

to=’capulet.com’

xmlns=’jabber:client’

xmlns:stream=’http://etherx.jabber.org/streams’>

2. 服务器通过开启一个从服务器到客户端的XML流进行回复。

RECV: <stream:stream

from=’capulet.com’

id=’180763465′

xmlns=’jabber:client’

xmlns:stream=’http://etherx.jabber.org/streams’>

3. Jabber用户提供一个需要注册一个帐号(理论上,这需要一个不同的顺序:首先询问服务器需要什么信息,然后服务器器告知客户端需要什么样的信息;但在实际中,假定需要的信息是:用户名,资源,密码)的信息。

SEND: <iq id=’1′ type=’set’>

<query xmlns=’jabber:iq:register’>

<username>Juliet</username>

<resource>balcony</resource>

</query>

</iq>

4. 服务器响应一个空的类型为”result”的iq元素,表示注册已成功。

RECV: <iq id=’1′ type=’result’/>

7.2. Jabber用戶登陆

1. Jabber用户询问服务器,登陆所需要提供的信息。

SEND: <iq id=’2′ type=’get’>

<query xmlns=’jabber:iq:auth’>

<username>Juliet</username>

</query>

</iq>

2. 服务器提示Jabber用户登陆所需要的信息。

RECV: <iq id=’2′ type=’result’>

<query xmlns=’jabber:iq:auth’>

<username>Juliet</username>

<password/>

<digest/>

<sequence>500<sequence/>

<token>3B905BFD</token>

<resource/>

</query>

</iq>

3. Jabber用户提供所需的信息–在本例中,是一个<hash/>元素,它是对信息进行一个零度知识认证的一个哈希。(详情请见http://docs.jabber.org/draft-proto/html/zerok.html)。

SEND: <iq id=’3′ type=’set’>

<query xmlns=’jabber:iq:auth’>

<username>Juliet</username>

<resource>balcony</resource>

<hash>77d7eacde5e56b9622d0a075cb88361b110f

b9d7</hash>

</query>

</iq>

4. 服务器响应一个空的类型为”result”的iq元素,表明登陆成功。

RECV: <iq id=’3′ type=’result’/>

5. Jabber用户发送当前状态给服务器,表明其在线。

SEND: <presence>

<status>Online</status>

</presence>

7.3. Jabber用户增加一个联系人

1. Jabber客户端在花名册上增加一个联系人(只是预备的操作)。

SEND: <iq type=’set’>

<query xmlns=’jabber:iq:roster’>

<item jid=’romeo@montague.net’

Name=’remeo’/>

</query>

</iq>

2. Jabber用户发送一个对该联系人的订阅请求。

SEND: <presence to’remeo@montague.net’ type=’subscribe’>

<status>Wherefore are thou?</status>

</presence>

3. 服务器发送一个花名单推送给用户一个新条目和一个类型为”none”的订阅(早已有了该订阅)。

RECV: <iq type=’set’>

<query xmlns=’jabber:iq:roster’>

<item jid=’romeo@montague.net’

name=’romeo’

subscription=’none’/>

</query>

</iq>

4. 服务器发送一个类型为”result”的iq包,表示花名册推送成功(让人有点疑惑的是,这个包是从Jabber用户发送到Jabber用户的!)

RECV: <iq

from=’juliet@capulet.com/balcony’

to=’julie@capulet.com/balcony’

type=’result’>

5. 服务器发送另一个花名单推送,这次是ask=’subscribe’属性,表示订阅的状态未定。

RECV: <iq type=’set’>

<query xmlns=’jabber:iq:roster’>

<item

ask=’subscribe’

jid=’romeo@montague.net’

name=’romeo’

subscription=’none’/>

</query>

</iq>

6. Romeo对订阅请求的下一个响应会是什么呢?现在我们假定订阅以Romeo接受订阅请求为”结束”的。

RECV: <presence

from=’romeo@montague.net’

to=’juliet@capulet.com’

type=’subscribed’/>

7. 服务器再次发送一个花名单推送给客户端,这次subscription=’to’,表示订阅请求被接受了(Juliet现在可以订阅到Romeo的当前状态了)。

RECV: <iq type=’set’>

<query xmlns=’jabber:iq:roster’>

<item

jid=’romeo@montague.net’

name=’romeo’

subscription=’to’/>

</query>

</iq>

7.4. Jabber用户获得花名册

SEND: <iq type=’get’>

<query xmlns=’jabber:iq:roster’/>

</iq>

RECV:<iq from=’juliet@capulet.com/balcony’ type=’result’>

<query xmlns=’jabber:iq:roster’>

<item

jid=’romeo@montague.net’

name=’romeo’

subscription=’both’/>

</query>

</iq>

7.5. Jabber用户发送一条消息

SEND: <message to’romeo@montague.net’>

<body>Wherefore are thou?</body>

</message>

注意:服务器会根据Jabber用户的会话信息加上一个源地址,这样接收者收到消息时,消息中已经包含了源地址。

7.6. Jabber用户改变当前状态

SEND: <presence>

<status>stepped away…</status>

<show>away</show>

</presence>

7.7. Jabber用户登出

登出时很容易的,只需要关闭<stream>……

SEND: </stream:stream>

RECV: </stream:stream>

8. 参考文献

本协议参考以下文献

l Jabber开发指南(http://docs.jabber.org/jpg/

l Jabber协议–标准(http://docs.jabber.org/proto/

l Jabber协议–草案(http://docs.jabber.org/draft-proto/

l Romeo and Juliet

(http://tech-two.mit.edu/Shakespeare/Tragedy/romoandjuliet/full.html)

9. 结束语

本文档提供了一个关于Jabber的XML协议的一个详细的怪数。如果你对本文档有任何问题,请通过email或Jabber的方式自由地与作者联系(Peter Saint-Andre),他的帐号时stpeter@jabber.org。

10. 版权信息

This document is copyright 2001 by Peter Saint-Andre.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License (http://www.gnu.org/copyleft/fdl.html),

Version 1.1 or any later version published by the Free Software Foundation, with no

Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You may obtain a

copy of the GNU Free Documentation License from the Free Software Foundation by

visiting http://www.fsf.org/ or by writing to:

The Free Software Foundation, Inc.

59 Temple Place – Suite 330

Boston, MA 02111-1307

USA

附录 A 标准错误代码

下面是Jabber中错误代码的一些简要描述。Jabber服务器在碰到不同的错误条件下生成这些错误代码。一般Jabber错误代码以HTTP规格的RFC 2616(http://www.ietf.org/rfc/rfc2616.txt)为基础。但Jabber没有使用所有的HTTP的错误代码,并且Jabber错误代码与HTTP错误代码相对应时,通常只有Jabber自己的含义。注意本附录只包含Jabber服务器生成的错误代码,而不包括服务器端组件如网关发到外部消息系统。

错误代码 描述 注意
302 重定向 尽管HTTP规定中包含八种不同代码来表示重定向,Jabber只用了其中一个(用来代替所有的重定向错误)。不过Jabber代码302是为以后的功能预留的,目前还没有用到
400 坏请求 Jabber代码400用来通知Jabber客户端,一个请求因为其糟糕的语法不能被识别。例如,当一个Jabber客户端发送一个的订阅请求给它自己活发送一条没有包含”to”属性的消息,Jabber代码400就会产生。
401 未授权的 Jabber代码401用来通知Jabber客户端它们提供的是错误的认证信息,如,在登陆一个Jabber服务器时使用一个错误的密码,或未知的用户名。
402 所需的费用 Jabber代码402为未来使用进行保留,目前还不用到。
403 禁止 Jabber代码403被Jabber服务器用来通知Jabber客户端该客户端的请求可以识别,但服务器拒绝执行。目前只用在注册过程中的密码存储失败。
404 没有找到 Jabber代码404用来表明Jabber服务器找不到任何与JabberID匹配的内容,该JabberID是一个Jabber客户端发送消息的目的地。如,一个用户打算向一个不存在的JabberID发送一条消息。如果接受者的Jabber服务器无法到达,将发送一个来自500级数的错误代码。
405 不允许的 Jabber代码405用在不允许操作被’from’地址标识的JabberID。例如,它可能产生在,一个非管理员用户试图在服务器上发送一条管理员级别的消息,或者一个用户试图发送一台Jabber服务器的时间或版本,或者发送一个不同的JabberID的vCard。
406 不被接受的 Jabber代码406用于服务器因为某些理由不接受一个包。例如,这个可能发生在,一个Jabber客户端试图使用jabber:iq:private在服务器上存储信息,但当前的用于存储的名字空间用”jabber:”开头(在Jabber里是一个被存的XML开头)。另一种可能产生406错误的情况是当一个Jabber客户端试图用一个空密码注册到一台Jabber服务器上。
407 必须注册 Jabber代码407当前不被使用
408 注册超时 当一个Jabber客户端不能在服务器准备好的时间内发起一个请求时,Jabber服务器生成Jabber代码408。这个代码当前只用于Jabber会话管理器使用的零度认证模式中。
409 冲突
500 服务器内部错误 当一台Jabber服务器遇到一种预期外的条件,该条件阻止服务器处理来自Jabber客户端的包,这是将用到Jabber代码500。现在,唯一会引发500错误代码的时间是当一个Jabber客户端试图通过服务器认证,而该认证因为某些原因没有被处理(如无法保存密码)。
501 不可执行 当服务器不支持Jabber客户端请求的功能,使用Jabber代码501。例如,该代码只当Jabber客户端发送一个认证请求,而该认证请求不包含服务器配置中定义的任何一种认证方式时,服务器发送Jabber代码501。这个代码还被用于,当一个Jabber客户端试图注册一个不允许注册的服务器。
502 远程服务器错误 当因为无法到达远程服务器导致转发一个包失败时,使用Jabber代码502。该代码发送的特殊例子包括一个远程服务器的连接的失败,无法获取远程服务器的主机名,以及远程服务器错误导致的外部时间过期。
503 服务无法获得 当一个Jabber客户端请求一个服务,而Jabber服务器通常由于一些临时原因无法提供该服务时,使用Jabber代码503。例如,一个Jabber客户端试图发送一条消息给另一个用户,该用户不在线,但它的服务器不提供离线存储服务,服务器将返回一个503错误代码给发送消息的JabberID。当为vcard-temp和jabber:iq:private名字空间设置信息时,出现通过xdb进行数据存储的写入错误,也使用该代码。
504 远程服务器超时 Jabber代码504用于下列情况:试图连接一台服务器发生超时,错误的服务器名。
510 连接失败 Jabber代码510目前还没有使用。

jabber协议概述中文版(转载五)

6. 名字空间

现面是Jabber中的标准名字空间:

l           jabber:iq:agent–代理工具

l           jabber:iq:agents–有效的代理组

l           jabber:iq:auth–简单用户认证

l           jabber:iq:autoupdate–版本更新申请

l           jabber:iq:browse–Jabber浏览

l           jabber:iq:conference–一般会议

l           jabber:iq:gateway–用户地址网关

l           jabber:iq:last–上次使用时间

l           jabber:iq:oob–绑定数据输出

l           jabber:iq:private–私有数据存储

l           jabber:iq:register–注册请求

l           jabber:iq:roster–花名册(联系人名单)管理

l           jabber:iq:search–用户数据库查询

l           jabber:iq:time–客户端时间

l           jabber:iq:version–客户端版本

l           jabber:x:autoupdate–版本通知申请

l           jabber:x:conference–会议邀请

l           jabber:x:delay–显示的对象

l           jabber:x:encrypted–加密的消息

l           jabber:x:envelope–消息封套

l           jabber:x:event–消息事件

l           jabber:x:expire–消息终止

l           jabber:x:oob–绑定数据(文件传输)输出

l           jabber:x:roster–内部的花名册条目

l           jabber:x:signed–标记的在线状态

l           vcard-temp–临时的vCard

下面将详细介绍这些名字空间的细节。

6.1. jabber:iq:agent–代理工具

代理工具名字空间包含一个代理的所有工具。jabber:iq:angents查询通常用于注册到一个指定的服务、代理、传输器。

它也可能检验一个指定代理的所有工具细节。比如,一个客户端可以决定一个开放的注册是否可以进行。

例子:

<iq id=”wjAgent” type=”result” from=”Jabber.org”>

<query xmlns=”jabber:iq:agent”>

<agent jid=”aim.jabber.org”>

<name>AIM Transport</name>

<description>This is the AIM Transport</description>

<transport>AIM/AOL ScreenName</transport>

<service>aim</service>

<register/>

</agent>

</query>

</iq>

6.2. jabber:iq:angents–可用的代理列表

可用代理列表名字空间包含一组实体,这些实体拥有一些特殊工具,并能够为另一个实体提供服务。大多数情况下,可用代理列表是用来显示一台服务器上的可用传输器列表。

注意:这个名字空间被jabber:iq:browse的支持者所反对(??)。

例子:

<iq id=”wjAgents” type=”result” from=”jabber.org”>

<query xmlns=”jabber:iq:agents”>

<agent jid=”users.jabber.org”>

<name>User Directory</name>

<description>

You may register and create a public searchable

profile, and search for other registered Jabber

users.

</description>

<service>jud</service>

<register/>

<search/>

</agent>

<agent jid=”aim.jabber.org”>

<name>AIM Transport</name>

<description>This is the AIM Transport</description>

<transport>AIM/AOL ScreenName</transport>

<service>aim</service>

<register/>

</agent>

</query>

</iq>

6.3. jabber:iq:auth–简单客户端认证

简单客户认证名字空间是对客户端进行认证的一个简单机制,它为客户端到服务器之间的连接创建一个资源。

认证成功返回一个type=”result”的IQ响应。不成功,就返回一个错误IQ元素。

如果没有发送名字空间或密码,如果服务器允许,服务器将创建一个匿名资源。

例子:

<iq type=”set” id=”JCOM_0″>

<query xmlns=”jabber:iq:auth”>

<username>juliet</username>

<password>secret</password>

<resource>balcony</resource>

</query>

</iq>

<iq type=”set” id=”JCOM_0″>

<query xmlns=”jabber:iq:auth”>

<username>juliet</username>

<digest>a5e052c48c455bf21d937ccf17225916d9486b09</digest>

<resource>balcony</resource>

</query>

</iq>

<iq type=”set” id=”JCOM_0″>

<query xmlns=”jabber:iq:auth”>

<username>juliet</username>

<hash499>secret</hash499>

<resource>balcony</resource>

</query>

</iq>

6.4. jabber:iq:autoupdate–版本更新申请

版本更新申请名字空间允许客户端对所有可用软件更新进行申请请求。

例子:

<iq type=”get” to=”jabber.org” id=”1″>

<query xmlns=”jabber:iq:autoupdate”/>

</iq>

6.5. jabber:iq:browse–Jabber浏览

Jabber浏览名字空间的作用是,一是为Jabber世界中已有的Jabber IDs增加结构的一个途径,一是发现为不同Jabber实体提供的服务或应用。一个Jabber浏览的基本概念就是一个jid-type(类似文件的一个模拟类型的概念)。下面是想象中的最高级别的jid-types,不过随着时间的推移,一些其它的逻辑将被增加进来:

l           应用

l           会议

l           标题

l           关键字

l           回报

l           服务

l           用户

上面每一个范畴都有一个子类列表,如用户/客户端,或用户/设备(”客户端”或”设备”只是一个”资源”的概念),会议/irc,服务/icq,标题/库存。一般的,通过使用jabber:iq:browse名字空间你将拥有一个与上述某一jid-type范畴相对应的元素,这个元素通常有一个指定子类型的”type”属性。

Jabber:iq:browse的一个用户就是代替jabber:iq:agents名字空间来列出一个服务器上所对应的代理或其它服务。下面是一个浏览服务器的例子:

Jabber客户端发送:

<iq type=”get” to=”jabber.org”>

<query xmlns=”jabber:iq:browse”/>

</iq>

Jabber服务器返回:

<iq type=”result” from=”jabber.org”>

<service

type=”jabber”

jid=”jabber.org”

xmlns=”jabber:iq:browse>

<service

type=”jud”

jid=”users.jabber.org”

name=”Jabber User Directory”>

<ns>jabber:iq:register</ns>

<ns>jabber:iq:search</ns>

</service>

<service

type=”aim”

jid=”aim.jabber.org”

name=”AIM Transport”>

<ns>jabber:iq:register</ns>

<ns>jabber:iq:search</ns>

</service>

<conference

type=”private”

jid=”conference.jabber.org”

name=”Private Chatrooms”>

</service>

</service>

</iq>

在会议中的一个例子:

<iq type=”set” to=”room@server”>

<conference xmlns=”jabber:iq:browse” name=”Room Name”>

<user jid=”room@server/jidhash” name=”nick1″/>

<user jid=”room@server/jidhash” name=”nick2″/>

</conference>

</iq>

6.6. jabber:iq:conference–一般会议

一般会议名字空间提供一个会议室的机制(如群组聊天室),并提供该会议室的入口。这个名字空间与</iq>元素配套使用来获得一个会议室的信息,包括要求加入这个会议室的请求信息,以及为这个会议室设置信息(通常是为了加入这个房间)。一个普通进入房间的请求将和下面的类似:

1.    想要加入的房间提交一个type=”get”的请求。这个XML将是下面的形式:

<iq type=”get” to=”room@server”>

<query xmlns=”jabber:iq:conference”/>

</iq>

2.    接受来自要加入的房间的type=”result”的iq响应,其中有进入房间所需要的参数。这个XML将是下面的形式:

<iq type=”result” from=”room@server”>

<query xmlns=”jabber:iq:conference”>

<nick/>

<secret/>

<privacy/>

<name>Room Name</name>

</query>

</iq>

这里所有的请求元素的子元素都是可选的。昵称(nickname)元素表示进入房间需要一个昵称。密钥(secret)元素表示进入房间的用户需要提供一个密码。独处(privacy)元素表示如果用户在一个type=”set”(下面可以看到例子)的iq包中提供这样的元素,会议服务器将隐藏用户的真实Jabbere ID。名字(name)元素是房间的名字(用jabber:iq:browse浏览房间时可以看到同样的房间名)。

3.    发送当前状态给要加入的房间。XML如下:

<presence to=”room@server”/>

4.    想要加入的房间提交一个type=”set”的iq包以及进入所需信息。XML如下:

<iq type=”set” to=”room@server”>

<query xmlns=”jabber:iq:conference”>

<nick>mynick</nick>

<nick>mysecondnick</nick>

<secret>thesecret</secret>

</query>

</iq>

注意在用户第一个选择被接受时,用户可以提交多个昵称。如果用户没有提供昵称,服务器将指派一个昵称给用户。

5.    收到你加入的房间的通知,这个iq以下面的格式返回:

<iq type=”result” from=”room@server”>

<query xmlns=”jabber:iq:conference”>

<id>room@server/uniqueidnumber</id>

<nick>mynick</nick>

</query>

</iq>

这个唯一的ID号是用户Jabber ID的一个哈希。

6.7. jabber:iq:gateway–用户地址网关

一般通过一个网关或传输器(比如AIM传输器)来实现与非Jabber网络用户的通信,每一个非Jabber网络都可能拥有唯一的用户地址,这个地址可能和Jabber IDs并不统一。用户地址网关就是解决这个问题的,它使得Jabber客户端向非Jabber网络用户发出订阅时给出正确Jabber IDs变得很容易。这些通过对用户进行提示和会话,引导用户提供创建一个正确Jabber ID所需信息来实现。下面将演示这种普通的交互:

1.    客户端向网关发出带有jabber:iq:gate名字空间查询的iq get:

<iq type=”get” to=”aim.jabber.org”>

<query xmlns=”jabber:iq:gateway”/>

</iq>

2.    服务器返回一个包含请求批准及其描述文本的iq:

<iq type=”result” from=”aim.jabber.org”>

<query xmlns=”jabber:iq:gateway”>

<desc>

Please enter the AOL Screen Name of the person

you would like to contact.

</desc>

<prompt>Screen Name</prompt>

</query>

</iq>

3.    客户端向网关发送一个包含指定信息的iq set:

<iq type=”set” to=”aim.jabber.org”>

<query xmlns=”jabber:iq:gateway”>

<prompt>Joe Cool</prompt>

</query>

</iq>

4.    服务器返回一个包含正确Jabber ID的iq result

<iq type=”result” from=”aim.jabber.org”>

<query xmlns=”jabber:iq:gateway”>

<jid>JoeCool@aim.jabber.org</jid>

</query>

</iq>

6.8. jabber:iq:last–最后一次在线时间

最后一次在线时间名字空间提供一个标准的方法,通过这个方法可以查询一个Jabber实体一个或多个服务更新时间,或者一个客户最后一次连接(或活动)到一台服务器上的时间。每一次返回的值都是一个秒的数目。进行查询的实体可以通过下面的法则解释获取的信息:

l           user@server/resource–用户最后一次活动的时间

l           user@server–用户最后一次连接的时间

l           server–服务器最后一次启动的时间

例子(服务器):

<iq type=”get” to=”jabber.org”>

<query xmlns=”jabber:iq:last”/>

</iq>

<iq type=”result” to=”stpeter@jabber.org/Gabber” from=”jabber.org”>

<query xmlns=”jabber:iq:last” seconds=”124933″/>

</iq>

例子(客户端):

<iq type=”get” to=”jer@jabber.org”>

<query xmlns=”jabber:iq:last”/>

</iq>

<iq type=”result” to=stpeter@jabber.org/Gabber from=”jer@jabber.org”>

<query xmlns=”jabber:iq:last” seconds=”5024″>

Disconnected

</query>

</iq>

6.9. jabber:iq:oob–绑定数据输出

绑定数据输出名字空间为客户端-客户端的文件传输提供一个标准方法,通过服务器的传输/代理的传输器实现一个特殊的名字空间:

例子:

<iq type=”set” to=”horatio@denmark.com” id=”file_1″>

<query xmlns=”jabber:iq:oob”>

<url>http://denmark.com/act4/letter-1.html</url>

<desc>There’s a letter for you sir.</desc>

</query>

</iq>

6.10. jabber:iq:private–私有数据存储

私有数据存储名字空间是Jabber服务器上存储私有数据的一个机制。存储的数据可以是任何合法的XML数据。在服务端存放客户端的当前状态信息是这个名字空间的典型用法。

例子1(客户端存储私有数据):

<iq type=”set” id=”1001″>

<query xmlns=”jabber:iq:private”>

<winjab xmlns=”winjab:prefs”>

<defaultnick>Hamlet</defaultnick>

</winjab>

</query>

</iq>

例子2(客户端找回私有数据):

<iq type=”get” id=”1002″>

<query xmlns=”jabber:iq:private”>

<winjab xmlns=”winjab:prefs”/>

</query>

</iq>

另外,对于私有数据存储,1.4版服务器支持服务器上所有有效名字空间(以”jabber”开头的名字空间保留,为Jabber系统进行调用)的XML数据。这个数据存在向服务器端发送type=”set”的iq包的用户的花名册中。

例子1(客户端保存公有数据):

<iq type=”set” id=”1003″>

<query xmlns=”stpeter:public:favorites”>

<fav_things>

<food>Thai</food>

<color>blue</color>

<composer>Bach</composer>

</fav_things>

</query>

</iq>

例子2(客户端找回公有数据):

<iq type=”get” id=”1004″>

<query xmlns=”stpeter:public:favorites”>

<fav_things/>

</query>

</iq>

6.11. jabber:iq:register–注册请求

注册请求名字空间对一个或多个服务进行注册。它也被用来更新或删除一个注册。

例子:

<query xmlns=”jabber:iq:register”>

<instructions>

Some instructions to be displayed when the

user is filling out the form.

</instructions>

<username/>

<password/>

<email/>

<date/>

<key/>

</query>

6.12. jabber:iq:roster–联系人名单管理

联系人名单管理名字空间是客户端用来管理他们的花名册的,该花名册保存在服务器上,这样用户可以在任何地方得到它。花名册是该帐号上所有订阅信息的命令列表,包括用户昵称和联系列表。当用户从任何一个资源登陆上来,服务器将把花名册发送给用户。

花名册是一个条目的列表。每一个条目元素都有描述它的属性。每一个条目元素都包含它所属组的组元素。下面是描述<item/>元素的属性:

l           “jid”是条目的Jabber ID

l           “subscription”所有和本条目相关的订阅所对应的用户的当前状态。它可以是”none”(不可订阅),”to”(有一个发到该条目的订阅),”from”(从该条目发送一个订阅给我们),”both”(to、from),或者”remove”(从花名册上删除一个条目)。

l           “ask”是对这个条目的一个请求的当前状态。Subscribe表示请求对该条目进行订阅,它的值就是,Unsubscribe表示取消订阅。

l           “name”表示昵称

通过使用一个<iq type=”set”/>,一个Jabber客户端可以控制用户的JabberID,名称属性,群组元素,并且可以在联系人名单上创建或删除联系人。服务器根据客户端对当前状态订阅请求的响应来管理其它所有属性。

订阅请求的例子:

<iq type=”set” id=”uniquevalue”>

<query xmlns=”jabber:iq:roster”>

<item jid=”romeo@montague.net”

name=”Romeo”

subscription=”none”

ask=”subscribe”>

<group>friends</group>

</item>

</query>

</iq>

当一个花名册条目在服务器上改变时,服务器将把这个改变推送给一个用户。这个推送是一个普通的从服务器发送到客户端的<iq type=”set”/>包。下面是一个例子:

<iq type=”set”>

<query xmlns=”jabber:iq:roster”>

<item jid=”romeo@montague.net” subscription=”both”/>

</query>

</iq>

在上面的例子中,服务器推送给客户端一个花名册,表明该用户对romeo@montague.net的当前状态信息有订阅。一个花名册推送可能发生一个连接的任何时间中,该连接是另一个连接修改资源或服务器(修改订阅属性)的结果。客户端只有使用花名册推送来改变花名册的显示。但不是每次花名册推送都对用户起作用。

6.13. jabber:iq:search–用户数据库查询

任何一个代理都可以成为一个查询代理。例如,JUD查询Jabber用户,ICQ传输器查询ICQ用户。

用户发送一个进行可查询域的Get请求:

<iq

type=”get”

id=”1001″

to=”users.jabber.org”

from=”romeo@montague.net/orchard”>

<query xmlns=”jabber:iq:search”/>

</iq>

查询代理返回一个可查域:

<iq type=”result” id=”1001″ from=”users.jabber.org”>

<query xmlns=”jabber:iq:search”>

<instructions>Fill in a field to search for any

matching Jabber User

</instructions>

<name/>

<first/>

<last/>

<nick/>

<email/>

<key>067941fd96a6a2752a21abcb6d737130dd51dd50</key>

</query>

</iq>

注意这些域是以提示的形式返回。为了传输的安全还包含一个密钥(下面会看到)。用户现在可以在允许的域内进行标准的查询了。用户发回一个Set请求给代理进行实际查询:

<iq

type=”set”

id=”1002″

to=”users.jabber.org”

from=”romeo@montague.net/orchard”>

<query xmlns=”jabber:iq:search”>

<last>Capulet</last>

<key>11b830e604215c3a2a24652c69fd4efa2a7a5746</key>

</query>

</iq>

服务器根据查询返回结果:

<iq type=”result” id=”1002″ from=”users.jabber.org”>

<query xmlns=”jabber:iq:search”>

<item jid=”juliet@capulet.com”>

<name>Juliet Capulet</name>

<first>Juliet</first>

<last>Capulet</last>

<nick>juliC</nick>

<email></email>

</item>

<item jid=”sampson@capulet.com>

<name>Sampson Capulet</name>

<first>Sampson</first>

<last>Capulet</last>

<nick>sammy</nick>

<email></email>

</item>

</query>

</iq>

注意有两套items标记含有指定信息。这是因为通过代理发送返回有两种方法:

l           单一返回标签

l           多个”pushed”到用户的标签,类似花名册推送,如在一个时间上的一个记录。

发送的返回的样式是查询代理的一个工具。比如:

<iq type=”set” from=”icq.jabber.org” id=”1003″>

<query xmlns=”jabber:iq:search”>

<item jid=”7090245@icq.jabber.org”>

<email>juliet@capulet.com</email>

<nick>juliC</nick>

<given>Juliet</given>

<family>Capulet</family>

</item>

</query>

</iq>

多个查询结果通过服务器进行推送。当所有数据发送完毕,服务器将发送下面的返回结果:

<iq type=”result” from=”icq.jabber.org” id=”1003″>

<query xmlns=”jabber:iq:search”/>

</iq>

客户端接收到多个”sets”,每一个都被记录,最后收到一个表示”数据结尾”的”返回”。在每一个<item>标签中,JID属性都被强制带上。

例子:

<iq

type=”get”

id=”1001″

to=”users.jabber.org”

from=”juliet@capulet.com”>

<query xmlns=”jabber:iq:search”/>

</iq>

6.14. jabber:iq:time–客户端时间

客户端时间名字空间是客户端改变当前时间的一个标准方法。

例子:

<iq type=”result” from=”stpeter@jabber.org”>

<query xmlns=”jabber:iq:time”>

<utc>20010214T18:55:06</utc>

<display>2/15/00 4:55:06 PM</display>

</query>

</iq>

6.15. jabber:iq:version–客户端版本

客户端版本名字空间是得到另一个用户的客户端的版本信息的一个标准方法。

例子:

<iq type=”result” from=”stpeter@jabber.org/Gabber”>

<query xmlns=”jabber:iq:version”>

<name>Gabber</name>

<version>0.8.1 (Powered by: jabberoo 1.0.0</version>

<os>Linux 2.2.16-22 i686</os>

</query>

</iq>

6.16. jabber:x:autoupdate–应用程序版本通知

版本更改申请名字空间使服务器可以在一个应用的新版本可用时通知客户端。

例子:

<message from=”winjab.sourceforge.net”>

<x xmlns=”jabber:x:autoupdate”>A new version of WinJab

is available, see http://winjab.sourceforge.net/

</x>

</message>

6.17. jabber:x:conference–会议邀请

会议邀请名字空间使用户可以邀请其它Jabber用户到指定会议室。相关联信息–该会议室的Jabber ID,内嵌在一个消息的<x/>元素中。

例子:

<message to=”romeo@montague.net” from=”juliet@capulet.com”>

<body>Wherefore art thou Romeo?</body>

<x xmlns=”jabber:x:conference” jid=”balcony@conference.capulet.com/>

</message>

6.18. jabber:x:delay–标记对象延时

标记对象延时名字空间是消息和当前状态信息的时间戳信息,其中,当一个Jabber实体不在线时,当前状态信息可以保存并在稍后发送。当实体上线时,包含的信息标记对象延时名字空间使Jabber客户端显示出该包体最早产生的时间,而不是它发送给Jabber实体的时间。

例子:

<message

type=’groupchat’

from=’cauldron@conference.witches.org’>

<body>Thrice the brinded cat hath mew’d.</body>

<x xmlns=’jabber:x:delay’

stamp=’10541031T21:43:40′>Cached In GC History</x>

</message>

6.19. jabber:x:encrypted–加密消息

加密消息名字空间用来支持使用公共密钥(一般通过客户端使用PGP或GPG,服务端用同样的名字空间进行加密来实现)加密的消息交互。一个相关的名字空间,jabber:x:signed,用来进行当前状态信息的加密。

例子:

<message from=’juliet@capulet.com/balcony’ to=’romeo@montague.net/orchard’>

<body>This Message is Encrypted</body>

<x xmlns=’jabber:x:encrypted’>

hQEOA7ucqu53AhlPEAP/ZbU6oPnRAbIcUxMK1XRVnkgZ/Agtq1tcTQuEZxbpZLl4

C/4psQGLgBU5h5Y3/khxtJTPXKn1izyc+DRZ8hqn2p4mwC8ioKTBJ6P6dfEpQEyt

a4bimM5fqdeh4gRkMhwThRSJxBCJBVVWFEViu+0KlHHB5AeeL4qwRGb2dhGjIgQD

/R9×0D0qtgBGwf/TVnRGZYRX7epxCNuNDEYKZSs4LEoTPL8CVsAWOzS2QgS0GBqt

tFDKId6XaNu36dB2D8VHdxQnI8RtHo9pfTYDaXWB3dMGTt896iEO/sTuucYObf3s

K5Kygg0uWpBpvQPj8Y041FhnUBz8DRGCnuFLQxCI6ch4ybauXfOKNOGDQwmsnJZm

6OaeVFUwdsedI3c6VdQtodnWVutckR5BOjnn0VqnhrVTu7cp6VXrrRK4g9atPEe6

C4R/MilBjzIJBcET0jhWuAyiBo3gN/6IqYRZNSXL9ZqGPJwNTlYim1EHN3qBqiUw

zUMamEoRzcusn80Z7kylve5ujIeSD/pVwoawHHvLp92kO2hd0yGD0UrWSfKU1o6y

EY8yhZ5P1v02pIKigAUI2c6LTDxt/KhSxQ==

=fijN

</x>

</message>

6.20. jabber:x:envelope–消息信封

消息信封名字空间是表明消息有更多的寻址方式,如联合email进行的寻址。下面是一些所支持的名字空间:

l           to

l           cc

l           replyto

l           from

l           forwardedby

上述每一个元素都带有一个”jid”属性来标识Jabber实体是发送、中转、还是收到消息。

例子:

<message from=’juliet@capulet.com/tomb’ to=’romeo@montague.net/tomb’>

<body>And there I am. Where is my Romeo?</body>

<x xmlns=’jabber:x:envelope’>

<to jid=’romeo@heaven.org>Romeo</to>

<forwardedby jid=’root@heaven.org>God</forwardedby>

</x>

</message>

6.21. jabber:x:event–消息事件

消息时间名字空间是标识一条消息的状态的一个机制。现在,事件与一条消息如下般相关联:

l           <composing/>–个用户正在对消息进行回复

l           <delivered/>–发送给指定接收者的消息

l           <displayed/>–显示给指定接收者的消息

l           <offline/>–为离线进行存储的消息

对于客户端来说,这些消息事件的支持是可选的,而且,只有在另一用户在聊天中发出请求,这些消息事件才会被发送。不同的Jabber客户端将对当前状态消息事件进行不同的显示。

对消息通知的请求的例子:

<message

from=”juliet@capulet.com/balcony”

to=”romeo@montague.net/orchard”

id=”1001″>

<body>By whose direction found’st thou out this place?</body>

<x xmlns=”jabber:x:event”>

<composing/>

</x>

</message>

发送消息通知的例子:

<message from=”romeo@montague.net/orchard” to=”juliet@capulet.com/balcony”>

<body>By whose direction found’st thou out this place?</body>

<x xmlns=”jabber:x:event”>

<composing/>

<id>1001<id/>

</x>

</message>

可以同时请求多个消息事件。

6.22. jabber:x:expire–消息到期

消息到期名字空间是说明一条消息拥有一个有限的存活事件的一个简单扩展。如果消息被离线存储,而到了到期时间,服务器将不再发送该消息。如果一条消息为预览就进行发送,Jabber客户端可以选择不显示该消息。”secondes”属性定义消息发送的事件。

例子:

<message from=”sailor@denmark.com” to=”horatio@denmark.com”>

<body>There’s a letter for you sir</body>

<x xmlns=”jabber:x:expire” seconds=”3600″/>

</message>

6.23. jabber:x:oob–绑定数据输出

绑定数据输出名字空间使用户可以通过交换一个标准的URL来实现文件传输的目电。使用jabber:x:oob的URLs交换可以包含任一消息(在一个<x/>子元素内),感觉就像email里的附件一样。多个附件可以包含在同一个消息中。

例子:

<message from=”sailor@denmark.com” to=”horatio@denmark.com”>

<body>URL Attached.</body>

<x xmlns=”jabber:x:oob”>

<url>http://denmark.com/act4/letter-1.html</url>

<desc>There’s a letter for you sir</desc>

</x>

</message>

6.24. jabber:x:roster–内置的花名册条目

内置的花名册条目使用户可以在一个消息中包含花名册条目,这样很容易在用户之间发送联系方式。每一个花名册条目都包含在一个<x/>的一个<item/>子元素中。这个<x/>元素一般用在一个<message/>元素中,但这不是必须的。

例子:

<message to=”hamlet@denmark.com”>

<body>

Here are some new Jabber users

to add to your contact list!

</body>

<x xmlns=”jabber:x:roster”>

<item jid=”claudius@denmark.com” name=”King”>

<group>Royalty</group>

</item>

<item jid=”horatio@denmark.com” name=”Horatio”>

<group>Friends</group>

</item>

<item jid=”fortinbras@norway” name=”Prince Fortinbras”/>

</x>

</message>

6.25. jabber:x:signed–有符号的当前状态

有符号的当前状态名字空间用来支持交换使用公共密钥(客户端使用PGP或GPG,服务端使用同样的名字空间进行加密)加密的当前状态信息。一个相关的名字空间,jabber:x:encrypted用来支持加密消息。

例子:

<presence from=’juliet@capulet.com/balcony’ to=’romeo@montague.net/orchard’>

<show>away</show>

<status>be back later</status>

<x xmlns=’jabber:x:signed’>

iD8DBQA6kasv0xpc2/POfPkRAnz0AJ9UEYYWWSReddIKk3AYMfTFtqQDJwCfbcLd

JcSUOR0FlS+rDFjAPaSMgSM+iNaNm

</x>

</presence>

6.26. vcard-temp–临时vCard

vCard格式是一个”电子商务卡的标准格式,通过使用通过互联网进行个人数据的直接交换,如同在非互联网下的环境一样”。由于XML的vCard的格式还没有标准化,Jabber.org项目在XML的vCard标准建立之前,暂时设置了这样一个临时名字文件。由于这几年在vCard的XML的官方标准的指定上没有任何进步,Jabber.org开发者专门为这个项目创建了一个项目吸引Jabber社区外其它开发者的注意。因此,最后的XML的vCard格式的最后DTD可能会在下面的URL中找到:

http://www.vcard-xml.org/

例子1(对vCard的客户端请求):

<iq type=”get”>

<vCard xmlns=”vcard-temp”/>

</iq>

例子2(客户端收到vCard数据):

<iq type=”result”>

<vCard version=”3.0″ xmlns=”vcard-temp”>

vCard data goes here

</vCard>

</iq>

例子3(客户端向服务端发送vCard):

<iq type=”set”>

<vCard version=”3.0″>

vCard data goes here

</vCard>

</iq>

jabber协议概述中文版(转载四)

5. 元素

信息/查询(IQ)在Jabber中在两个实体间构建一个根本的会话,并且允许实体间来回传送XML格式的请求和响应。信息/查询主要的用处是取得或设置公共的用户信息,比如名字,电子邮件,地址等等。但它的灵活设计使得任何种类的会话都可以发生。任何通过一个Jabber ID标识的实体都能通过一个IQ与其它实体进行会话。
5.1. “type”属性

元素的“type”属性用于决定信息/查询是请求还是响应。下面是“type”属性的可用值:
5.1.1. type=”error”

表示查询失败。实际错误在元素的子元素中描述。

例子:

Forbidden
5.1.2. type=”get”

找回指派给一个查询名字空间的信息。如果没有设置属性,默认情况,这个属性包含在查询中。一个type=”get”的元素由一个子元素构成,这个子元素通常是,但也可以是或另一个已有的子元素。不过,指定的子元素必须左空,以便接收一个用户所需提供的信息的空间的清单。一个成功的get查询的结果type=”result”的元素,是元素嵌套在包含了所需信息的指定子元素(如或)。

例子:
5.1.3. type=”result”

表示包是一个type=”get”或type=”set”的查询的成功响应。这个成功查询的结果是一个type=”result”的元素,该元素嵌套在一个包含所查询的信息的子元素中(如、)。一个成功的查询或获取查询结果的返回是一个空的type=”result”的元素。一个不成功的返回是一个type=”error”的元素。通常与“id”属性的获取、设定查询有关。

例子:

vCard data goes here
5.1.4. type=”set”

表示包是对设值或更改现有数据值。一个type=”set”的元素总是包含一个指定的子元素,通常是,也可以是或者其它可以接受的子元素。一个设置命令查询的成功返回是一个空的type=”result”的元素。

例子:

vCard data goes here
5.2. 其它属性

除了“type”属性外,IQ元素还可以通过下面的属性进行修改。
5.2.1. “from”属性

表示iq包的发送者。从XML观点来说,这个属性是所有元素所必须的,实际应用中这个属性是服务器来增加和修改的(为防止某些欺骗),因此客户端的开发人员不需要过多关注这个属性。

例子:
5.2.2. “id”属性

一个iq包只有唯一的标识。Jabber客户端或客户库生成“id”属性,客户端通过它来标识包,以完成对包的跟踪(如:一个type=”result”对应一个type=”get”或type=”set”)。“id”属性是可选的,并且不能用于系统的其它地方。

例子:
5.2.3 “to”属性

表示iq包的接收者。在Jabber客户端,对应“to”属性的Jabber ID的格式为user@host/resource。user@host也是可以的,如果用户在线,user@host将被置换成user@host/resource,如果用户不在线,user@host将被直接指向一个离线模块(对于类似服务器端网关这种非用户实体,情况又有所不同,因为它们不拥有资源,并且只是简单通过Jabber ID的一个“server”端口进行标识。Jud.jabber.org——Jabber用户目录就是这样一个例子)。如果包没有属性,服务器将对该包进行处理。

例子:
5.3 的子元素

下面介绍元素的子元素。
5.3.1.

当iq的属性类型被设置为“error”时,将用到本属性。错误代码根据一个含有错误数的“type”属性进行定义,员司包含该错误的文本描述。比如,下面就是一个坏请求:

Bad Request

在附录中,列有错误编码及其对应的错误描述。
5.3.2.

元素为客户端-服务器之间交互提供一层安全保护。它被用户jabber:iq:register和jabber:iq:search名字空间中。

当一个客户端发起一个与服务其之间的交互时,服务器将发送一个包含一个唯一值的给客户端。客户端在返回的消息中,包含上诉唯一值到子元素中。这样,服务器就认为该客户端时接收到原来密码的同一实体。
5.3.3.

元素中的子元素定义所执行的查询的类型。特殊情况下,查询可以拥有一个特殊的名字空间,这个名字空间是一个通过“xmlns”属性定义的子元素。一个元素中只能有一个子元素。

下面的例子是当我通过我的Linux机器上的Grabber客户端登陆到服务器上,将出现的XML。

stpeter

Gabber

f1e881517e9917bb815fed112d81d32b4e4b3aed

就象你看到的那样,认证查询通过客户端认证名字空间(jabber:iq:auth)向服务器发送认证信息。一般,Jabber核心协议保留jabber:iq:*这样的名字空间。而开发者可以通过增加jabber:iq:*名字空间对Jabber核心进行扩展。这些将在下面的名字空间中进行更完整的描述。

一个空子元素可以与元素一起发送,这样可以找回与子元素中指定的名字空间相关的一个Jabber实体的信息。比如,找回一个客户端的花名册(“联系人名单”),下面的XML可以被发送:

jabber协议概述中文版(转载三)

4.
元素

元素提供关于一个Jabber实体的可用性信息。任何一个通过一个Jabber ID确认的实体可以与另一个实体进行在线状态信息的通信,这种通信大多以订阅在线状态信息的方式进行。

所有实体表现出的在线状态不是“可用”就是“不可用”。“可用”状态表示发送者可以立即收到消息。“不可用”状态表示发送者不能在当前时间收到任何数据。默认情况下,所有
元素除非包含type=”unavailable”属性外,都表示“可用”。“可用”的更多特殊形势通过和子元素进行指定。
4.1. “type”属性

的“type”属性根据不同目的使用。除了提示其它用户本用户的可用性状态的“普通”用法外,还包括订阅、取消订阅、以及探测在线状态信息。下面是“type”属性的可用值:
4.1.1. type=”available”

如果没有包含任何“type”属性,在线状态包将被设为type=”available”,用来提供用户在线时的信息。一个type=”available”的在线状态包通常包含一个元素以详细说明Jabber实体的可用类型,以及一个元素,该元素包含人能看懂的关于该可用类型的描述。在线状态包还可以包含一个
元素,来指明该连接的Jabber ID的优先级。

例子:

from=”juliet@capulet.com/balcony”

to=”romeo@montague.net/orchard”/>

away

Stay but a little, I will come again.

元素的可用值为:

l away――Jabber用户或实体在线,但不能马上联系上

l chat――Jabber用户或实体在线并有兴趣聊天

l dnd――Jabber用户或实体在线,但不想被打扰(“dnd”表示“do not disturb”)

l xa――Jabber用户或实体在线,但已经离开很长时间了(“xa”表示“extended away”)

可以包含任意特性数据,这些数据通常包含对于用户状态的描述,如,“开会中”是“away”的一个表现值,或者“忙于编码”可以是“dnd”的一个表现。
4.1.2. type=”error”

当一个在线状态包发送给一个不存在的JID时,或在发送在线状态请求时发生一个错误时,服务器都将返回一个type=”error”的在线状态包。

下面是一个例子(注意域名的类型):

type=”subscribe”

to=”romeo@montague.nett”/>

回复的例子:

from=”romeo@montague.nett”

to=”juliet@capulet.com/balcony”

type=”error”>

Remote server timeout. Unable to deliver

packet.

4.1.3. type=”probe”

向一个特定实体(实体不能发送在线状态消息给自己)发出在线状态信息请求。服务器而非客户端,进行一个探测请求。实际上,虽然Jabber客户端也可以发送一个探测一个指定Jabber用户是否在线的请求,但通常都是服务器端发出探测请求。注意,只有在发起请求的用户在请求所对应的用户的花名册上,并且拥有“from”或“both”订阅类型时,服务器才会发出探测请求。在下面的例子中,我们将看到我们的英雄Romeo向Juliet发出一个探测请求,Juliet所在服务器回复一个“状态报告包”(包含jabber:x:delay名字空间中指明的上次在线状态更新的时间戳)

探测请求的例子:

from=”romeo@montague.net”

to=”juliet@capulet.com”

type=”probe”/>

回复探测请求的例子:

from=”juliet@capulet.com/.”

to=”romeo@montague.net”>

Stay but a little, I will come again.

away

xmlns=”jabber:x:delay”

from=”juliet@capulet.com/.”

stamp=”15310309T23:47:15″/>

4.1.4. type=”subscribe”

发送一个请求,这个请求是接收者在其在线状态改变时,自动发送在线状态信息给发送者。

例子:

from=”romeo@montague.net”

to=”juliet@capulet.com”

type=”subscribe”/>

4.1.5. type=”subscribed”

发送一个消息,表明发送者接受了接受者对其再现状态订阅的请求。从现在起,当发送者的在线状态信息改变时,服务器将会把状态信息发送给接收者。

例子:

from=”juliet@capulet.com”

to=”romeo@montague.net”

type=”subscribed”/>

4.1.6. type=”unavailable”

例子:

from=”juliet@capulet.com”

to=”romeo@montague.net”

type=”unavailable”>

Disconnnected

4.1.7. type=”unsubscribe”

发送一个请求,表明接收者停止发送在线状态信息给发送者。

例子:

from=”juliet@capulet.com”

to=”romeo@montague.net”

type=”unsubscribe”/>
4.1.8. type=”unsubscribed”

这种类型的在线状态包有两个用途:

1. 发送一个表明发送者接受接收者关于不订阅其在线状态信息的请求的通知。服务器将不再发送发送者的在线状态信息给接收者。

2. 拒绝一个订阅请求。服务器将不再发送发送者的在线状态信息给试图订阅其在线状态信息的用户。

例子:

from=”romeo@montague.net”

to=”juliet@capulet.com”

type=”unsubscribed”/>
4.2. 其它
属性

除了设置“type”属性,还可以通过下列属性修改
元素:
4.2.1. “from”属性

标识在线状态包的发送者。一般Jabber ID再“from”属性中必须写成user@host/resource的格式。从XML的观点来说,这个属性是所有
元素所必须的,而在实际应用中,都是服务器对该属性进行添加和修改(防止一些欺骗的手段),因此客户端开发者不需要考虑它。

例子:

4.2.2. “id”属性

为在线状态请求包配置唯一的验证符。“id”属性由Jabber客户端或客户库(如Gabber或JabberCOM)生成,客户端用其为在线状态包的轨迹进行验证。“id”属性是可选的,并且不能用于系统其它任何地方。

例子:

4.2.3. “to”属性

标识在线状态包的接收者。一般Jabber ID在“to”属性中都是user@host/resource的格式,user@host的格式也是可以的,但当接收者在线时,它将转化为user@host/resource。在Jabber的一般用法中,Jabber客户端向服务器发出在线状态包,服务器将这些在线状态包发送到该用户花名册上所有的用户。当一个Jabber客户端发送的
元素中不含“to”属性时,服务器将将其转化为在线状态包发送给指定的Jabber实体。下面的例子将演示这一过程。

发送给服务器的在线状态的例子:

Stay but a little, I will come again.

away

服务器发给指定用户的在线状态例子:

to=”romeo@montague.net/orchard”

from=”juliet@capulet.com/balcony”>

Stay but a little, I will come again.

away

4.3.
的子元素

下面的元素用于
协议。
4.3.1.

在Jabber中,根据Jabber知道的设备数或位置数,一个用户可以建立相同数量的连接。用户可以给每一个资源赋予一个数字优先级(通过对指派给该资源的Jabber客户端进行设置),这个优先级与
元素的子元素
方法进行通信。

当在线状态包发送到服务器后,服务器有能力决定哪一个连接资源需要指派一个单一的Jabber ID,该资源将收到发往该Jabber ID的消息,这是因为数字最高的资源是默认或第一资源。如果最高优先级的资源不可用,消息和其它Jabber通信将发送给次高优先级的资源(当其它资源都不可用时,一个没有从默认数到0的优先级的客户端,也可以成为第一资源)

举例来说,Julie可以通过两个资源:the balcony 和 the chamber连接她的帐号juliet@capulet.com。如果“balcony”资源的优先级被设置为“2”,而“chamber”资源的优先级被设为“1”,而且两个资源都可以连接,消息将发送到juliet@capulet.com/balcony,而不是juliet@capulet.com/chamber。
4.3.2.

可选的元素告诉Jabber客户端如何显示一个用户的在线状态。标签是一个典型的标签的伴随标签,标签包含更多在线状态改变理由的描述信息。如果元素不在
元素中,Jabber接收客户端将指明该用户处于“普通”状态。下面是四个可选项:

标签

含义

chat

该客户可以马上联系上

away

该客户在线,但刚刚离开(如吃午饭,开会)

xa

该客户在线,但已经处于非活动状态很长时间了。

dnd

该用户处于谢绝打扰的模式
4.3.3.

元素包含更多关于用户在线状态的描述。大多数Jabber客户端都包含一些元素的默认设置;另外,它们还允许我们提供富有个性的描述如“我在吃午饭”或者“钓鱼中”。
4.3.4.

元素作为一个扩展机制来使用,或发送从服务器发送命令给客户端,或从一个客户端发送命令到另一个客户端。每次用到这个元素时,必须指明相关的XML名字空间。单一消息可以包含多个子元素实例。下列已定义的名字空间可以被子元素使用:

l jabber:x:autoupdate

l jabber:x:delay

l jabber:x:encrypted

l jabber:x:oob

l jabber:x:roster

这些名字空间在下面的Jabber名字空间中被更完整地描述。

返回顶部