java socket编程中,如何让服务器主动向指定ip地址的客户端发送信息

灰太狼的太太太爷爷 2014-07-23 12:09:11
如题,socket服务器要连接多个客户端,服务器要向指定的某一个客户端发送指令并得到返回的信息,应该怎么实现???
...全文
10465 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
ivocmn 2016-06-01
  • 打赏
  • 举报
回复
我看着也晕了。 我现在也有类似的需求,不过我的需求是:通Mina Sever 发送数据到 远程设备。 我目前的方案(不知道是不是合理哦):客户端C1 ------->服务器端S------->客户端C2(远程设备)。 C1是通过通过Http 请求触发的。创建C2 连接到S 然后有S实现转发? 大神们 是否合理?
ianafollow 2016-03-29
  • 打赏
  • 举报
回复
我有多个手机作为客户端,向服务端发送数据,当服务端处理完数据,把数据发回到对应的手机上,怎么做?
tianfang 2016-03-29
  • 打赏
  • 举报
回复
首先,要坚决的拒绝单独开服务器到客户端的TCP连接方案:
保证不了连接上;
作为TCP客户端,一个IP最多可以建立65535个连接,作为服务方是不可接受的


可以参考的是XMPP服务器,通讯层都是基于NIO,开源的openfire(基于mina),tigase(基于netty),tigase 2009年测试过ATOM 270(上网本CPU) 2G内存(可用的还要小 集成显卡占用一些),支持了2w同时在线用户(连接);



xmpp使用数据库记录登陆用户和连接信息(客户端IP,客户端端口,连接服务器),你的情况也可以类似处理,只记录客户端特征ID,处理的channel(netty中客户端连接的对象,隐含了连接信息)即可。

上行消息,先进行异步消息分发,如果是心跳直接回;报警去报警处理;ws调用可以使用一个线程池,并发向内部服务进行请求;ws调用的结果+客户端特征ID及channel,(异步)交给下行消息处理模块。

下行处理模块找到channel,将信息写入,就完成了消息下发。
下行处理模块可以有单独接口,处理下行消息,输入参数为客户端特征ID和消息;

tianfang 2016-03-29
  • 打赏
  • 举报
回复
看着好乱 楼主重新描述一下,客户端和服务端的连接和流程,服务端需求 。 是不是客户端和服务端长连接,带心跳包。服务端按某种规则通过现有连接向客户端发消息?
oh_Maxy 2014-07-24
  • 打赏
  • 举报
回复
那就多线程处理:服务器本身只根据 信息和Socket创建线程,提交到线程池异步处理
  • 打赏
  • 举报
回复
引用 16 楼 oh_Maxy 的回复:
几百个很多么?只是存着,也不一定几百个并发处理吧? 先试试吧!
还真是几百个并发处理,因为这要有一个类似心跳来判断客户端是否在线,每一个客户端是在不断向服务器发信息来证明自己在线的。。。
qqzhuping 2014-07-24
  • 打赏
  • 举报
回复
引用 15 楼 hjw506848887 的回复:
引用 14 楼 oh_Maxy 的回复:
可不可以这样:服务器每收到一个Socket都用Map<IP,Socket>存起来?
哈哈哈,和我想法一样,其实我也是这么做的,昨晚想了好久才想到这个办法,现在问题是如果客户端好几百个,那这个map里要存好几百个socket,服务器性能是很大的考验。。。
如果用非阻塞的实现方式,别说几百个,几万个也没事。哪怕真的超过性能瓶颈~4层交换机一架,由硬件搭建的分布式就搞起了~
qqzhuping 2014-07-24
  • 打赏
  • 举报
回复
建议保存 BidiMap<IP@PORT,Socket> 前者最好保存Ip@port 或者客户端的唯一编码~ 后者可以是一个socket也可以是一个包含了socket以及兼带上下文等的对象~ 这个看你的需求了~
oh_Maxy 2014-07-24
  • 打赏
  • 举报
