mina项目寻求帮助

李力 发布于 2009/06/10 10:39
阅读 2K+
收藏 3

       最近我在用JAVA做一个socket服务器程序,客户端是用C++编写的。客户端传入的是二进制字符(自己定义的报文)。
我的服务程序用了MINA,但自己对这个东西不是很了解,所以想请教一些问题。我用的是MINA 2.0 -M6版本。
       1. MINA的IoHandlerAdapter是不是在程序中只能有一个类继承。
       2.IoSession在mina中有没有一个池,用来存放所有的IoSession。
       3.MINA中如何取得C++传过来的二进制码,自己实现一个类 implements ProtocolCodecFactory ?  

我的报文字:(我这个报文这样定义有什么问题没有 ?)

                            定长14 bytes

0x81

被叫

主叫

ALH

CHANNEL

WT

REG

M

N

 

1             3               3                 1          2                        1                1              1        1

我要实现的程序大概是:
 
        多客户端向 server端发送各式各样的请求及命令,server端收到请求以后,要去处理不同是事。比如:收到0x81解析内容然后,保存数据到数据库,收到0x82从数据库中取数据返回给客户端。

 

加载中
0
JavaGG
JavaGG

1:对的,一个adapter只可以有一个继承IoHandlerAdapter的类

2:有的,在NioProcessor类中的allSessions方法可以得到

3:你继承IoHandlerAdapter类,并实现messageReceived,当有数据传入这个session时,就会触发这个方法了,如果你不加任何filter时,参数message将是ByteBuffer类,你使用ByteBuffer类的读取方法即可

建议加上一个协议解释的filter

如:

先extends IoFilterAdapter

实现messageReceived方法

public final void messageReceived(NextFilter nextFilter, IoSession session,
   Object message) {
  if (eventTypes.contains(IoEventType.MESSAGE_RECEIVED)) {
   IoBuffer buf = (IoBuffer) message;
   Protocol p=new Protocol();

buf .get();//0x81

buf.get(new Byte[3]);被叫

//解释协议
   nextFilter.messageReceived( session, p));
  } else {
   nextFilter.messageReceived(session, message);
  }
 }

这样,你继承IoHandlerAdapter的类 的messageReceived 的message将是Protocol 这个类

0
李力
李力

eventTypes.contains()怎么会找不到这样的东西呢。这是一个什么包的内容?

0
JavaGG
JavaGG

OO,这个判断你可以不管吧

0
JavaGG
JavaGG

直接删了

0
李力
李力

关于 IoFilterAdapter 是不是可以做成。有多少个报文字,就可以有多少个IoFilterAdapter,去生成对应的自己定义的报文包类。

对于Iobuffer的处理,比如:报文字数据错误,报文字不全等问题,做如何处理?

0
JavaGG
JavaGG

这个还没有试过

应不行

因为他一个adapter对应一个端口的

报文解释一般都是分为协议头和协议体

协议头的报文件结构是一样的

如 

长度 int

协议码 int

接下来就是协议体了 长度一般是协议头定义的那个长度

0
王全
王全

1,默认情况下,allSessions只是工内部使用的iosessions池,外部(application)是用不到的。因为NioProcesser是由内部通Class loader 创建的,外部根本拿不到他的instance.如果非要使用内建的allSessions method,必需自己创建nioAcceptor的时候创建IoProcesser,但是对mina性能的影响绝对是致命的.

2,可以自己搞一个CurrentHashMap,当每个连接建立的时候put,关闭的时候remove,很好控制

3,数据包格式是自定义的格式,可以自己实现 ProtocolEncoder 和ProtocolDecoder接口。

4,对于处理多种结构的数据包可以使用一个ProtocolDecoder解决,就是捕获数据包类型后,在分别解包。可以参考red5 开源flash server,他支持很多数据包结构,只有一个ProtocolDecoder

0
李力
李力

关于allSessions,我现在能想到的也是在建立时候,put IOsession 到MAP 里去。

关于多结构数据包,我感觉有点晕。还在进一步探索。我先去找下 red5 开源flash server看下。看能有什么帮助没有!

0
李力
李力

red5 开源flash server项目太难搞了。都找不北。

0
王全
王全

red5使用了非常多的第三方组件,比如什么jetty,quartz,ehcache,配置也比较复杂。

red5使用的是apache的 ivy管理项目的,项目搭建和maven搭建感觉插不多?

你只需要关心他的协议层,org.red5.server.net.rtmp.codec 中带mina的codec就行了

返回顶部
顶部