小弟现在有一个应用, 是从WEB 通过Socket连接到一个Sockct 服务端(SMS), 通过约定好的格式协议来发请求和接受结果, 然后在WEB上将结果解析并显示出来. Socket服务端对我们WEB这边只允许建立一个Socket连接. 也就是说, 服务端提供的是一条异步长连接. 整个连接过程到WEB显示, 我用短连接每次访问重新建立连接然后断开的方式测试通过了. 当然, 会存在竞争问题... 我也想用长连接的方式, 但我遇到的难点是, 每个WEB用户的请求可以无差别的通过一个独立Proxy程序来发送到SMS端, 但SMS返回的信息(每个请求在协议中都有RequestID的标识编号)我怎么把结果从Proxy程序返回到当初发出这个请求的WEB用户会话线程呢? Proxy程序和SMS端建立和维持一个异步长连接, 它肯定是一个单线程的程序, 可以接收任何多线程的请求, 这个接受是无差别的, 只管往SMS发就是了, 但是返回的时候就应该有选择的返回给请求线程了. 我就是这个问题困绕了我好久, 在网上查了几天也没有找到什么有意义的资料. 希望能在这里得到专业的解答, 谢谢了~~
你应该再加一个后台服务程序,这个后台去连接TCP就是这样
web-┐
web---- 后台服务 -- 外部TCP服务器
web-┙如果是需要处理大量数据的话
web-┐
web---- 数据库
web-┙数据库 -- 后台服务 -- 外部TCP服务器
Proxy程序连接了2边的程序, 和SMS这头是单通道异步长连接, 和用户请求端是多通道同步短连接. 在SMS端返回用户的结果给Proxy的时候, Proxy要知道把这个结果通过没有断开的同步短连接发到正确的用户Socket通道中. 我就是不知道如何返回给正确的用户通道.
这跟用什么通讯方式没关系吧.
我现在就是你说的第一种方式去做的.
那个独立的Proxy就是你说的后台程序.
这个后台程序连两端的socket, 但用户到服务段的多个请求是无差别的发就可以了,返回的时候就要区分返回给哪个用户了. 我就是不知道这一步是如何衔接的.
WEB数据提交给数据库,做一个发送队列表,每条记录保存相应的用户ID号
然后发送后台从队列表里取数据发送,并将每条记录保存在一个新的发送记录表里,同样存储进用户的ID号
WEB显示发送记录的时候,根据不用的ID号去显示
我想Proxy本身自己就能处理.
我想了个办法,Proxy把每一个连到自己的用户通道和请求RequestID绑定起来,保存到一个数据结构中,Proxy从服务器收到结果消息,就把根据消息的RequestID,找出这个通道Write回去.然后关闭通道.
我不知道用Java关闭连接是否都是这样, 或者还是我的方法不对.