回复
几百个很多么?只是存着,也不一定几百个并发处理吧? 先试试吧!
  • 打赏
  • 举报
回复
引用 14 楼 oh_Maxy 的回复:
可不可以这样:服务器每收到一个Socket都用Map<IP,Socket>存起来?
哈哈哈,和我想法一样,其实我也是这么做的,昨晚想了好久才想到这个办法,现在问题是如果客户端好几百个,那这个map里要存好几百个socket,服务器性能是很大的考验。。。
oh_Maxy 2014-07-24
  • 打赏
  • 举报
回复
可不可以这样:服务器每收到一个Socket都用Map<IP,Socket>存起来?
vnvlyp 2014-07-23
  • 打赏
  • 举报
回复
你是指Socket连接建立前还是建立后? 如果是建立前,那么 1.你要保证客户端IP地址是公网可见地址。 2.如果存在NAT转发等中间层,你要保证客户端正确设置了端口映射能够从外网访问,或者你牛逼自己做NAT穿透。 3.客户端没有其他妨碍连接的东西,比如防火墙屏蔽端口是绝对行不通的。 4.满足以上条件,客户端开启一个ServerSocket来监听请求,服务器端开启一个Socket去连接客户端不就行了? 如果是建立后,那直接发送不就行了,所以你应该问的不是这种。。
zy_think123 2014-07-23
  • 打赏
  • 举报
回复
服务器端开一个多线程隔一段时间就向你想要发的客户端发送数据就行了
oh_Maxy 2014-07-23
  • 打赏
  • 举报
回复
所有的客户端都存留一个监听,等待服务端发送这样的消息。 由业务上的服务端发起的,此时的服务端当做Socket端,客户端为SocketServer。 客户端的SocketServer可以独立线程实现。
  • 打赏
  • 举报
回复
引用 10 楼 oh_Maxy 的回复:
[quote=引用 8 楼 hjw506848887 的回复:] [quote=引用 7 楼 oh_Maxy 的回复:] [quote=引用 5 楼 hjw506848887 的回复:] [quote=引用 2 楼 oh_Maxy 的回复:] 所有的客户端都存留一个监听,等待服务端发送这样的消息。 由业务上的服务端发起的,此时的服务端当做Socket端,客户端为SocketServer。 客户端的SocketServer可以独立线程实现。
现在问题是客户端不可控的,客户端是用c语言写的,由别的开发的,那边只要保证socket一直连接我这边就行了。。。[/quote] 那客户端有没有提供侦听服务端传过来的消息的功能呢? 如果没有这功能,又不让改客户端,这就没辙了,要提需求了吧。[/quote]有的,因为服务器这边要判断客户端在线,所以客户端要不断向我这发信息,类似心跳,另外客户端还可以主动向服务器主动报警。。。[/quote] 大概懂你的意思了:客户端是可以接受服务端信息。现在的难题是想指定ip地址的客户端发消息是吧? 可以调用Socket的getInetAddress获取当前通信的客户端ip,进行过滤、判断,符合条件的ip再发消息。[/quote]对,就是这个问题,原谅我表达不清楚。。。但是客户端很多的,要是过滤判断等处理,那服务器不得慢死啊。。。。
  • 打赏
  • 举报
回复
引用 11 楼 xiaopeipei2004 的回复:
[quote=引用 9 楼 hjw506848887 的回复:] [quote=引用 6 楼 xiaopeipei2004 的回复:] 这很像telnet/ssh2 命令行呀。 自己写code的思路就是上面说的,客户端当作socket接收端。 我想你可以search下MINA,网络编程很棒的支持。
我说的这些只是一个大致的流程,我还要用webservice接收移动终端的请求,再用socket去连接客户端,得到数据处理后再发送给移动终端,而且数据是实时的,不能有明显的延迟。。。[/quote] 客户端不可控,然后客户端没有被调用接口? 那客户端代码能修改吗?能改的话,你把心跳这段改成取数据吧,服务端保存一个Map<List<Command>> 列表。 如果客户端完全不可控,还没有被调接口,那没有办法了[/quote]这里的客户端不是那个移动终端,这里的客户端其实是一个检测硬件的一个软件,我这里说的客户端是为了好表达那个意思,我这边和这个检测软件只能用socket进行通信,它返回给我一条数据帧,然后我来处理,然后把处理后的数据用推送的方式发给移动终端。。。
grapepaul 2014-07-23
  • 打赏
  • 举报
