你是指Socket连接建立前还是建立后?
如果是建立前,那么
1.你要保证客户端IP地址是公网可见地址。
2.如果存在NAT转发等中间层,你要保证客户端正确设置了端口映射能够从外网访问,或者你牛逼自己做NAT穿透。
3.客户端没有其他妨碍连接的东西,比如防火墙屏蔽端口是绝对行不通的。
4.满足以上条件,客户端开启一个ServerSocket来监听请求,服务器端开启一个Socket去连接客户端不就行了?如果是建立后,那直接发送不就行了,所以你应该问的不是这种。。

解决方案 »

  1.   

    所有的客户端都存留一个监听,等待服务端发送这样的消息。由业务上的服务端发起的,此时的服务端当做Socket端,客户端为SocketServer。客户端的SocketServer可以独立线程实现。
      

  2.   

    既然说明了是服务端向客户端发消息,那么服务端就是ServerSocket,客户端就是Socket去建立连接。服务端想发送信息给客户端,那么一定是之前客户端去连过服务端了(new Sokcet),并且连接没有中断。服务端根据accept返回的客户端的Socket对象得到IP地址等你想要的信息,并将Socket对象放到集合,以便向找到某个对应的Socket向客户端发消息
      

  3.   

    现在问题是客户端不可控的,客户端是用c语言写的,由别的开发的,那边只要保证socket一直连接我这边就行了
      

  4.   

    这很像telnet/ssh2 命令行呀。
    自己写code的思路就是上面说的,客户端当作socket接收端。
    我想你可以search下MINA,网络编程很棒的支持。
      

  5.   

    我说的这些只是一个大致的流程,我还要用webservice接收移动终端的请求,再用socket去连接客户端,得到数据处理后再发送给移动终端,而且数据是实时的,不能有明显的延迟
      

  6.   

    那客户端有没有提供侦听服务端传过来的消息的功能呢?
    如果没有这功能,又不让改客户端,这就没辙了,要提需求了吧。有的,因为服务器这边要判断客户端在线,所以客户端要不断向我这发信息,类似心跳,另外客户端还可以主动向服务器主动报警
    大概懂你的意思了:客户端是可以接受服务端信息。现在的难题是想指定ip地址的客户端发消息是吧?
    可以调用Socket的getInetAddress获取当前通信的客户端ip,进行过滤、判断,符合条件的ip再发消息。
      

  7.   

    客户端不可控,然后客户端没有被调用接口?
    那客户端代码能修改吗?能改的话,你把心跳这段改成取数据吧,服务端保存一个Map<List<Command>> 列表。
    如果客户端完全不可控,还没有被调接口,那没有办法了
      

  8.   

    客户端不可控,然后客户端没有被调用接口?
    那客户端代码能修改吗?能改的话,你把心跳这段改成取数据吧,服务端保存一个Map<List<Command>> 列表。
    如果客户端完全不可控,还没有被调接口,那没有办法了这里的客户端不是那个移动终端,这里的客户端其实是一个检测硬件的一个软件,我这里说的客户端是为了好表达那个意思,我这边和这个检测软件只能用socket进行通信,它返回给我一条数据帧,然后我来处理,然后把处理后的数据用推送的方式发给移动终端
      

  9.   

    那客户端有没有提供侦听服务端传过来的消息的功能呢?
    如果没有这功能,又不让改客户端,这就没辙了,要提需求了吧。有的,因为服务器这边要判断客户端在线,所以客户端要不断向我这发信息,类似心跳,另外客户端还可以主动向服务器主动报警
    大概懂你的意思了:客户端是可以接受服务端信息。现在的难题是想指定ip地址的客户端发消息是吧?
    可以调用Socket的getInetAddress获取当前通信的客户端ip,进行过滤、判断,符合条件的ip再发消息。对,就是这个问题,原谅我表达不清楚但是客户端很多的,要是过滤判断等处理,那服务器不得慢死啊。
      

  10.   

    可不可以这样:服务器每收到一个Socket都用Map<IP,Socket>存起来?
      

  11.   

    哈哈哈,和我想法一样,其实我也是这么做的,昨晚想了好久才想到这个办法,现在问题是如果客户端好几百个,那这个map里要存好几百个socket,服务器性能是很大的考验
      

  12.   

    建议保存 BidiMap<IP@PORT,Socket>
    前者最好保存Ip@port 或者客户端的唯一编码~ 
    后者可以是一个socket也可以是一个包含了socket以及兼带上下文等的对象~
    这个看你的需求了~
      

  13.   

    那就多线程处理:服务器本身只根据  信息和Socket创建线程,提交到线程池异步处理