本节根据tuxedo自带samples的例子,让其运行起来。并通过这个例子,深入的理解tuxedo的通讯方式。

进入tuxedo的安装目录,samples目录下自带了一些例子

[root@localhost atmi]# pwd

/hzh/tuxedo/tuxedo11gR1/samples/atmi

[root@localhost atmi]# ls

bankapp    CSIMPAPP   qsample  simpapp   ws         xmlstockapp

creditapp  libutrace  rpcsimp  STOCKAPP  xmlfmlapp

凡是了解tuxedo 的同学都知道这里面有个著名的例子 simpapp ,它的作用就是把客户端发送的小写字母转换成大写字母返回给客户端。我们就把这个例子运行起来。

前期准备:

[root@localhost atmi]# cp -R simpapp/  /hzh/tuxedo/  为了便于操作,把simpapp 拷贝到/hzh/tuxedo/ 目录下面。

[root@localhost tuxedo11gR1]# ls

bin         help     inventory  lib     samples  udataobj

cobinclude  include  jre        locale  tux.env  uninstaller

[root@localhost tuxedo11gR1]# cp -R tux.env  /hzh/tuxedo/simpapp/        把tuxedo 安装目录下的tux.env  配置文件拷贝到/hzh/tuxedo/simpapp/ 目录下

[root@localhost simpapp]# pwd

/hzh/tuxedo/simpapp

[root@localhost simpapp]# ls

README  simpcl.c  simpserv.c  tux.env  ubbsimple

配置运行 simpapp 例子                                                                           

配置tux.env文件

[root@localhost simpapp]# vi  tux.env  对配置文件进行修改

TUXDIR=/hzh/tuxedo/tuxedo11gR1; export TUXDIR
JAVA_HOME=$TUXDIR/jre; export JAVA_HOME
JVMLIBS=$JAVA_HOME/lib/i386/server:$JAVA_HOME/jre/bin
PATH=$TUXDIR/bin:$JAVA_HOME/bin:$PATH; export PATH
COBCPY=:$TUXDIR/cobinclude; export COBCPY
COBOPT="-C ANS85 -C ALIGN=8 -C NOIBMCOMP -C TRUNC=ANSI -C OSEXT=cbl"; export COBOPT
SHLIB_PATH=$TUXDIR/lib:$JVMLIBS:$SHLIB_PATH; export SHLIB_PATH
LIBPATH=$TUXDIR/lib:$JVMLIBS:$LIBPATH; export LIBPATH
LD_LIBRARY_PATH=$TUXDIR/lib:$JVMLIBS:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH
WEBJAVADIR=$TUXDIR/udataobj/webgui/java; export WEBJAVADIR APPDIR=/hzh/tuxedo/simpapp; export APPDIR
TUXCONFIG=$APPDIR/tuxconfig; export TUXCONFIG
LANG=C; export LANG

配置ubbsimple 文件

[root@localhost simpapp]# hostname  //查看本机hostname

node1

[root@localhost simpapp]# vi  ubbsimple

#       (c) 2003 BEA Systems, Inc. All Rights Reserved.
#ident "@(#) samples/atmi/simpapp/ubbsimple $Revision: 1.7 $" #Skeleton UBBCONFIG file for the TUXEDO Simple Application.
#Replace the <bracketed> items with the appropriate values. *RESOURCES
#IPCKEY <Replace with a valid IPC Key> #Example:
IPCKEY 123456 DOMAINID simpapp
MASTER simple
MAXACCESSERS 10
MAXSERVERS 5
MAXSERVICES 10
MODEL SHM
LDBAL N *MACHINES
DEFAULT:
APPDIR="/hzh/tuxedo/simpapp"
TUXCONFIG="/hzh/tuxedo/simpapp/tuxconfig"
TUXDIR="/hzh/tuxedo/tuxedo11gR1"
#Example:
# APPDIR="/home/me/simpapp"
# TUXCONFIG="/home/me/simpapp/tuxconfig"
# TUXDIR="/usr/tuxedo" node1 LMID=simple //node1为本机hostname名 #Example:
#beatux LMID=simple *GROUPS
GROUP1
.......

注意:APPDIR、TUXCONFIG和TUXDIR三个选项的路径要与 tux.env 文件中的配置保持一致。

修改完成,保存退出

[root@localhost simpapp]# . ./tux.env

