有一对已经建立好的基于套接字的输入输出流,我想在它们的基础上实现两路复用,每一路有自己的双向交互协议,所以两路之间不能互相干扰,最简单的办法是建立两对套接字连接,分别得到一对输入输出流,来实现两路互相不干扰的协议,但这种方法显得很愚蠢,浪费资源,选择器模型让代码变得支离破碎,如果不用选择器模型,只想建立两路复用通道,然后用两个线程分别处理,该如何实现?高分求教。

解决方案 »

  1.   

    多路复用我只用过nio的选择器。不过看楼主好像并不想选择。
    交互协议都不同的话,我觉得你的方法就可以,而且容错和故障恢复都易于进行。起两个线程,监控两个端口。
    或者起三个线程,监控同一个端口,其中一个线程做协议解析和请求转发。
      

  2.   

    这个是可以通过协议进行区分的吧基于通信套字节,传送你自己封装的message[head,body]你的head可以
    消息长度、
    协议类型、
    请求|返回状态、
    成功|失败状态、
    请求|返回时间、
    body加密方式、
    请求id(用于控制请求流量)、
    请求操作id(用于区分操作)body
    请求入参、
    返回信息
    你每次套字节针对 message 进行 writer 和 reader
    即 
    meesage-> byte[]    output.write(byte[])
    read.read(byte[])      byte[]->messagemessage 处理(区分协议类型)  ->  得到返回 message
    服务端和客户端你没必要自己写,使用现有的框架就好了。 mina、xsocket 
      

  3.   

    请问通过协议区分,如果不使用mina、xsocket,标准版Java支持吗?
      

  4.   

    只用jdk的库的话,也可以。
    第一,在不同的协议的头前面,得加一个协议ID进行区分。
    第二,为每一个协议生成单独的PipedInputStream、PipedOutputStream。然后读Socket的输入流,根据协议ID,写进不用的PipedOutputStream。然后每个协议就可以用自身的PipedInputStream读了。
    大致思路这样,具体得看自身的项目,然后进行优化。
    (我觉得最大的难度,应该在于防止PipedInputStream里面的数据过多,而同时得不到及时的处理)
      

  5.   

    纯用 jdk 写问题多多,需要解决的问题需要测试的问题太多了。感觉就协议上的message的封装  楼主考虑下自己做就好了。纯粹的使用 jdk block形式的 socket 楼主在client 端就必须考虑并发问题,服务端的问题就更多了。
    如果使用 jdk jnio ,说实话楼主你有信心写的很好吗? 为什么有开源的框架不使用了?