如题,socket服务器要连接多个客户端,服务器要向指定的某一个客户端发送指令并得到返回的信息,应该怎么实现?
解决方案
50
你是指Socket连接建立前还是建立后?
假如是建立前,那么
1.你要保证客户端IP地址是公网可见地址。
2.假如存在NAT转发等中间层,你要保证客户端正确设置了端口映射能够从外网访问,或你厉害本人做NAT穿透。
3.客户端没有其他妨碍连接的东西,例如防火墙屏蔽端口是绝对行不通的。
4.满足以上条件,客户端开启一个ServerSocket来监听请求,服务器端开启一个Socket去连接客户端不就行了?
假如是建立后,那直接发送不就行了,所以你应该问的不是这种。
假如是建立前,那么
1.你要保证客户端IP地址是公网可见地址。
2.假如存在NAT转发等中间层,你要保证客户端正确设置了端口映射能够从外网访问,或你厉害本人做NAT穿透。
3.客户端没有其他妨碍连接的东西,例如防火墙屏蔽端口是绝对行不通的。
4.满足以上条件,客户端开启一个ServerSocket来监听请求,服务器端开启一个Socket去连接客户端不就行了?
假如是建立后,那直接发送不就行了,所以你应该问的不是这种。
50
全部的客户端都存留一个监听,等待服务端发送这样的消息。
由业务上的服务端发起的,此时的服务端当做Socket端,客户端为SocketServer。
客户端的SocketServer可以独立线程实现。
由业务上的服务端发起的,此时的服务端当做Socket端,客户端为SocketServer。
客户端的SocketServer可以独立线程实现。
50
既然说明了是服务端向客户端发消息,那么服务端就是ServerSocket,客户端就是Socket去建立连接。服务端想发送信息给客户端,那么一定是之前客户端去连过服务端了(new Sokcet),并且连接没有中断。服务端根据accept返回的客户端的Socket对象得到IP地址等你想要的信息,并将Socket对象放到集合,以便向找到某个对应的Socket向客户端发消息
50
首先,要坚决的拒绝单独开服务器到客户端的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和消息;
保证不了连接上;
作为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和消息;