java与C++ 的socket通信(1)

作者:李东龙  

        最近在做一个项目,java做的是门户,后台的具体实现要是用c++实现的。所以javaC++的通信自然不可或缺。

        我们的接口方式实现分为两种,一:webservice 二:基于tcp协议的socket通信。Webservicejava发布接口,用C++来调用。Java调用c++是通过发送tcp协议。

        前天刚刚进行了接口联调。基本搞定了,现在来总结一下:

        首先我们做socket通信用的是Apachemina,先来介绍一个这个mina

 

 1MINA框架简介

         MINA(MultipurposeInfrastructure forNetwork Applications)是用于开发高性能和高可用性的网络应用程序的基础框架。通过使用MINA框架可以可以省下处理底层I/O和线程并发等复杂工作,开发人员能够把更多的精力投入到业务设计和开发当中。MINA框架的应用比较广泛,应用的开源项目有Apache DirectoryAsyncWebApache QpidQuickFIX/JOpenfireSubEthaSTMPred5等。MINA框架当前稳定版本是1.1.6,最新的2.0版本目前已经发布了M1版本。

        MINA框架的特点有:基于java NIO类库开发;采用非阻塞方式的异步传输;事件驱动;支持批量数据传输;支持TCPUDP协议;控制反转的设计模式(支持Spring);采用优雅的松耦合架构;可灵活的加载过滤器机制;单元测试更容易实现;可自定义线程的数量,以提高运行于多处理器上的性能;采用回调的方式完成调用,线程的使用更容易。

 

2MINA框架的常用类

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的如何创建长连接还在研究中……

             







未完待续

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值