小弟现在有一个应用, 是从WEB 通过Socket连接到一个Sockct 服务端(SMS), 通过约定好的格式协议来发请求和接受结果, 然后在WEB上将结果解析并显示出来. Socket服务端对我们WEB这边只允许建立一个Socket连接. 也就是说, 服务端提供的是一条异步长连接. 整个连接过程到WEB显示, 我用短连接每次访问重新建立连接然后断开的方式测试通过了. 当然, 会存在竞争问题... 我也想用长连接的方式, 但我遇到的难点是, 每个WEB用户的请求可以无差别的通过一个独立Proxy程序来发送到SMS端, 但SMS返回的信息(每个请求在协议中都有RequestID的标识编号)我怎么把结果从Proxy程序返回到当初发出这个请求的WEB用户会话线程呢? Proxy程序和SMS端建立和维持一个异步长连接, 它肯定是一个单线程的程序, 可以接收任何多线程的请求, 这个接受是无差别的, 只管往SMS发就是了, 但是返回的时候就应该有选择的返回给请求线程了. 我就是这个问题困绕了我好久, 在网上查了几天也没有找到什么有意义的资料. 希望能在这里得到专业的解答, 谢谢了~~

解决方案 »

  1.   

    楼主我觉得可以考虑udp通讯方式。
      

  2.   

    不应该直接去连一个单通道的TCP
    你应该再加一个后台服务程序,这个后台去连接TCP就是这样
    web-┐
    web---- 后台服务 -- 外部TCP服务器
    web-┙如果是需要处理大量数据的话
    web-┐
    web---- 数据库
    web-┙数据库 -- 后台服务 -- 外部TCP服务器
      

  3.   

    我的问题是,在独立执行的Proxy程序中, 怎样把SMS服务端收到的消息返回给请求的客户端.
    Proxy程序连接了2边的程序, 和SMS这头是单通道异步长连接, 和用户请求端是多通道同步短连接. 在SMS端返回用户的结果给Proxy的时候, Proxy要知道把这个结果通过没有断开的同步短连接发到正确的用户Socket通道中. 我就是不知道如何返回给正确的用户通道.
      

  4.   

    irvine007(┣━┫Rvine):
    这跟用什么通讯方式没关系吧.
      

  5.   

    beiouwolf(beiouwolf) :
    我现在就是你说的第一种方式去做的.
    那个独立的Proxy就是你说的后台程序.
    这个后台程序连两端的socket, 但用户到服务段的多个请求是无差别的发就可以了,返回的时候就要区分返回给哪个用户了. 我就是不知道这一步是如何衔接的.
      

  6.   

    你加个数据库上去
    WEB数据提交给数据库,做一个发送队列表,每条记录保存相应的用户ID号
    然后发送后台从队列表里取数据发送,并将每条记录保存在一个新的发送记录表里,同样存储进用户的ID号
    WEB显示发送记录的时候,根据不用的ID号去显示
      

  7.   

    那样不就麻烦了吗? 而且放在第三方做存储,用户线程还要自己去主动轮循.
    我想Proxy本身自己就能处理.
    我想了个办法,Proxy把每一个连到自己的用户通道和请求RequestID绑定起来,保存到一个数据结构中,Proxy从服务器收到结果消息,就把根据消息的RequestID,找出这个通道Write回去.然后关闭通道.
      

  8.   

    你的问题出在proxy上,由于你的proxy与sms只能单一线程通信,因此,你可以在你的proxy与你的client端也采用堵塞式通信,也就是在前一次client请求未完成之前,一直堵塞来自其他client的请求。要实现这一点,你要去了解队列的的用法。
      

  9.   

    如果你要想实时在每个WEB客户端上看到发送及返回的结果,只能使用synchronized方法堵塞住其他的发送线程。
      

  10.   

    如果按照lemonfamily的说法,每个client请求的时候都阻塞来自其它client的请求,那么当SMS处理单client请求要求的时间比较长的时候,其它client是不可能等那么久的. 我们SMS的服务端现在的实际情况也是这样, 一个简单的查询在它那边可能要等5,6秒才能回来结果, 这对多请求client是很恐怖的.谢谢各位,我已经按照我的想法实现了这个过程.目前我碰到的稍不完美的事情, 就是当我用Java的close方法来关闭连接的时候, Proxy同client两边都保持长时间的连接TimeWait状态而不消失.
    我不知道用Java关闭连接是否都是这样, 或者还是我的方法不对.