做一个前置机之类的转发通信工具。
要求略为:接受来自多个终端的数据包。转发给后台服务器。
接收后台服务器的返回,再返回给各个终端。
请问,多个终端同时上传,我的前置接收程序侦听端口接收后要如何处理?是不是形成一个队列一个个收?然后再创建一个socket连接去转发吗?
再开启一个侦听来接收服务器的返回,收到后再创建socket连接发给不同终端吧。这是我自己的描述,有错误请指正。
对于通信理解不多。
高手能说说同步异步的概念吗?还有有队列的概念吗?什么阻塞挂起在我这个实例中是如何要运用呢?还有一个处理速度问题。会不会有影响要注意一些什么?以上这些概念和具体会用到JAVA里的哪些类,大家能说到都可以说说。我觉得有价值的都有分。希望不要泛泛而谈,能清晰一点最好啦

解决方案 »

  1.   

    碰上我 算你运气(不好意思,多嘴)
    我们也在做这样一个系统,我负责的是这块,  现在在进入了联调阶段
    同异步的概念网上一大把,队列的话, 可以用IBM的MQ它提供了这方面的支持
    我们的每个报文都有一个标识,然后为每个报文配置一个路由(也就是IP,端口)
    可能这这个地方,要做一下报文或协议的转换。建议你看下NIO
    靠 说漏嘴拉,公司不会把我开除吧??
    刚毕业 没经验,瞎砍的
    哥们现在没分拉
    赏几个 谢谢
    (补充点:同异步应该不由自己决定吧)
      

  2.   

    前置机作为server端
    终端连接前置机,发送数据包,前置机接受到数据
    同步:
       服务器作为server端,前置机收到终端数据后,马上转发服务器。数据量小无所谓
    异步:
       服务器作为client端,启动的时候就连接到前置机,前置机收到终端数据后,将数据放入队列,或者缓存文件中。另外一个线程,侦听服务器的连接,发现有连接后,取队列或者缓存数据 给服务器发送
      

  3.   

    做一个前置机之类的转发通信工具。 
    要求略为:接受来自多个(500-1000)终端的数据包(频度为每秒1次)。转发给后台服务器。 
    接收后台服务器的返回(响应时间约为1秒),再返回给各个终端。 请问,多个终端同时上传,我的前置接收程序侦听端口接收后要如何处理?是不是形成一个队列一个个收?然后再创建一个socket连接去转发吗? 
    再开启一个侦听来接收服务器的返回,收到后再创建socket连接发给不同终端吧。这是我自己的描述,有错误请指正。 对于通信理解不多。 
    高手能说说同步异步的概念吗?还有有队列的概念吗?什么阻塞挂起在我这个实例中是如何要运用呢?还有一个处理速度问题。会不会有影响要注意一些什么? 以上这些概念和具体会用到JAVA里的哪些类,大家能说到都可以说说。我觉得有价值的都有分。希望不要泛泛而谈,能清晰一点最好啦
    ========================
    建议方案
    1、前置机与服务器长连接。终端与前置机短连接。
    2、前置机上的消息(数据包)处理器,数据结构采用消息队列,算法采用生产与消费线程模式。
    3、每个消息应有独一无二的编号(比如采用终端编号+日期+流水号),前置机上应记录编号与终端的对应关系。
    4、前置机收到服务器返回包后,可以用2种方式返回给终端(1)主动连接终端(2)被动等终端下次连接,收数据包之后再发结果包
    这是一种典型的异步方式。之所以用异步方式,是因为服务器的响应时间太慢了,如果用同步的方式,就等同于长连接了。
      

  4.   

    谢谢,hbwhwang 。你的回答很和我胃口啦。我就是要方案的建议。然后自己研究。4中返回给终端的两种方式。(1)主动连接终端,终端是不是要起监听来收前置机的主动连接啦。
    (2)被动等终端下次连接:这个我不是很明白,终端的第一个交易请求发出后,前置机收到服务器返回,然后要等终端机第二个交易请求,才把第一次的交易返回给终端吗?那不是不对了吗
      

  5.   

    4中返回给终端的两种方式。(1)主动连接终端,终端是不是要起监听来收前置机的主动连接啦。 
    答:是的。终端启动监听等待前置机来连。(2)被动等终端下次连接:这个我不是很明白,终端的第一个交易请求发出后,前置机收到服务器返回,然后要等终端机第二个交易请求,才把第一次的交易返回给终端吗?那不是不对了吗
    答:把终端发给前置机的请求分为2种,1是数据发送请求,2是结果请求。我前面也说了,“每个消息应有独一无二的编号,前置机上应记录编号与终端的对应关系”。那么当终端提出结果请求的时候,前置机就到结果队列中找到属于该终端的消息处理结果(可能有多个),然后发送给终端。
    可以这样定义请求包格式(也是参考意见):
    a.消息发送请求
    1YYYYYYYXXXXMMMM....MMMMMM
    1表示发送消息,YYYYYYY表示独一无二的消息编号,XXXX表示消息长度,MM....MMM就是消息报文
    b.发送结果查询请求
    2+结束符号(结束符号自己定)
    结果响应包格式:
    NNNNIIIIYYYYYYYXXXXMM...MMM[IIIIYYYYYYYXXXXMM...MMM]
    NNNN表示查询中的个数,IIII表示序号,YYYYYYY表示独一无二的消息编号,XXXX表示结果的长度,MM....MMM就是结果消息报文
    如果一次查出来有多个,那么第1个的IIII就应该是1,而第2个的就是2,依此类推。
    如果返回结果固定,比如就是0表示成功,-1表示失败,那么XXXX就没有必要。
      

  6.   

    “4中返回给终端的两种方式。(1)主动连接终端,终端是不是要起监听来收前置机的主动连接啦。 
    答:是的。终端启动监听等待前置机来连。”终端链到前置后不是一个socket吗?
    然后前置转给后台处理、有向终端的相应则向这个socket发出相应然后再关闭socket,采用nio方式这样可以吗?这算是短连接吧?
    不是很懂,请教一下!