[root@localhost simpapp]# tmloadcf -y ubbsimple           //运行此命令不出出任何提示,表示一切正常

[root@node1 simpapp]# buildserver -f simpserv.c -o simpserv -s TOUPPER         //编译服务器端程序

[root@node1 simpapp]# buildclient -f simpcl.c -o simpcl            //编译客户端程序

  这里需要说明的是,buildserver和buildclient命令需要系统安装gcc 才能被执行,gcc -v 查看本机是否安装GCC ,这里就不介绍gcc的安装了。

[root@node1 simpapp]# tmboot -y  启动进程

Booting all admin and server processes in /hzh/tuxedo/simpapp/tuxconfig
INFO: Oracle Tuxedo, Version 11.1.1.2.0, 32-bit, Patch Level (none) Booting admin processes ... exec BBL -A :
process id=2628 ... Started. Booting server processes ... exec simpserv -A :
process id=2629 ... Started.
2 processes started. [root@node1 simpapp]# ps -ef 查看启动进程 root 2628 1 0 12:21 pts/2 00:00:00 BBL -C dom=simpapp -g 30002 -i 0
root 2629 1 0 12:21 pts/2 00:00:00 simpserv -C dom=simpapp -g 1 -i
root 2634 2558 0 12:23 pts/2 00:00:00 ps -ef
// 能找到上面几个进程表面已经启动成功

验证

[root@node1 simpapp]# ./simpcl hello

Returned string is: HELLO

客户端发送一个小写的hello ,服务器端将返回一个大写的HELLO

[root@node1 simpapp]# tmshutdown -y   //停止进程

IPC  &  TCP/IP                                                                                     

  通过上面的配置,我们将tuxedo 一个小例子跑起来了,但是目前客户端与服务器同在一台机子上,同在一个机子上所使用的协议是IPC ,而我试验的环境是在win 7 下的下的虚拟机上运行centOS ,那么如何在win 7 下发送请求到centOS上呢?

  IPC :inter Process Communication (进程间通讯),适用于同一台机子上进程与进程之间的通讯。IPC 包括共享内存,队列,信号量等几种形式。通过IPC的方式通讯效率高。

如果两个进程分别在不同的机子上想实现通讯,就要走TCP/IP协议。

[root@node1 simpapp]# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:48:F5:9C
inet addr:192.168.0.107 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe48:f59c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:932 errors:0 dropped:0 overruns:0 frame:0
TX packets:693 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:79614 (77.7 KiB) TX bytes:89327 (87.2 KiB) lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:5895 errors:0 dropped:0 overruns:0 frame:0
TX packets:5895 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:9015156 (8.5 MiB) TX bytes:9015156 (8.5 MiB)

  结合上面信息再来分析,一台主机上的一个进程要想与另一台主机上的进程实现通讯,先将信息发送到eth0 网卡中,通过网线传输到另一台主机的eth0网卡,再由网卡传给另一个进程。

  lo : local Loopback 表示本地环路,lo是一个特殊的网卡,两个进程之间通讯可以使用IPC协议,如果要使用TCP/IP协议的话就要通过lo这个特殊的网卡进行通讯。

通过上面的分析,我们知道两个进程间通讯有三种方式。

两个进程在同一台主机上:

  一:通过IPC协议,使两个进程直接通讯,效率高。

  二:通过TCP/IP协议,使用lo特殊网卡时行通讯。

两个进程在不同的两个主机上:

  三:通过TCP/IP协议,使用eth0物理网卡进行通讯。

配置第二种方式通讯                                                                                 

  我们现在使用的是第一种通讯方式,下面我们要将上面的修改的文件重新修改配置,来完成第二种方式通讯。

修改tux.env文件

