作者:李东龙
最近在做一个项目,java做的是门户,后台的具体实现要是用c++实现的。所以java和C++的通信自然不可或缺。
我们的接口方式实现分为两种,一:webservice 二:基于tcp协议的socket通信。Webservice是java发布接口,用C++来调用。Java调用c++是通过发送tcp协议。
前天刚刚进行了接口联调。基本搞定了,现在来总结一下:
首先我们做socket通信用的是Apache的mina,先来介绍一个这个mina。
1.MINA框架简介
MINA(MultipurposeInfrastructure forNetwork Applications)是用于开发高性能和高可用性的网络应用程序的基础框架。通过使用MINA框架可以可以省下处理底层I/O和线程并发等复杂工作,开发人员能够把更多的精力投入到业务设计和开发当中。MINA框架的应用比较广泛,应用的开源项目有Apache Directory、AsyncWeb、Apache Qpid、QuickFIX/J、Openfire、SubEthaSTMP、red5等。MINA框架当前稳定版本是1.1.6,最新的2.0版本目前已经发布了M1版本。
MINA框架的特点有:基于java NIO类库开发;采用非阻塞方式的异步传输;事件驱动;支持批量数据传输;支持TCP、UDP协议;控制反转的设计模式(支持Spring);采用优雅的松耦合架构;可灵活的加载过滤器机制;单元测试更容易实现;可自定义线程的数量,以提高运行于多处理器上的性能;采用回调的方式完成调用,线程的使用更容易。
2.MINA框架的常用类
类NioSocketAcceptor用于创建服务端监听;
类NioSocketConnector用于创建客户端连接;
类IoSession用来保存会话属性和发送消息;
类IoHandlerAdapter用于定义业务逻辑,常用的方法有:
方法定义
sessionCreated()当会话创建时被触发
sessionOpened()当会话开始时被触发
sessionClosed()当会话关闭时被触发
sessionIdle()当会话空闲时被触发
exceptionCaught()当接口中其他方法抛出异常未被捕获时触发此方法
messageRecieved()当接收到消息后被触发
messageSent()当发送消息后被触发
3. socket通信的常见问题
通过调试和开发过程中,大概遇到了两种问题
【1】数据类型问题
由于C++和java本身的数据类型有些差异,所以在传递时会存在问题。 从java端发出的数据类型到C++解释时出现不能识别的问题。
在网络编程中,大家都要在发送时将类型转换成网络类型(一种中间的数据类型),这样就可以解决数据类型的问题。随后我会给出一些转成网络的方法。由于最近接口还有写问题需要解决。
在转成网络类型之后,java发送默认发送的是Ascii码,这样对C++解析器报文来还需要进行转换,并且接口长度不容易控制。所以在转成网络类型之后最好再转成流的形式发送,这样C++接起来更容易一些。
【2】长连接问题
由于该系统的设计原因,我们与C++通信需要建立长连接,什么是长连接呢?
一般连接发送消息都是先建立连接(我们之前接触过的握手协议),然后发送消息。发送结束之后就可以关闭连接了!长连接就是要,一直保持该连接的一直畅通,随时可以发送消息。询问了一下C++的开发人员,他们一般都是用心跳包保持连接的,意思就是每隔一段时间发送一个消息,确定一下连接是否还存在。如果不存在再建立一个。
现在java的如何创建长连接还在研究中……
未完待续