网站首页 > java教程 正文
用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系统,非常成功。很短的时间就完成了,运行也特别稳定。
- 上一篇: 消息中间件有哪些?5大主流消息中间件
- 下一篇: 什么是rpc中间件_rpczq
猜你喜欢
- 2025-08-31 Java 中台技术盘点,这些技术你了解还远远不够
- 2025-08-31 Java SpringBoot和SpringMVC有什么区别(中间件系列)
- 2025-08-31 如果让你自己设计一个分布式架构的中间件系统,该怎么做?
- 2025-08-31 「MQ中间件」 RabbitMQ死信队列及内存监控
- 2025-08-31 分布式数据层中间件最全详解(图文全面总结)
- 2025-08-31 我们为什么用gRPC取代了Kafka(Java消息中间件)
- 2025-08-31 什么是rpc中间件_rpczq
- 2025-08-31 消息中间件有哪些?5大主流消息中间件
欢迎 你 发表评论:
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)

本文暂时没有评论,来添加一个吧(●'◡'●)