TUXDIR=/hzh/tuxedo/tuxedo11gR1; export TUXDIR
JAVA_HOME=$TUXDIR/jre; export JAVA_HOME
JVMLIBS=$JAVA_HOME/lib/i386/server:$JAVA_HOME/jre/bin
PATH=$TUXDIR/bin:$JAVA_HOME/bin:$PATH; export PATH
COBCPY=:$TUXDIR/cobinclude; export COBCPY
COBOPT="-C ANS85 -C ALIGN=8 -C NOIBMCOMP -C TRUNC=ANSI -C OSEXT=cbl"; export COBOPT
SHLIB_PATH=$TUXDIR/lib:$JVMLIBS:$SHLIB_PATH; export SHLIB_PATH
LIBPATH=$TUXDIR/lib:$JVMLIBS:$LIBPATH; export LIBPATH
LD_LIBRARY_PATH=$TUXDIR/lib:$JVMLIBS:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH
WEBJAVADIR=$TUXDIR/udataobj/webgui/java; export WEBJAVADIR APPDIR=/hzh/tuxedo/simpapp; export APPDIR
TUXCONFIG=$APPDIR/tuxconfig; export TUXCONFIG
LANG=C; export LANG
WSNADDR=//192.168.0.107:3200; export WSNADDR

修改ubbsimple文件

.......................
*MACHINES
DEFAULT:
APPDIR="/hzh/tuxedo/simpapp"
TUXCONFIG="/hzh/tuxedo/simpapp/tuxconfig"
TUXDIR="/hzh/tuxedo/tuxedo11gR1"
#Example:
# APPDIR="/home/me/simpapp"
# TUXCONFIG="/home/me/simpapp/tuxconfig"
# TUXDIR="/usr/tuxedo" node1 LMID=simple
MAXWSCLIENTS=5
#Example:
#beatux LMID=simple *GROUPS
GROUP1
LMID=simple GRPNO=1 OPENINFO=NONE *SERVERS
DEFAULT:
CLOPT="-A" simpserv SRVGRP=GROUP1 SRVID=1
WSL SRVGRP=GROUP1 SRVID=10 //增加一个WSL侦听进程
CLOPT="-A -- -n //192.168.0.107:3200" //IP地址为本机IP,端口号3200可以任意取,与tux.env 文件中的WSNADDR参数保持一致 *SERVICES
TOUPPER

[root@node1 simpapp]# tmloadcf -y ubbsimple       // 编译文件

[root@node1 simpapp]# buildclient -f simpcl.c -o ws -w        //重新编译客户端,ws 为编译的可执行程序,-w 参数表示客户端的编译是按照TCP/IP方式通讯的。

[root@node1 simpapp]# tmboot -y     //启动进程

[root@node1 simpapp]# ./ws hello

Returned string is: HELLO

分析第二种通讯方式                                                                                 

  我们在ubbsimple文件中配置了 WSL 参数

WSL         SRVGRP=GROUP1 SRVID=10
   CLOPT="-A -- -n //192.168.0.107:3200"

参数指向的IP为本机IP,在tux.env 文件中同样需要指定本机IP 。

使用tmboot -y 命令启动进程:

[root@node1 simpapp]# tmboot -y   启动进程
[root@node1 simpapp]# ps -ef 查看进程
root 3402 1 0 18:03 pts/2 00:00:00 BBL -C dom=simpapp -g 30002 -i 0
root 3403 1 0 18:03 pts/2 00:00:00 simpserv -C dom=simpapp -g 1 -i
root 3404 1 0 18:03 pts/2 00:00:00 WSL -C dom=simpapp -g 1 -i 10 -u
root 3412 2580 0 18:07 pts/2 00:00:00 ps -ef

 客户端向tuxedo服务器发请求,由WSL进程处理,并返回另外一个IP及端口。客户端拿到IP及端口去访问真正的WSH进程。那为什么WSH进程为什么没有启动呢? 这是因为WSH进程是在客户端发送请求后自动生成的。

[root@node1 simpapp]# ./ws hello  //向服务器端发送请求

Returned string is: HELLO

[root@node1 simpapp]# ps -ef   查看进程
root 3402 1 0 18:03 pts/2 00:00:00 BBL -C dom=simpapp -g 30002 -i 0
root 3403 1 0 18:03 pts/2 00:00:00 simpserv -C dom=simpapp -g 1 -i
root 3404 1 0 18:03 pts/2 00:00:00 WSL -C dom=simpapp -g 1 -i 10 -u
root 3421 3404 0 18:12 pts/2 00:00:00 WSH -c 11 -i 0 -s 3375121 -p 204
root 3423 2580 0 18:12 pts/2 00:00:00 ps -ef
// 这里已经生成了WSH进程