回复
引用 9 楼 hjw506848887 的回复:
[quote=引用 6 楼 xiaopeipei2004 的回复:] 这很像telnet/ssh2 命令行呀。 自己写code的思路就是上面说的,客户端当作socket接收端。 我想你可以search下MINA,网络编程很棒的支持。
我说的这些只是一个大致的流程,我还要用webservice接收移动终端的请求,再用socket去连接客户端,得到数据处理后再发送给移动终端,而且数据是实时的,不能有明显的延迟。。。[/quote] 客户端不可控,然后客户端没有被调用接口? 那客户端代码能修改吗?能改的话,你把心跳这段改成取数据吧,服务端保存一个Map<List<Command>> 列表。 如果客户端完全不可控,还没有被调接口,那没有办法了
oh_Maxy 2014-07-23
  • 打赏
  • 举报
回复
引用 8 楼 hjw506848887 的回复:
[quote=引用 7 楼 oh_Maxy 的回复:] [quote=引用 5 楼 hjw506848887 的回复:] [quote=引用 2 楼 oh_Maxy 的回复:] 所有的客户端都存留一个监听,等待服务端发送这样的消息。 由业务上的服务端发起的,此时的服务端当做Socket端,客户端为SocketServer。 客户端的SocketServer可以独立线程实现。
现在问题是客户端不可控的,客户端是用c语言写的,由别的开发的,那边只要保证socket一直连接我这边就行了。。。[/quote] 那客户端有没有提供侦听服务端传过来的消息的功能呢? 如果没有这功能,又不让改客户端,这就没辙了,要提需求了吧。[/quote]有的,因为服务器这边要判断客户端在线,所以客户端要不断向我这发信息,类似心跳,另外客户端还可以主动向服务器主动报警。。。[/quote] 大概懂你的意思了:客户端是可以接受服务端信息。现在的难题是想指定ip地址的客户端发消息是吧? 可以调用Socket的getInetAddress获取当前通信的客户端ip,进行过滤、判断,符合条件的ip再发消息。
  • 打赏
  • 举报
回复
引用 6 楼 xiaopeipei2004 的回复:
这很像telnet/ssh2 命令行呀。 自己写code的思路就是上面说的,客户端当作socket接收端。 我想你可以search下MINA,网络编程很棒的支持。
我说的这些只是一个大致的流程,我还要用webservice接收移动终端的请求,再用socket去连接客户端,得到数据处理后再发送给移动终端,而且数据是实时的,不能有明显的延迟。。。
  • 打赏
  • 举报
回复
引用 7 楼 oh_Maxy 的回复:
[quote=引用 5 楼 hjw506848887 的回复:] [quote=引用 2 楼 oh_Maxy 的回复:] 所有的客户端都存留一个监听,等待服务端发送这样的消息。 由业务上的服务端发起的,此时的服务端当做Socket端,客户端为SocketServer。 客户端的SocketServer可以独立线程实现。
现在问题是客户端不可控的,客户端是用c语言写的,由别的开发的,那边只要保证socket一直连接我这边就行了。。。[/quote] 那客户端有没有提供侦听服务端传过来的消息的功能呢? 如果没有这功能,又不让改客户端,这就没辙了,要提需求了吧。[/quote]有的,因为服务器这边要判断客户端在线,所以客户端要不断向我这发信息,类似心跳,另外客户端还可以主动向服务器主动报警。。。
加载更多回复(4)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