TUXEDO在文件传输中的应用

1 引言

  近几年来,以交易中间件为框架基础的三层客户机/服务器模式已被广泛证实为建立开放式关键业务应用系统的最佳环境。

  TUXEDO是美国BEA公司的一种交易中间件产品,它在银行、电信、邮政、金融证券等大规模关键事务处理领域中有着广泛的应用。它能够在 C/S环境下整合各种异构平台,通过联机事务处理机制,保证交易的完整性和数据的一致性。BEA TUXEDO是在企业、Internet 这样的分布式运算环境中开发和管理三层结构的客户/服务器型关键任务应用系统的强有力工具。

  BEA TUXEDO 采用三层结构的客户机/服务器模式组件软件模型,该结构利用交易中间件将应用的业务逻辑、表示逻辑和数据分为三个不同的处理层:客户为第一表示逻辑层,实现用户交互和数据表示,第二层的逻辑业务层为应用的主体,负责业务的逻辑处理,第三层数据层负责对数据库的检索、读取和更新等操作。交易中间件作为构造三层结构应用系统的基础平台,提供了两个主要功能:负责客户机和服务器间的联接和通讯;提供一个三层结构应用开发和运行的平台。由此可见,交易中间件提供了一个基础的框架去帮助你建立、运行和管理一个三层客户机/服务器模式的应用,使你不需要从零做起,大大缩短了应用开发的时间,提高了应用开发的成功率。

  本文以应用TUXEDO的同步调用tpcall方式和FML编程方式为例,介绍了在Windows客户端和Unix服务器之间完成文件传输的方法。客户端调用VC++制作的传输文件的tuxedo动态链接库,实现Windows客户端与Unix服务器端传输文件(包括上传和下载文件两种方式)的实现方法。

2 客户端应用TUXEDO实现文件传输方法

  在客户端,首先设置客户端与服务器端在文件传输中文件块的大小、文件的块标识等基本信息,将字节数比较大的文件分为很多小块,利用TUXEDO 的同步调用tpcall方式循环调用后台的文件处理服务,将字节数较大的文件按着块的大小分多次传输到UNIX后台。下面以下载文件为例讲解使用 tuxedo同步调用tpcall方式完成文件传输的例子。

  首先利用TUXEDO的tpalloc申请需要使用的发送和接收缓存,使用Fchg32函数在缓存中放入服务器端需要的域值:文件块的大小、文件的标识等基本信息。