Tuxedo 通讯方式解析的更多相关文章

  1. 前后端常用通讯方式-- ajax 、websocket

    一.前后端常用通讯方式 1. ajax  浏览器发起请求,服务器返回数据,服务器不能主动返回数据,要实现实时数据交互只能是ajax轮询(让浏览器隔个几秒就发送一次请求,然后更新客户端显示.这种方式实际 ...

  2. v76.01 鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式 | 百篇博客分析OpenHarmony源码

    百篇博客分析|本篇为:(共享内存篇) | 进程间最快通讯方式 进程通讯相关篇为: v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志 v27.05 鸿蒙内核源码分析(互斥锁) | 同样 ...

  3. 【工业串口和网络软件通讯平台(SuperIO)教程】九.重写通讯接口函数,实现特殊通讯方式

    SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    统一的IO接口 开发一套设备驱动同时具备串口和网络通讯能力,通讯接口在逻辑上是统一的,在此基础 ...

  4. Angular1.x组件通讯方式总结

    Angular1开发模式 这里需要将Angular1分为Angular1.5之前和Angular1.5两个不同的阶段来讲,两者虽然同属Angular1,但是在开发模式上还是有较大区别的.在Angula ...

  5. Android网络之数据解析----SAX方式解析XML数据

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  6. 用JAXP的dom方式解析XML文件

    用JAXP的dom方式解析XML文件,实现增删改查操作 dom方式解析XML原理 XML文件 <?xml version="1.0" encoding="UTF-8 ...

  7. Dom方式解析XML

    public class TestXML { public static void main(String[] args) throws SAXException, IOException { //D ...

  8. Linux下的Source命令及脚本的执行方式解析

    Linux Source命令及脚本的执行方式解析 http://blog.csdn.net/wangyangkobe/article/details/6595143 当我修改了/etc/profile ...

  9. android ipc通信机制之之三,进程通讯方式。

    IPC通讯方式的优缺点: IPC通讯方式的对比 名称 优点 缺点 适用场景 Bundle 简单易用 只能传输Bundle支持的数据类型 四大组件的进程通信 文件共享 简单易用 不适合高并发场景,并无法 ...

随机推荐

  1. SignalR集成Autofac

    SignalR SignalR集成需要 Autofac.SignalR NuGet 包. SignalR 集成提供SignalR 集线器的依赖集成.由于 SignalR 是内部构件,所以不支持Sign ...

  2. js 实现div跟随鼠标移动

    今天看到了一个自己可以随心所欲的拖到div到页面的任意位置.感觉挺好的,就心血来潮的查询了一下,看看网友做的 代码如下: <script>function doit(){ var obj ...

  3. 根据GB2312编码表求汉字字节

    java中有8种基本数据类型,byte,short,int,long,float,double,boolean byte用1个字节表示,占8比特,取值范围 负2的7次方至正2的7次方减1 二进制000 ...

  4. HDU 1060 Leftmost Digit(求N^N的第一位数字 log10的巧妙使用)

    Leftmost Digit Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  5. Html 中阻止事件冒泡的三种方法比较

    A:return false --->In event handler ,prevents default behavior and event bubbing .         return ...

  6. o'Reill的SVG精髓(第二版)学习笔记——第四章

    第四章:基本形状 4.1线段 SVG可以使用<line>元素画出一条直线段.使用时只需要指定线段起止点的x和y坐标即可.指定坐标时可以不带单位,此时会使用用户坐标,也可以带上单位,如em. ...

  7. 如何配置Java环境变量

    百度经验 | 百度知道 | 百度首页 | 登录 | 注册 新闻 网页 贴吧 知道 经验 音乐 图片 视频 地图 百科 文库 帮助   发布经验 首页 分类 任务 回享 商城 特色 知道 百度经验 &g ...

  8. [HNOI2003]操作系统(优先队列,堆排序)

    题目描述 写一个程序来模拟操作系统的进程调度.假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自然数表示,数字越大,则优先级越高. 如果一个进程到达的时 ...

  9. struts2入门第一天----------一个简单例

    搭建完环境后就可以动手去打代码了.首先创建一个简单的提交表单的jsp页面(html页面也可以), <%@ page language="java" import=" ...

  10. React学习(1)—— 基础项目搭建以及环境配置

    首先,我们需要安装node.js,直接搜索并在官网下载安装包. node.js官网:https://nodejs.org/en/ 现在我们成功安装了node和npm,然后我们来用npm创建新的项目,首 ...