现在有这样一个需求:
1)多个客户端程序启动立即连接到服务端,每隔一段时间发送心跳报文。
2)服务端有数据下发时,主动下发给客户端(数据量小)。我的思路:自动连接到服务服务器时, 服务端把客户端的Socket对象保存到一个Set中,服务端需要发送数据时,
根据客户端ID从Set中找到保存的Socket对象,并发送数据。首先不知道这种方式是否可行?
如果不行,能不能说说什么好的思路。在此谢过。 

解决方案 »

  1.   

    一般来说就是这样的方式,一般会保存在一个 Map 当中。key 为客户端的唯一标识,value 为客户端的长连接 Scoket 对象。这样的话,适合相对较少客户端的长连接,毕竟 Map 中要存放上万个 Socket 那肯定是有问题的,呵呵。
      

  2.   

    如果有很多的客户端来连接,比如说有几千个客户端的话,那服务端就得使用负载均衡处理了,也就是服务端部署在很多服务器上,客户端根据算法分摊到不同的服务器上。毕竟操作系统对于 TCP 端口的数量还是有一定限制的。
      

  3.   

    先谢谢上面两位的关系和热心回复。
    我的客户端不会有那么大的数量级,有可能达到1000-2000之间.我想是操作系统可以支持的范围内。
    -----服务端发送数据-------------
    Socket socket = (Socket)socketMap.get(clientId);
    socket.write("hello".getBytes());
    -----客户端接受数据-------------
    客户端该如何监听到服务端发来的数据?
      

  4.   

    服务器要主动发数据给客户端程序,则客户端程序其实是要侦听端口等待服务器发数据的,也就是说客户端程序要开一个线程做一个ServerSocket。
    客户端程序轮询服务器取数据应该比较合理一些。
      

  5.   

    你用QUICK SERVER或者直接使用JMS嘛,那里有必要自己去写些丑陋的代码嘛.