用Java写中间件,你还没有开始,就会面临一大堆的专业术语,看得你云里雾里,没有几年的功夫,你能入门?可用Delphi你只知道原理就行了。
在中间件的窗口放IdTCPServer1控件,在窗口的Onshow事件里添加四行代码,就可以启动服务。
IdTCPServer1.Bindings.Clear;
IdTCPServer1.Bindings.Add.IP := '0.0.0.0';//绑定IP
IdTCPServer1.Bindings.Add.Port := strtoint(net_port);//绑定端口
IdTCPServer1.Active :=True; //开启服务器
在其OnExecute的事件里接受客户端的请求,
str:=AContext.Connection.IOHandler.ReadLn(IndyTextEncoding(TEncoding.UTF8))
就可以得到客户端发送过来的信息。
客户端用idTcpclient,以下代码是发送信息:
TCPClient_tem.Host:=connect_ip; 服务端IP
TCPClient_tem.Port:=strtoint(connect_port); 服务端端口
TCPClient_tem.Connect; 连接
TCPClient_tem.IOHandler.WriteLn(infor,IndyTextEncoding(TEncoding.UTF8));发送信息。
这是用字符唱的方式通讯,有个限制,参数长度只有255,如果发送发送长度超过255,可以采用流的方式发送:
先用WriteLn发送流的长度信息,然后再用
TCPClient_tem.IOHandler.Write(infor,strtoint(infor.length));发送流信息,里面有两个参数,前面是要发的信息,后面是长度。在中间件里,还是在OnExecute的事件里用下面的代码接受流信息:
len:=strtoint(AContext.Connection.IOHandler.ReadLn(IndyTextEncoding(TEncoding.UTF8)));
req_mm:=TMemoryStream.Create;
AContext.Connection.IOHandler.ReadStream(req_mm,len);
Len 是流的长度。
上面讲的是通讯代码。下面讲主要实现原理。
以数据库为基础的管理软件,客户端主要有两种需求,一种是在数据库的查询,第二种是一些事务的执行。对于查询,我们要上传的是SQL请求和参数,是字符串,可以把SQL语句放在中间件里,查询条件参数由客户端上传,返回的是一个数据集,这个数据集先把其DATA赋值给一个TFDMemTable对象,然后调用TFDMemTable对象流方式回传给客户端,客户端再用流转变为一个TFDMemTable对象,所以,在中间件只需要写一个查询服务就行了,完全不需要对每次查询都分别写服务。因为所有的查询只是SQL语句不同,条件参数不同,动作都是一样的。
对于第二种需求,上传和回传的都是字符串,就更简单了。但因为每次上传和执行的事务都不相同,所以,每个服务都要单独写。服务参数上传可以上传服务名称和其它参数,在中间件里根据参数调用不同的服务模块完成工作。
客户端多个参数怎么办,可以定义一个不常用的字符串比如说“%@*^%@%”这样的,作为参数间隔,将多个参数在客户端作为一个字符串发送,在中间件再检索出来就行了。完全不需要象像通常的Java中间件,要建立实体,串行化反串行化之类的操作,还要代码生成器,ORM技术等。
这样写的中间件有如下好处:
1、查询中间件只写一次,代码简单,工作量小得多,特别是将相关的函数封装后,连接中间件只需要调用函数就行,简化了工作,上手容易。
2、中间件采用数据库直接加连接池,程序效率杠杠的,起码超过Java一倍以上。因为Delphi是二进制代码运行,而Java 是中间代码虚拟机运行。加上IdTCPServer采用是纤程技术,并发数也很高,据说5000以上。
注意,中间件连接数据库一定要采用连接池,因为IdTCPServer响应客户端采用的是纤程技术,本质上是线程,而数据库连接必须每个线程都要有自己的专用的连接,所以,不能共用一个数据库连接,这是中间件和一些两层数据库程序最根本的区别。IdTCPServer每次响应都去连接池获取一个自己专用连接,用完释放。第二点,特别重要,就是数据库的返回记录数不要设为定值,要动态从客户端上传,因为大多数情况下,查询的记录是很少的,查询统计时才需要很多记录,如果设为很大的数,数据库反应特别慢。以前的BDE不会这样。我在这个问题上是吃过大亏,费了很大的劲才明白。
本人用此方法改造了一个多年前写的两层的Delphi基于BDE的MIS系统,非常成功。很短的时间就完成了,运行也特别稳定。