资源描述
第七章:的客户端编程
的客户端简介:
有两种客户端: 本地客户端和远程客户端。
(本地客户端): 是指与服务器在同一台机器上,不用通过网络
就可以访问到服务器的客户端 。
(本地客户端):是指要通过网络才可以访问到服务器的客户端。
下图为应用系统的客户端访问服务器上的服务的过程图。
说明:
( )
用于指产品的客户端部分
( )
系统自带的一个,它侦听一个指定的端口,最初与该
建立连接
( )
系统自带的一个,由它处理与 之间的通讯。
(公告板)
把系统的配置保存在一个共享内存中,该共享内存称为公告板()
的管理进程,主要对公告板等进行管理
与 建立连接的过程为:
1. 调用()或()
2. 采用在中指定的地址与服务端的建立连接
3. 为该指定一个,并把该的侦听端口返回给
4. 采用返回的端口与指定的建立连接,并与断开连接,这之后与 之间的通讯通过进行处理,与无关。
5. ()或()调用返回。
本地客户端与远程客户端的主要区别
1. 本地客户端只能用语言或语言编写,远程客户端可以用几乎所有的编程语言编
写。
2. 在远程客户端所在的机器上要安装的客户端软件,并且在设置相应的环境变量;
在本地客户端上不用
3. 用编译远程客户端程序时要加 –,编译本地客户端则不用
与远程客户端有关的配置:
1. 在中要配置,即最多可以有多少个远程客户端同时连接
到该服务器上。
2. 在中要配置:
""
" "
中可带的参数为:
"[ ] [] [ ]
[ ][ ][ ]
[ ][ ][ ]
[ ][ ]
[ ][ ]
[ ]
[ ][ ][ ]
[ ][{}]"
参数说明:
: 的侦听端口,远程客户端通过该端口与服务器建立连接
: 最少启动多少个进程
: 最多启动多少个进程,默认值为
:每个进程可以同时与多少个远程客户端建立连接
如果在远程客户端与服务器之间传送的数据包大小(单位为字节)超过指定的参
数,就自动进行数据压缩,
: 指定一个远程客户端的空闲时间,如果该远程客户端在这么长的时间内没有做任何调用,将断开与该远程客户端的连接。单位为分钟,如果没有指点该参数,那么永远不会自动断开远程客户端的连接
: 指定远程客户端与建立连接的时间,如果在指定的时间内还没有建立连接,那么连接将失败。如果没有采用安全认证方式默认为*秒,。如果采用安全认证方式默认为*秒,
[ ][ ]:指定可以使用的端口范围:
如果远程客户端要跨越防火墙才能访问该应用系统,在中要指定该参数,指定可以使用的端口范围,并让防火墙允许访问这些端口。如果不指定,会根据系统端口的使用情况进行分配,而分配的端口防火墙不允许通过,造成无法调用 。如下面的设置指定可用的端口范围为 – 。
" "
在远程客户端的机器上要设置的环境变量
(必需):客户端在该机器上的安装目录
(必需):远程客户端通过该地址与服务器建立连接,它的值为参数的值,
如在上面的配置中为:
(可选): 该客户端的类型,如果与服务器的类型一样,那么在它们之间进行数据
传送时不用进行编码解码工作。
其他不常用的环境变量可参考的联机文档。
客户端的编程模式:
在层结构中,是属与表示层,表示层主要处理与用户交互,它的功能可概括为:
、提供应用的用户交互接口,即主要通过图形化的用户界面,取的用户的输入数据
、与 应用服务器建立连接
、调用应用服务器上的服务(),把客户端的输入参数放入输出缓冲区。
、应用服务器调用相应的处理客户端的请求,把处理结果通过客户端的输
入缓冲区返回给客户端。
客户端与服务端之间的通讯方式有以下几种:
、同步调用:
、异步调用
、会话方式:
、可靠消息队列
、广播方式
、发布订阅
在下一章我们再具体介绍
的介绍
客户端通过调用提供的编程()来编写程序,下面介绍一些客户端主要的
与连接的建立与断开有关的
为了与 建立连接 要调用()检查该 所采用的安全方式,并根据得到的值做相应的处理,然后调用()建立与的连接,在 的结果返回
之后,调用()断开与 的连接.
()
描述: 检查该 所采用的安全方式
参数:无
返回值:
:不需要认证
:需要口令认证
:需要口令认证,并且还需要应用级的认证或授权.
:调用失败, 错误号保存在全局变量中。
( *)
描述: 与 建立连接
参数
返回值: 失败返回, 错误号保存在全局变量中。
结构体在中的定义如下
{
[]; * *
[]; * *
[]; * *
[]; * *
; * *
; * *
; * *
};
;
说明用于安全认证中
:用于定义以何种方式通知该客户端一个 的到来.它的值可以为:
()
描述: 断开与 建立连接
参数:无
返回值: 失败返回, 错误号保存在全局变量中。
与请求 有关的
( *, *, , **, *, )
描述:客户端同步调用服务端的名为的,
参数:
*:的名称
*: 输入缓冲区的地址,客户端传给服务端的参数放在该缓冲区内
: 输入缓冲区的长度
** 输出缓冲区的地址,服务端传给客户端的结果放在该缓冲区内
*:输出缓冲区的长度
: 调用标志,由以下几个:
如果调用的客户端当前在方式下,那么不参与当前的。
如果服务端返回的缓冲区类型与客户端定义的缓冲区()类型不一致,默认情况下,会转换成与服务端返回的缓冲区类型一致的类型,如果设置了该,那么当出现这种情况时,不进行缓冲区类型转换,并且会保错。
默认情况下,如果客户端有阻塞条件存在(如的中的缓冲区满,磁盘忙等),那么客户端会阻塞在那里,直到阻塞消除或超时出错。如果设置了,当客户端有阻塞条件存在时()会立刻返回并报错. 注意只对发送请求时起作用,如果在接收服务端返回的结果时有阻塞条件存在,客户端会在那里等待,直到阻塞消除或超时出错
如果客户端有阻塞条件存在,客户端会一直阻塞在那里,即使到了超时时间也不返回,但如果该客户端是在模式下,当到了
事务的超时时间,还是会报超时错误并返回。
如果在进行系统调用时,被信号中断,该系统调用会重新进行。
调用成功返回,失败返回, 错误号保存在全局变量中。
( *, *, , )
描述: 客户端异步调用服务端的名为的,不等服务端返回结果,程序可继续往
下走,在某个地方调用()取的服务端的返回
参数:
*, *, 参数的含义与()中的一样
可设置为:, , , .
, , 的含义与与()中的一样
:调用()的客户端不想接收端的应答。如果设置了
:服务端不会给该客户端发送应答。
返回值: 失败返回,成功返回一个,可作为的参数,用于取应答
( *, **, *, )
描述:取出服务端对()的应答。
参数: ()返回的
**返回缓冲区的地址,服务端传给客户端的结果放在该缓冲区内
*:返回缓冲区的长度
:可以是:, ,(不管的值,从服务
器的应答队列中取第一个可用的消息),
返回值: 失败返回,错误号保存在全局变量中。
( )
描述: 如果当前的程序不处于事务模式中,取消对()的应答, 如果处于事务模式
中,则不能取消对()的应答,该调用会失败.
参数: ()返回的
返回值: 失败返回,错误号保存在全局变量中。
()
描述:返回最近发送(()())或接收(())的一个消息的优先级
参数:无
返回值: 消息的优先级,值越高, 优先级越高
失败返回, 错误号保存在全局变量中。
{
; * *
; * *
} [];
(; <; ) {
* *
[] (, , , );
* *
[] ();
}
* () *
((*) , , ([]), );
(; < ; ) {
([], , , );
}
( , )
描述: 设置下一个要发送的消息的优先级
参数: 为相对值, 设置下一个要发送的消息的优先级为现在的优先级加上
: 为绝对值, 设置下一个要发送的消息的优先级为
返回值: 失败返回,错误号保存在全局变量中。
与请求错误处理有关的
*( )
描述:返回错误号为的错误描述
参数: :在中定义的全局变量,用于标识错误号,类似于中的
返回值: 失败返回,成功返回错误号为的错误描述.
( )
描述: 返回当前进程或线程最近调用的出错的更详细的描述
参数:设为
返回值: 如果没有错误返回,有错误返回错误描述号
* ( , )
描述: 返回错误描述号的详细描述信息
参数:
: ()的返回值,
: 设为
返回值: 失败返回,成功返回详细描述信息
采用语言编写的客户端程序
如果是采用语言编写的客户端程序,可直接采用的函数,这些函数在中定义.采用语言编写的客户端的例子在此不列举,可参考等例子.采用语言编写客户端的编译是用命令进行的,它的使用格式如下:
[] [] [{ }] [ ] [ ] [ ]
参数说明:
: 编译用写的客户端
: 输出详细的编译信息
: 编译成 ,如果不带该参数,那么将编译成 .
: 编译生成的可执行文件名
: 要编译的文件名
: 指定要编译生成该可执行文件名要连接的其他库文件,如果有多个库文件要连接,它们之间用空格隔开.
: 指定该要连接的
调用或编译器来进行编译工作.所以客户端所在的机器要有编译器才能编译客户端的程序.
如果是客户端,可安装,并在环境下编译客户端的程序. 如果在安装时没有把自动设置环境变量的选项选上,中设置环境变量的文件在安装目录下的\\中,可手工执行它或在设置环境变量的文件中用调用它,如:
:\\\\
:\
:\\
\
\
\
如果是客户端,可安装等或编译器.并在环境变量中设置所用的编译器路径.
采用编写客户端程序
采用编写客户端程序与采用语言编写客户端的方式一样,但要对要进行一些设置才能进行编译,说明如下:
1. 在下的 中加上,如图所示:
2. 在下的 中选 ,然后加上的目录,如图所示:
. 在下的 中选 ,然后加上的目录,如图所示:
采用编写客户端程序
. 函数的声明
对,,,等客户端,提供一个编程接口,该文件名为,首先要在这些语言中声明所要用到的函数。因为中没有指针,我们把它们声明为型。如果是双重指针,可声明为 . 下面声明采用编写段程序常用到的函数
( ) ""
( ) ""
( , , ) ""
( , ) ""
( , ) ""
( , , , , , ) ""
( ) ""
( ) ""
( ) ""
( ) ""
( , ) ""
( , , , ) ""
( , , , ) ""
( , , , , ) ""
() ""
( ) ""
( , , , , ) ""
( , , , , ) ""
( , , , , ) ""
( , ) ""
( , ) ""
( , , ) ""
( ) ""
( ) "" ""
( ) "" ""
( , ) ""
( ) ""
( , , , , ) ""
( , , , , ) ""
. ()缓冲区的定义
在中缓冲区中字段的在*文件中定义,在中可以把它们定义为常量
.编程方式的改变
在两层的结构中,客户端直接访问数据库,当采用中间件后,形成三层结构。这时,客户端不直接访问数据库,而是改为调用中间件服务端上的服务,由服务端访问数据库,并把结果返回给客户端。所以这时候客户端上不用安装数据库的客户端,中的数据窗口的数据源也只能采用外部数据源。因为不能直接与数据库建立连接.
.对存储过程的处理
推荐的做法是把存储过程转换为 的,这样做工作量比较大,但是完全的层结构,另一种方式是存储过程不变,用一个 的去调用该存储过程,把结果返回给客户端.
.例子
下面我们举两个例子来说明在中编写客户端程序的方法.
为了方便在例子中调用,我们重新定义对缓冲区进行操作的函数如下:
( )
*作用:写一个浮点型数据到缓冲区的指定位置中
输入参数:
: 缓冲区
: 号
: 位置
: 要写入的浮点型数据
输入参数:无
返回值: 成功,失败
*
();
()
()
( "(" () ")出错: "())
( )
*作用:写一个整型数据到缓冲区的指定位置中
输入参数:
: 缓冲区
: 号
: 位置
: 要写入的整型数据
输入参数:无
返回值: 成功,失败
*
();
()
()
( "(" () ")出错: "())
( )
*作用:写一个字符型数据到缓冲区的指定位置中
输入参数:
: 缓冲区
: 号
: 位置
: 要写入的字符型数据
输入参数:无
返回值: 成功,失败返回相应的
*
()
()
()
( "(" () ")出错: "())
( , )
*作用:从缓冲区的指定位置中取浮点型数据到输入参数中
输入参数:
: 缓冲区
: 号
: 位置
: 取出的数据储存到中
输入参数:无
返回值: 成功,失败
*
(, , , , )
()
( "(" () ")出错: "())
( , )
*作用:从缓冲区的指定位置中取整型数据到输入参数中
输入参数:
: 缓冲区
: 号
: 位置
: 取出的数据储存到中
输入参数:无
返回值: 成功,失败
*
展开阅读全文