请教一个问题,希望大家帮助解答,谢谢了.问题描述:
        使用java.nio.*包socket通信,现在需求是这样的: 客户端发送N次请求(q1,q2,q3...qn),服务器很忙或遇到网络等问题,服务器现在只响应了N-m(总是小于请求次数)次请求,那么怎么将N- m次请求响应的数据与N次请求对应起来? 对应的响应到对应的请求处理方法中处理? 还有一种情况,服务器不按请求顺序处理,客户端怎么处理服务器的响应?理想模型:
q1        ------------        a1
q2        ------------        a2
q3        ------------        a3
................................
选择响应:
q1        ------------        a1
q2        ------------        不响应
q3        ------------        a2
................................
网络等问题:
选择响应:
q1        ------------        a1未到达
q2        ------------        a2到达,
q3        ------------        a3到达,a1到达
................................怎么将每次的请求与响应对应起来?
(在请求与响应中都加入识别码是个解决方法,若不这样处理会不会有问题? 我socket通信不是很清楚.)

解决方案 »

  1.   

    这本来就是协议选择的问题,和用什么语言没有关系。
    你要可靠就用TCP,要性能就用UDP。
    总之Selector只是通知你端口什么时候可用,至于你操作的是TCP还是UDP看你自己的需要
      

  2.   

    你说的是一个客多次与服务端交互的问题?这就要看你是否可以接受丢包。如果要求必须完整传输,那么在服务端注册write事件,在write事件处理中如果一次写不出去,刚重开一个临时Selector并等待阻塞方式发送。这个重开的Selector以阻塞方式不影响主线程中的非阻塞的Selector,确保发送完成后再把这个临时的Selector返回。如果你可以承受丢包,那正如你说的把每次发送加上序号。至于如果处理要看你发送的内容和具体逻辑。另外就是丢包率。比如发送100次中有多少次是失败的,如果100次有响应50次失败,那么要开大量的临时阻塞性selector显然是不行的。那还不如直接用普通的TCP,如果只是百分之几,是可以的。
    另外选择一个好的框架,加上好的设计,nio本身不应该很忙,除非是网络问题。