开发者社区> 问答> 正文

mina项目寻求帮助? 400 报错

mina项目寻求帮助? 400 报错

       最近我在用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从数据库中取数据返回给客户端。

 

展开
收起
爱吃鱼的程序员 2020-05-30 22:01:31 474 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    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 这个类

    ######

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

    ######

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

    ######

    直接删了

    ######

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

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

    ######

    这个还没有试过

    应不行

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

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

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

    如 

    长度 int

    协议码 int

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

    ######

    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

    ######

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

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

    ######

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

    ######

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

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

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

    2020-05-30 22:01:31
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
如何创建一个成功的(在业务和开发中)开源项目 立即下载
如何利用Redisson分布式化传统Web项目 立即下载
为什么 Apache RocektMQ 是业务消息的首选 立即下载