SndBuf = (FBFR32 *)tpalloc("FML32", NULL, 1024); /* 申请发送的缓存 */
iRet = Fchg32(SndBuf,BLOCKSIZE,0,(char *)&lBlockSize,0); /* 设置文件块的大小 */
设置完毕后,开始使用同步tpcall调用UNIX后台文件处理FTPSVR服务。
/* 客户端同步调用UNIX平台文件处理服务*/
iRet = tpcall("FTPSVR",(char *)SndBuf,0L,(char **)&RcvBuf,(long *)&len,0L);
iRet = Fget32(RcvBuf, FILELEN, 0, (char *)&lFileLen, 0);/* 接收文件长度*/
接收文件并将第一块数据写入文件
iRet = Fget32(RcvBuf, FILEDATA, 0, pszFileBuf, (FLDLEN32 *)&lFileDataLen);
fp = fopen(pszCltFileName, "wb+"); /* 创建文件*/
lBlkLen = fwrite(pszFileBuf,1,lFileDataLen,fp); /* 将接收第一块数据写入文件*/
同时计算需要调用下载文件服务的次数,多次调用文件服务,将后续文件下载到客户端。
lBlkNum = (lFileLen -1)/lBlockSize +1 ;
for(i=2; i<lBlkNum+1;i++){
……
iRet = tpcall("FTPSVR",(char *)SndBuf,0L,(char **)&RcvBuf,(long *)&len,0L);
Fget32(RcvBuf, FILEDATA, 0, pszFileBuf, (FLDLEN32 *)&lBlockSize);
lBlkLen = fwrite(pszFileBuf, 1, lBlockSize, fp);
……

3 UNIX服务器端实现方法

  在Unix服务器端,接收客户端发送过来的缓存内容,如:文件块的大小、文件块内容、文件块标识等。根据文件块的标识移动文件指针来写文件,每次文件指针移动的大小由文件块的大小决定,并将读取的文件块的内容放入输出缓存中,并返回给客户端。Unix服务器端程序例子说明如下:

FTPSVR(TPSVCINFO *rqst)
{
…………
RcvBuf = (FBFR32 *)rqst->data; /*指向接收客户端的缓存*/
iRet = Fget32(RcvBuf, BLOCKID, 0, (char *)&lBlockID, 0); /* 接收client发送的块标识*/
fp = fopen(pszSvrFileName, "rb");  /* 打开文件,准备读取*/
(fseek(fp, (lBlockID-1)*lBlockSize, 0)!=0)  /* 根据块标识移动文件指针*/
lReadLen=fread(pszFileBuf, 1, lBlockSize, fp);  /* 读取文件块*/
Fchg32(SndBuf, FILEDATA, 0, pszFileBuf, (FLDLEN32 )lReadLen); /* 将文件块的内容方式放入tuxedo申请的缓存中*/
tpreturn(TPSUCCESS, 0, (char *)SndBuf, 0L, 0);  /* 将输出缓存返回给客户端*/

4 WINDOWS平台文件传输的设计

4.1 WINDOWS客户端动态链接库的实现

  使用PowerBuilder、Delphi、VB等软件不能直接调用 C语言源代码,它们只能调用动态链接库文件。下面我们讲述如何使用VC++6.0将Windows客户端的文件传输的C、TUXEDO代码制作成动态链接库供Power Builder、Delphi、VB等程序调用。
 使用VC++可以制作三种DLL,分别是
 (1)Non-MFC Dlls
 (2).Regular Dlls
 (3)Extension Dlls
  Non-MFC DLL:指的是不用MFC的类库结构,直接用C语言写的DLL,其输出的函数一般用的是标准C接口,并能被非MFC或MFC编写的应用程序所调用。因为我们不使用MFC类库,所以采用Non-MFC Dlls。

  每一个DLL必须有一个入口点,就象用C编写的应用程序,必须有一个main函数一样. DllMain就是一个缺省的函数入口。

  创建一个动态链接库,选择File->New菜单,弹出New对话框。在Projects标签页下,选择"Win32 Dynamic-Link Library"。Visual C++就会创建动态链接库所需的工程文件。
创建ftpfile.def文件,这个文件记录了可被外部应用程序使用的DLL库函数名字。这些名字信息和对应的函数位置的信息将被编译进动态链接库文件中,然后应用程序根据函数名字和函数位置对照表来找到对应的函数。ftpfile.def内容如下:

LIBRARY "ftpfile"
EXPORTS
ftpfile; /*与C代码中的函数名称相同*/
将ftpfile.def、源程序ftpfile.cpp、头文件public.h和ftpfld.h、tuxedo库文件wtuxws32.lib和libwsc.lib加入到工程中。选择Project->add to project->files.然后开始编译动态链接库生成ftpfile.dll。
代码样例如下:
BOOL WINAPI DllMain( HMODULE hModule, DWORD dwReason, LPVOID lpvReserved )
/* 动态链接库函数入口*/
{
return TRUE;
}
LRESULT WINAPI ftpfile(char* CltFileName,char* SvrFileName,long lBlockSize,long lOptFlag) /* 动态链接库函数主体*/
{
FBFR32 *RcvBuf,*SndBuf; /*变量声明*/
int iRet;
long i,lBlkLen,len,lFileLen,lBlkNum;
…………
/* 动态链接库程序主体*/
SndBuf = (FBFR32 *)tpalloc("FML32", NULL, MAXBUFLEN); /*申请发送缓存*/
if (SndBuf == NULL)
{
userlog("tpalloc sndbuf error errno=[%d] err=[%s]",tpstrerror(tperrno));
tpterm();
return TPALLOCERR;
}
RcvBuf = (FBFR32 *)tpalloc("FML32", NULL, MAXBUFLEN);/*申请接收缓存*/
iRet = Fchg32(SndBuf,BLOCKSIZE,0,(char *)&lBlockSize,0); /*把块大小放入发送缓存*/
if (iRet <0){ /*错误处理*/
tpfree((char *)SndBuf);
tpfree((char *)RcvBuf);
tpterm();
return FCHGERR;
}
iRet = Fchg32(SndBuf,OPTFLAG,0,(char *)&lOptFlag,0);
……………………………
}/* 程序主体结束*/

4.2 WINDOWS客户端动态链接库的调用

  以Power Builder7.0为例,讲述如何在Power Builder中调用文件传输的客户端动态链接库。

  首先,在Power Builder声明该函数,声明如下:
Function Integer ftpfile(string CltFileName,string SvrFileName,long lBlockSize,long lOptFlag) LIBRARY "ftpfile.dll"
然后,在程序中就可以应用了。示例如下:
string CltFileName
string SvrFileName
long lBlockSize
long lOptFlag /*设置文件上传或下载标志*/
integer iRet

CltFileName="..\data\report.txt"
SvrFileName="../up/form.txt"
LBlockSize=1024
LOptFlag=1
IRet = ftpfile(CltFileName,SvrFileName,lBlockSize,lOptFlag)
If (iret< 0){
messagebox('系统提示','调用ftpfile函数错误')
return
}

5 结束语

  本文通过分析TUXEDO交易中间件的同步调用TPCALL和FML编程方式,描述了在Windows和UNIX平台之间如何完成文件传输的方法,概述了Windows平台如何制作和调用动态链接库。

posted @ 2007-07-13 09:41 阿龙 阅读(513) | 评论 (0)编辑 收藏

 

TUXEDO函数说明

  

1与缓冲区使用有关的ATMI 2

1.1tpalloc. 2

1.2tprealloc. 2

1.3tpfree. 2

1.4tptypes. 2

2常用的FML(FML32)操作函数... 3

2.1Falloc. 3

2.2Finit 3

2.3Fadd. 3

2.4Fchg. 3

2.5Fget 4

2.5Fprint 4

2.6Ferror 4

3连接的建立与断开有关的ATMI 5

3.1tpchkauth. 5

3.2tpinit 5

3.3tpterm.. 6

4与请求TUXEDO SERVER 有关的ATMI 6

4.1tpcall 6

4.2tpacall 7

4.3tpgetrply. 7

4.4tpcancel 7

4.5tpgprio. 8

4.6tpsprio. 8

5与请求错误处理有关的ATMI 8

5.1tpstrerror 8

5.2tperrordetail 9

5.3tpstrerrordetail 9

 


 

 

1与缓冲区使用有关的ATMI

1.1tpalloc

char * tpalloc(char *type, char *subtype, long size)

描述:分配缓冲区

参数:type:缓冲区的类型

    subtype:缓冲区的子类型,只有VIEW有子类型,其他的缓冲区该参数要设为NULL

    long:缓冲区的大小

返回值: 成功返回一个指向所分配空间首地址的CHAR *形指针,失败返回NULL。

1.2tprealloc

char * tprealloc(char *ptr, long size)

描述:重新分配缓冲区

参数:ptr:指向原缓冲区首地址的指针

    size:新缓冲区的大小

返回值: 成功返回一个指向新分配空间首地址的CHAR *形指针,失败返回NULL。

1.3tpfree

void tpfree(char *bufptr)

描述:释放由TPALLOC()或TPREALLOC()分配的缓冲区

参数:bufptr:指向要释放的缓冲区首地址的指针

返回值:无

注意: 用TPALLOC(),TPREALLOC()分配的内存只能有TPFREE()释放掉,不能用FREE()

1.4tptypes

long tptypes(char *ptr, char *type, char *subtype)

描述:返回有ptr所指向的缓冲区的类型及子类型

参数: ptr:指向要进行类型识别的缓冲区首地址的指针

type:类型名

subtype:子类型名(只对VIEW类型有效)

返回值:0成功,-1失败, 错误号保存在全局变量tperrno中。

 

2常用的FML(FML32)操作函数

2.1Falloc

FBFR* Falloc (FLDOCC F, FLDLEN V)

描述: 分配一块FML缓冲区

参数:

    FLDOCC: 该FML缓冲区的字段个数,

    FLDLEN: 该FML缓冲区的长度

返回值:成功返回一个指向该FML缓冲区首地址的指针,失败返回NULL,错误号保存在全局

变量Ferror中

注意:   该FML缓冲区不能用于TPCALL(),TPACALL(),TPRETURN()等中,在这些函数中用到

FML缓冲区只能用TPALLOC()分配。

2.2Finit

int Finit(FBFR *fbfr, FLDLEN buflen)

描述: 初始化该FML缓冲区

参数:

   fbfr: 一个指向该FML缓冲区首地址的指针

   buflen: 该FML缓冲区的长度

返回值:失败为-1, 错误号保存在全局变量Ferror中

2.3Fadd

int Fadd(FBFR *fbfr, FLDID fieldid, char *value, FLDLEN len)

 

描述: 往FML缓冲区fbfr中ID为fieldid的字段增加一个值value

参数:

fbfr:    指向该FML缓冲区首地址的指针

fieldid: 要增加的字段的ID

value:   要增加的值,如果时其他类型的要转化为char *

len:     该字段的长度,如果不时CARRARY类型的,可设为0

返回值: 失败为-1, 错误号保存在全局变量Ferror中

2.4Fchg

int Fchg(FBFR *fbfr, FLDID fieldid,int occ, char *value, FLDLEN len)

描述:   改变fbfr中ID为fieldid字段的值。

参数:

fbfr:    指向该FML缓冲区首地址的指针

fieldid: 要增加的字段的ID

value:   该字段的新值,如果时其他类型的要转化为char *

len:     该字段的长度,如果不时CARRARY类型的,可设为0

返回值:失败为-1,错误号保存在全局变量Ferror中

2.5Fget

int Fget(FBFR *fbfr, FLDID fieldid,int occ, char *value, FLDLEN *maxlen)

描述:   从fbfr缓冲区中取ID为fieldid字段的值到value中。

参数:

fbfr:    指向该FML缓冲区首地址的指针

fieldid: 字段的ID

value:   取出的值保存到该指针指向的地址中

maxlen: 可以COPY到缓冲区value中的字符串的长度,返回值为真正COPY到该缓冲区的字

符串的长度

返回值:失败为-1, 错误号保存在全局变量Ferror中

2.5Fprint

Fprint(FBFR *fbfr)

描述: 按格式打印fbfr缓冲区的内容。一般用于程序调试中。

参数:

fbfr:    指向该FML缓冲区首地址的指针

返回值:失败为-1, 错误号保存在全局变量Ferror中

2.6Ferror

Ferror

C语言中的errno类似,当调用FML(FML32)函数出错时,把错误号保存在全局变量Ferror中。

char * Fstrerror(int err)

描述:返回错误号为err错误描述

参数:err: Ferror的值

返回值:成功返回错误描述,失败返回NULL

3连接的建立与断开有关的ATMI

3.1tpchkauth

int tpchkauth()

描述: 检查该TUXEDO SERVER所采用的安全方式

参数:无

返回值:

      TPNOAUTH:不需要认证

      TPSYSAUTH:需要口令认证

      TPAPPSUTH:需要口令认证,并且还需要应用级的认证或授权.

      -1:调用失败, 错误号保存在全局变量tperrno中。

3.2tpinit

int tpinit(TPINIT *tpinfo)

描述: 与TUXEDO SERVER建立连接

参数:TPINFO

返回值: 失败返回-1, 错误号保存在全局变量tperrno中。

 

TPINIT结构体在atmi.h中的定义如下

struct tpinfo_t {

    char    usrname[MAXTIDENT+2];   /* client user name */

    char        cltname[MAXTIDENT+2];   /* application client name */

    char  passwd[MAXTIDENT+2];    /* application password */

    char    grpname[MAXTIDENT+2];   /* client group name */

    long  flags;          /* initialization flags */

    long    datalen;        /* length of app specific data */

    long    data;           /* placeholder for app data */

};

typedef struct tpinfo_t TPINIT;

说明:username,cltname,passwd,grpname,data,datalen用于安全认证中

flags:用于定义以何种方式通知该客户端一个UNSOLICTED MESSAGE的到来.它的值可以为:

TPU-SIG

TPU-DIP

TPU-IGN

TPSA-FASTPATH

TPSA-PROTECTED

3.3tpterm

int tpterm()

描述: 断开与TUXEDO SERVER建立连接

参数:无

返回值: 失败返回-1, 错误号保存在全局变量tperrno中


 

4与请求TUXEDO SERVER 有关的ATMI

4.1tpcall

int tpcall(char *svc, char *idata, long ilen, char **odata, long   *olen, long flags)

描述:客户端同步调用服务端的名为svc的SERVICE,

参数:

*svc:SERVICE的名称

char *idata: 输入缓冲区的地址,客户端传给服务端的参数放在该缓冲区内

long ilen:   输入缓冲区的长度

char **odata 输出缓冲区的地址,服务端传给客户端的结果放在该缓冲区内

long   *olen:输出缓冲区的长度  

long flags: 调用标志,由以下几个:

TPNOTRAN

如果调用svc的客户端当前在TRANSACTION方式下,那么svc不参与当前的TRANSACTION。

 

TPNOCHANGE

如果服务端返回的缓冲区类型与客户端定义的缓冲区(odata)类型不一致,默认情况下,odata会转换成与服务端返回的缓冲区类型一致的类型,如果设置了该FLAG,那么当出现这种情况时,不进行缓冲区类型转换,并且会保错。

 

TPNOBLOCK

默认情况下,如果客户端有阻塞条件存在(如CLIENT的TCP/IP中的缓冲区满,磁盘I/O忙等),那么客户端会阻塞在那里,直到阻塞消除或超时出错。如果设置了TPNOBLOCK,当客户端有阻塞条件存在时,TPCALL()会立刻返回并报错. 注意TPNOBLOCK只对发送请求时起作用,如果在接收服务端返回的结果时有阻塞条件存在,客户端会在那里等待,直到阻塞消除或超时出错

 

TPNOTIME

如果客户端有阻塞条件存在,客户端会一直阻塞在那里,即使到了超时时间也不返回,但如果该客户端是在TRANSACTION模式下,当到了

事务的超时时间,还是会报超时错误并返回。

 

TPSIGRSTRT

如果在进行系统调用时,被信号中断,该系统调用会重新进行。

 

调用成功返回0,失败返回-1, 错误号保存在全局变量tperrno中。

 

4.2tpacall

int tpacall(char *svc, char *data, long len, long flags)

描述: 客户端异步调用服务端的名为svc的SERVICE,不等服务端返回结果,程序可继续往

下走,在某个地方调用tpgetrply()取的服务端的返回

参数:

char *svc, char *data, long len参数的含义与tpcall()中的一样

flags 可设置为:TPNOTRAN, TPNOREPLY, TPNOBLOCKTPNOTIME, TPSIGRSTRT.

TPNOTRAN, TPNOBLOCKTPNOTIME, TPSIGRSTRT的含义与tpcall()中的一样

TPNOREPLY:调用tpacall()的客户端不想接收SEVER端的应答。如果设置了

TPNOREPLY:服务端不会给该客户端发送应答。

返回值: 失败返回-1,成功返回一个HANDLER,可作为tpgetrply的参数,用于取应答

4.3tpgetrply

int tpgetrply(int *cd, char **data, long *len, long flags)

描述:取出服务端对tpacall()的应答。

参数: cd tpacall()返回的HANDLER

char **data返回缓冲区的地址,服务端传给客户端的结果放在该缓冲区内

long   *len:返回缓冲区的长度

flags:可以是:TPNOBLOCK, TPNOTIME,TPSIGRSTRT,TPGETANY(不管cd的值,从服务

器的应答队列中取第一个可用的消息),TPNOCHANGE

返回值: 失败返回-1,错误号保存在全局变量tperrno中。

 

4.4tpcancel

int tpcancel(int handle)

描述: 如果当前的程序不处于事务模式中,取消对tpacall()的应答, 如果处于事务模式

,则不能取消对tpacall()的应答,该调用会失败.

参数: tpacall()返回的HANDLER

返回值: 失败返回-1,错误号保存在全局变量tperrno中。

4.5tpgprio

int tpgprio()

描述:返回最近发送(tpcall(),tpacall())或接收(tpgetrply())的一个消息的优先级

参数:无

返回值: 1-100消息的优先级,值越高, 优先级越高

        失败返回-1, 错误号保存在全局变量tperrno中。

 

struct {

int hdl; /* handle*/

int pr; /* priority*/

} pa[SIZE];

for (i=0; i<requests; i++) {

/* Determine service and data for request */

pa [i].hdl = tpacall(Svc, buf, len, flags);

/* Save priority used to send request */

pa[i].pr = tpgprio();

}

/* Use qsort(3) routine to sort handles in priority order */

qsort((char*) pa, requests, sizeof(pa[0]), cmpfcn);

for (i=0; i< requests; i++) {

tpgetrply(&pa[i].hdl, &rbufp, &rlen, rflags);

}

 

4.6tpsprio

int tpsprio (int prio, long flags)

描述: 设置下一个要发送的消息的优先级

参数: 0- prio为相对值, 设置下一个要发送的消息的优先级为现在的优先级加上prio

     TPABSOLUTE: prio为绝对值, 设置下一个要发送的消息的优先级为prio

返回值: 失败返回-1,错误号保存在全局变量tperrno中。

5与请求错误处理有关的ATMI

5.1tpstrerror

char *tpstrerror(int tperrno)

描述:返回错误号为tperrno的错误描述

参数: tperrno:在atmi.h中定义的全局变量,用于标识错误号,类似于C中的errno

返回值: 失败返回NULL,成功返回错误号为tperrno的错误描述.

5.2tperrordetail

int tperrordetail(long flags)

描述: 返回当前进程或线程最近调用ATMI的出错的更详细的描述

参数:设为0

返回值: 如果没有错误返回0,有错误返回错误描述号

 

5.3tpstrerrordetail

char * tpstrerrordetail(int err, long flags)

描述: 返回错误描述号err详细描述信息

参数:

err : tperrordetail()的返回值,

flags: 设为0

返回值: 失败返回NULL,成功返回详细描述信息

posted @ 2007-07-06 11:15 阿龙 阅读(470) | 评论 (0)编辑 收藏

首先,它可以显示你TCP/IP协议的相关设置。在命令提示窗口(CMD.EXE)里输入下列命令:
  netsh interface ip show config
  你还可以用它来更改计算机的IP地址或者配置TCP/IP的其它相关属性。例如,你想为计算机的"本地连接"指定一个静态的IP地址: 192.168.0.100,设置其子网掩码为255.255.255.0,并指定默认网关为192.168.0.1,你只需要在命令提示窗口里输入下列命令就可以了:
netsh interface ip set address name="Local Area Connection" static 192.168.0.100 255.255.255.0 192.168.0.1 1
(注意:这是一条完整的命令,输入的时候请不要换行。)
  如果你有一台笔记本电脑,而且你需要在两个以上不同的地方接入网络(并且每个网络都需要使用静态IP地址),那么你也可以使用netsh.exe来快速地切换TCP/IP设置,以适应不同网络的需要。ntesh.exe可以把不同的TCP/IP设置导出成不同的配置文件,然后在需要的时候导入配置文件来更改相应的设置。

  例如,现在你的笔记本接入了网络1,并且已经做好了相应的网络设置。这时你可以在命令提示窗口输入:
  netsh -c interface dump > c:\a.txt

  通过这条命令把相应的TCP/IP设置导出至c:\下文件名为a.txt的文本文件。以此类推,你可以把不同网络环境的设置导出到不同的配置文件中。在需要接入不同的网络中时,你只需要使用下面这条命令就可以了:
  netsh -f c:\b.txt(或者:netsh -f c:\b.txt)

  除此之外,你还可以通过netsh.exe来配置网络适配器,让它从DHCP服务器自动获得IP地址。命令如下:
  netsh interface ip set address "Local Area Connection" dhcp

  还可以进行WINS配置:
  netsh interface ip set wins "Local Area Connection" static 192.168.0.200

  当然,只要你想,你还可以通过netsh.exe使网络适配器动态获得DNS设置:
  netsh interface ip set dns "Local Area Connection" dhcp

  netsh.exe是一个很有用的自定义TCP/IP设置的工具。

netsh命令的强大没有人会怀疑,有经验的管理员都会深深会到这一点;

netsh工具
netsh.exe可以用来配置TCP/IP设置:IP地址、子网掩码、默认网关、DNS和WINS地址和其他选项。
3.1 显示TCP/IP设置
netsh interface ip show config


3.2 配置IP地址
netsh interface ip set address name=“本地连接" static 192.168.0.100 255.255.255.0 192.168.0.1 1


3.3 export your current IP settings
netsh -c interface dump > c:\location1.txt

3.4 import your IP settings
netsh -f c:\location1.txt
或者是      netsh exec c:\location2.txt


3.5 自动获得IP地址和DNS地址
netsh interface ip set address “本地连接” dhcp
netsh interface ip set dns “本地连接” dhcp


3.6 configure DNS and WINS addresses
netsh interface ip set dns “本地连接" static 192.168.0.200
netsh interface ip set wins “本地连接" static 192.168.0.200

[用批处理文件设置本地连接的IP]

新建一个文本,输入

代码:
int ip
set address name="本地连接" source=static addr=局域网地址     mask=255.255.255.0
set address name="本地连接" gateway=网关地址     gwmetric=0
set dns name="本地连接" source=static addr=DNS地址 register=PRIMARY



然后保存为IP.sh格式。

然后新建文本。输入

代码:
netsh exec ip.sh

然后保存为ip.bat

******************************************************************************************

唯一可以快速切换网络设置的方法就是使用netsh命令,首先我们设定单位的网络设置,然后进入命令行模式(开始→运行→CMD),输入“netsh -c interface dump >c:gongsi.txt”(不含引号) 。再设定成家里的网络设置,完毕后在命令行模式中输入“netsh -c interface dump >c:jia.txt”。

  以后我们到了公司只要输入“netsh -f c:gongsi.txt”就可以马上恢复为公司网络设置。同理输入“netsh -f c:jia.txt”即可恢复为家里的网络设置。这种切换网络参数的方法不用重新启动计算机。如果把命令写入批处理文件的话,我们只要通过鼠标双击相应文件就可以完成相应设置的切换工作了。

*****************************************************************************************

如果没有提示就重启,更新一下TCP/IP协议,在命令提示符中敲入
netsh int ip reset c:\resetlog.tex 完成后,把本地连接停用后再启用

*****************************************************************************************

posted @ 2007-06-20 14:18 阿龙 阅读(563) | 评论 (0)编辑 收藏

经常看到jsp的初学者问tomcat下如何配置jsp、servlet和bean的问题,于是总结了一下如何tomcat下配置jsp、servlet和ben,希望对那些初学者有所帮助。

第一步:下载j2sdk和tomcat:到sun官方站点(http://java.sun.com/j2se/1.4.2/download.html)下载j2sdk,注意下载版本为Windows Offline Installation的SDK,同时最好下载J2SE 1.4.2 Documentation,然后到tomcat官方站点(http://www.apache.org/dist/jakarta/tomcat-4/)下载tomcat(下载最新4.1.x版本的tomcat);

第二步:安装和配置你的j2sdk和tomcat:执行j2sdk和tomcat的安装程序,然后按默认设置进行安装即可。
1.安装j2sdk以后,需要配置一下环境变量,在我的电脑->;属性->;高级->;环境变量->;系统变量中添加以下环境变量(假定你的j2sdk安装在c:\j2sdk1.4.2):
JAVA_HOME=c:\j2sdk1.4.2
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(.;一定不能少,因为它代表当前路径)
path=%JAVA_HOME%\bin
接着可以写一个简单的java程序来测试J2SDK是否已安装成功:
public class Test{
public static void main(String args[]){
System.out.println("This is a test program.");
}
}
将上面的这段程序保存为文件名为Test.java的文件。
然后打开命令提示符窗口,cd到你的Test.java所在目录,然后键入下面的命令 
javac Test.java
java Test 
此时如果看到打印出来This is a test program.的话说明安装成功了,如果没有打印出这句话,你需要仔细检查一下你的配置情况。

2.安装Tomcat后,在我的电脑->;属性->;高级->;环境变量->;系统变量中添加以下环境变量(假定你的tomcat安装在c:\tomcat):
CATALINA_HOME=c:\tomcat;
CATALINA_BASE=c:\tomcat;
然后修改环境变量中的classpath,把tomat安装目录下的common\lib下的servlet.jar追加到classpath中去,修改后的classpath如下:
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet.jar;
接着可以启动tomcat,在IE中访问http://localhost:8080,如果看到tomcat的欢迎页面的话说明安装成功了。

第三步:建立自己的jsp app目录
1.到Tomcat的安装目录的webapps目录,可以看到ROOT,examples, tomcat-docs之类Tomcat自带的的目录;
2.在webapps目录下新建一个目录,起名叫myapp;
3.myapp下新建一个目录WEB-INF,注意,目录名称是区分大小写的;
4.WEB-INF下新建一个文件web.xml,内容如下:
<?xml version="1.0" encoding="ISO-8859-1"?>;

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">;

<web-app>;
<display-name>;My Web Application</display-name>;
<description>;
A application for test.
</description>;
</web-app>;
5.在myapp下新建一个测试的jsp页面,文件名为index.jsp,文件内容如下:
<html>;<body>;<center>;
Now time is: <%=new java.util.Date()%>;
</center>;</body>;</html>;
6.重启Tomcat
7.打开浏览器,输入http://localhost:8080/myapp/index.jsp 看到当前时间的话说明就成功了。

第四步:建立自己的Servlet:
1.用你最熟悉的编辑器(建议使用有语法检查的java ide)新建一个servlet程序,文件名为Test.java,文件内容如下:
package test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Test extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out=response.getWriter();
out.println("<html>;<body>;<h1>;This is a servlet test.</h1>;</body>;</html>;");
out.flush();
}
}
2 .编译
将Test.java放在c:\test下,使用如下命令编译:
C:\Test>;javac Test.java
然后在c:\Test下会产生一个编译后的servlet文件:Test.class
3 .将结构test\Test.class剪切到%CATALINA_HOME%\webapps\myapp\WEB-INF\classes下,也就是剪切那个test目录到classes目录下,如果classes目录不存在,就新建一个。 现在webapps\myapp\WEB-INF\classes下有test\Test.class的文件目录结构
4 .修改webapps\myapp\WEB-INF\web.xml,添加servlet和servlet-mapping
编辑后的web.xml如下所示,红色为添加的内容:
<?xml version="1.0" encoding="ISO-8859-1"?>;

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">;

<display-name>;My Web Application</display-name>;
<description>;
A application for test.
</description>;
<servlet>;
<servlet-name>;Test</servlet-name>;
<display-name>;Test</display-name>;
<description>;A test Servlet</description>;
<servlet-class>;test.Test</servlet-class>;
</servlet>;
<servlet-mapping>;
<servlet-name>;Test</servlet-name>;
<url-pattern>;/Test</url-pattern>;
</servlet-mapping>;
</web-app>;
这段话中的servlet这一段声明了你要调用的Servlet,而servlet-mapping则是将声明的servlet“映射”到地址/Test上
5 .好了,启动Tomcat,启动浏览器,输入http://localhost:8080/myapp/Test 如果看到输出This is a servlet test.就说明编写的servlet成功了。
注意:修改了web.xml以及新加了class,都要重启Tomcat

第四步:建立自己的Bean:
1.用你最熟悉的编辑器(建议使用有语法检查的java ide)新建一个java程序,文件名为TestBean.java,文件内容如下:
package test;
public class TestBean{
private String name = null;
public TestBean(String strName_p){
this.name=strName_p;

public void setName(String strName_p){
this.name=strName_p;
}
public String getName(){
return this.name;

}
2 .编译
将TestBean.java放在c:\test下,使用如下命令编译:
C:\Test>;javac TestBean.java
然后在c:\Test下会产生一个编译后的bean文件:TestBean.class
3 .将TestBean.class文件剪切到 %CATALINA_HOME%\webapps\myapp\WEB-INF\classes\test下,
4 .新建一个TestBean.jsp文件,文件内容为:
<%@ page import="test.TestBean" %>; 
<html>;<body>;<center>;
<%
TestBean testBean=new TestBean("This is a test java bean.");
%>;
Java bean name is: <%=testBean.getName()%>;
</center>;</body>;</html>; 
5 .好了,重启Tomcat,启动浏览器,输入http://localhost:8080/myapp/TestBean.jsp 如果看到输出Java bean name is: This is a test java bean.就说明编写的Bean成功了。

这样就完成了整个Tomcat下的jsp、servlet和javabean的配置。接下来需要做的事情就是多看书、多读别人的好代码,自己多动手写代码以增强自己在这方面开发的能力了。

posted @ 2007-06-19 15:24 阿龙 阅读(153) | 评论 (0)编辑 收藏

web.xml元素介绍

web.xml首先是肯定要包含它的schema.

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

</web-app>

其它的元素都放在<web-app></web-app>之中。

<discription></discription> 是对站台的描述
<display-name></display-name> 定义站台的名称
<distributable/> 是指定该站台是否可分布式处理


<context-param></context-param> 用来设定web站台的环境参数,它包含两个子元素:
    <param-name></param-name> 用来指定参数的名称
    <param-value></param-value> 用来设定参数值

比如:
<context-param>
    <param-name>my_param</param-name>
    <param-value>hello</param-value>
</context-param>

在此设定的参数,可以在servlet中用 getServletContext().getInitParameter("my_param") 来取得


<filter></filter> 是用来声明filter的相关设定,它包含以下子元素:
    <filter-name></filter-name> 这当然就是指定filter的名字
    <filter-class></filter-class> 这是用来定义filter的类的名称
    <init-param></init-param> 用来定义参数,它有两个子元素:
        <param-name></param-name> 用来指定参数的名称
        <param-value></param-value> 用来设定参数值

比如:
<filter>
        <filter-name>setCharacterEncoding</filter-name>
        <filter-class>com.myTest.setCharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>GB2312</param-value>
        </init-param>
</filter>

与<filter></filter>同时使用的是<filter-mapping></filter-mapping> 用来定义filter所对应的URL,它有两个子元素:
    <filter-name></filter-name> 指定filter的名字
    <url-pattern></url-pattern> 指定filter所对应的URL

比如:
<filter-mapping>
        <filter-name>setCharacterEncoding</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>


<listener></listener> 用来设定Listener接口,它的主要子元素为
    <listener-class></listener-class> 定义Listener的类名称

比如:
<listener>
    <listener-class>com.myTest.ContextListener</listener-class>
</listener>



<servlet></servlet> 用来声明一个servlet的数据,主要有以下子元素:
    <servlet-name></servlet-name> 指定servlet的名称
    <servlet-class></servlet-class> 指定servlet的类名称
    <jsp-file></jsp-file> 指定web站台中的某个JSP网页的完整路径
    <init-param></init-param> 用来定义参数,和前面的<init-param>差不多

同样,与<servlet></servlet>一起使用的是<servlet-mapping></servlet-mapping> 用来定义servlet所对应的URL,包含两个子元素:
    <servlet-name></servlet-name> 指定servlet的名称
    <url-pattern></url-pattern> 指定servlet所对应的URL

比如:
<servlet>
        <servlet-name>ShoppingServlet</servlet-name>
        <servlet-class>com.myTest.ShoppingServlet</servlet-class>
</servlet>
   
<servlet-mapping>
        <servlet-name>ShoppingServlet</servlet-name>
        <url-pattern>/shop/ShoppingServlet</url-pattern>
</servlet-mapping>


<session-config></session-config> 用来定义web站台中的session参数,包含一个子元素:
    <session-timeout></session-timeout> 用来定义这个web站台所有session的有效期限,单位为                                                              分钟


<mime-mapping></mime-mapping> 定义某一个扩展名和某一个MIME Type做对映,包含两个                                                        子元素:
    <extension></extension> 扩展名的名称
    <mime-type></mime-type> MIME格式

比如:
<mime-mapping>
    <extension>doc</extension>
    <mime-type>application/vnd.ms-word</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>xls</extension>
    <mime-type>application/vnd.ms-excel</mime-type>
</mime-mapping>


<welcome-file-list></welcom-file-list> 用来定义首页的列单,包含一个子元素:
    <welcome-file></welcome-file> 指定首页的文件名称

比如:
<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.html</welcome-file>
</welcom-file-list>



<error-page></error-page> 用来处理错误代码或异常的页面,有三个子元素:
    <error-code></error-code> 指定错误代码
    <exception-type></exception-type> 指定一个JAVA异常类型
    <location></location> 指定在web站台内的相关资源路径

比如:
<error-page>
    <error-code>404</error-code>
    <location>/error404.jsp</location>
</error-page>
<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/exception.jsp</location>
</error-page>


<taglib></taglib> 用来设定JSP网页所用到的Tag Library路径,有两个子元素:
    <taglib-uri></taglib-uri> 定义TLD文件的URI,在JSP网页中用taglib指令便可取得该URI的                                              TLD文件
    <taglib-location></taglib-location> 指定TLD文件相对于web站台的存放位置

比如:
<taglib>
      <taglib-uri>myTaglib</taglib-uri>
      <taglib-location>/WEB-INF/tlds/MyTaglib.tld</taglib-location>
</taglib>


<resource-ref></resource-ref> 定义利用JNDI取得站台可利用的资源,有五个子元素:
    <description></description> 资源说明
    <rec-ref-name></rec-ref-name> 资源名称
    <res-type></res-type> 资源种类
    <res-auth></res-auth> 资源经由Application或Container来许可
    <res-sharing-scope></res-sharing-scope> 资源是否可以共享,有Shareable和Unshareable两个                                                                     值,默认为Shareable

比如,配置数据库连接池就可在此配置:
<resource-ref>
        <description>JNDI JDBC DataSource of shop</description>
        <res-ref-name>jdbc/sample_db</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
</resource-ref>



<jsp-config> 包括<taglib> 和<jsp-property-group> 两个子元素。
    
    其中<taglib>元素在JSP 1.2时就已经存在;而<jsp-property-group>是JSP 2.0 新增的元素。
    <jsp-property-group>元素主要有八个子元素,它们分别为:
    
    1.<description>:设定的说明;
    2.<display-name>:设定名称;
    3.<url-pattern>:设定值所影响的范围,如:/CH2 或 /*.jsp;
    4.<el-ignored>:若为true,表示不支持EL 语法;
    5.<scripting-invalid>:若为true,表示不支持<% scripting %>语法;
    6.<page-encoding>:设定JSP 网页的编码;
    7.<include-prelude>:设置JSP 网页的抬头,扩展名为.jspf;
    8.<include-coda>:设置JSP 网页的结尾,扩展名为.jspf。


一个简单的<jsp-config>元素完整配置:

<jsp-config>
    <taglib>
        <taglib-uri>Taglib</taglib-uri>
        <taglib-location>/WEB-INF/tlds/MyTaglib.tld</taglib-location>
    </taglib>
    <jsp-property-group>
        <description>Special property group for JSP Configuration JSP example.</description>
        <display-name>JSPConfiguration</display-name>
        <url-pattern>/jsp/* </url-pattern>
        <el-ignored>true</el-ignored>
        <page-encoding>GB2312</page-encoding>
        <scripting-invalid>true</scripting-invalid>
        <include-prelude>/include/prelude.jspf</include-prelude>
        <include-coda>/include/coda.jspf</include-coda>
    </jsp-property-group>
</jsp-config>



配置web.xml来限制对某些servlet的请求

有时我们只希望通过认证的用户才能请求某些servlet的话,就可以在web.xml中来进行相应的配置,来达到此目的。

这就要用到<security-constraint></security-constraint>元素。
对于tomcat,中web.xml使用security-constraint元素需要在位于<Tomcat-installation-directory>/conf/tomcat-users.xml的XML文件中创建用户名和密码。比如下面的这个tomcat-users.xml文件:

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="tomcat"/>
  <role rolename="manager"/>
  <role rolename="admin"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="both" password="tomcat" roles="tomcat,manager"/>
  <user username="admin" password="admin" roles="admin"/>
</tomcat-users>

此XML片段包括一个tomcat-users根元素,它包含一个或多个role和user元素。


然后在Web应用程序的web.xml中创建security-constraint、login-config和security-role元素。

<security-constraint>
      <web-resource-collection>
          <web-resource-name>HelloServlet</web-resource-name>
          <url-pattern>/HelloServlet</url-pattern>
          <http-method>GET</http-method>
          <http-method>POST</http-method>
      </web-resource-collection>
      <auth-constraint>
          <description>This applies only to the "tomcat" security role</description>
          <role-name>admin</role-name>
      </auth-constraint>
      <user-data-constraint>
          <transport-guarantee>NONE</transport-guarantee>
      </user-data-constraint>
  </security-constraint>
 
  <login-config>
      <auth-method>BASIC</auth-method>
  </login-config>
  <security-role>
      <role-name>admin</role-name>
  </security-role>

其中security-constraint元素包含一个或多个web-resource-collection元素,它是描述Web应用程序中的哪些web资源受到指定安全限制的保护。http-method元素指定安全限制覆盖的HTTP方法。上面的例子中,当我们对/HelloServlet的GET或POST请求时将触发配置的安全机制。
auth-constraint元素用于描述允许访问Web组件的安全角色。此例中安全角色的例子有tomcat、manager、admin。而只有当作为admin角色的用户才可以访问HelloServlet。

Web应用程序通过login-config元素来认证用户,并确认该用户是否为正确的角色。
longin-config包含的transport-guarantee子元素用来指定认证方法,BASIC是一种常见的Web认证方式,浏览器给用户提示一个对话框,要求输入用户名和密码,随后Tomcat将给出的用户名和密码与tomcat-users.xml中的用户名和密码进行比较,然后使用前面的security-constraint配置来确定用户是否可访问受保护的servlet。

(除BASIC外,还可以是FORM、CLIENT-CERT、DIGEST等)

其实这种认证方法实际上有两个步骤:
1、检查提供的用户名和密码是否正确。
2、判断用户是否映射到特定的安全角色。例如,用户可能提供了正确的用户名和密码,但没有映射到特定的安全角色,也将被禁止访问特定的Web资源。

posted @ 2007-06-19 15:18 阿龙 阅读(418) | 评论 (0)编辑 收藏

     摘要: 进程和线程编程 目 录 进程和线程编程 原始管道 pipe() dup() dup2() popen()和pclose() 命名管道 ...  阅读全文

posted @ 2007-06-15 19:00 阿龙 阅读(1388) | 评论 (0)编辑 收藏

仅列出标题
共2页: 1 2