关于 java socket的消息推送问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于 java socket的消息推送问题相关的知识,希望对你有一定的参考价值。

是这样,后台管理员添加了一条社区消息,需要推送的用户的安卓客户端,然后我在做socket的时候是手机端链接服务端的时候开了一个线程保持了链接,假如现在有很多手机端开了线程,我怎么操作这些线程在后台管理员添加消息的时候去推送消息呢

关于 java socket的消息推送问题,首先:开启服务端,并暴露出端口。然后通过一个while的死循环去不停的接收来自客户端的socket,并且通过一个ArrayList来维护。并且通过子线程去对list中的socket进行操作。
其次:客户端去访问服务器的端口。开启一个子线程去不停的接收来自服务端的消息。
然而关于推送服务的更多内容,可以通过深圳极光公司了解一下。深圳市和讯华谷信息技术有限公司(极光 Aurora Mobile)成立于2011年,是中国领先的开发者服务提供商,专注于为开发者提供稳定高效的消息推送、一键认证以及流量变现等服务,助力开发者的运营、增长与变现。
同时,极光的行业应用已经拓展至市场洞察、金融风控与商业地理服务,助力各行各业优化决策、提升效率。

参考技术A

使用线程池会比较好。方便管理。你也要对链接的线程做一个限制,无限的链接创建线程会耗尽内存的。比如:

class NetworkService implements Runnable 
   private final ServerSocket serverSocket;
   private final ExecutorService pool;
   public NetworkService(int port, int poolSize)
       throws IOException 
     serverSocket = new ServerSocket(port);
     pool = Executors.newFixedThreadPool(poolSize);
   
   public void run()  // run the service
     try 
       for (;;) 
         pool.execute(new Handler(serverSocket.accept()));
       
      catch (IOException ex) 
       pool.shutdown();
     
   
 
 class Handler implements Runnable 
   private final Socket socket;
   Handler(Socket socket)  this.socket = socket; 
   public void run() 
     // read and service request on socket
   
 

 在没有消息的时候,线程要处于wait状态,当有消息的时候,用notify来激活。

追问

大神,就是后台管理员添加了这个社区消息,我怎么操作线程池里面的这些线程去执行推送呢

追答

消息放到一个消息队列中,你可以简单的用ArrayList<String> messageQueue。线程只需要负责去读取信息就可以了。

// 发送线程

synchrnozed (messageQueue) 
    if (messageQueue.size() == 0) 
        messageQueue.wait();
    
    else 
        // send message
    

// 消息线程

synchrnozed (messageQueue)    messageQueue.add(msg);
   messageQueue.notifyAll();

追问

  没懂..

追答

就是说推送消息的线程是一直在运作的,不是一个有消息,你去触发线程推送。而是线程一直在运行,检测是否有新的消息存在。如果有了,线程就把消息发送出去了。如果没有,那就继续等待。直到新消息有了,再被激活。你可以去看下thread的wait和notify机制。

追问

哦哦,谢谢大神

追答

我再举个更加形象点的例子。物流配送的时候,快递员们都驻扎在配送基地,比如有10个配送员。货物从上海出发,运到杭州,中间消耗2小时。这个期间,配送员们没事干,全部在物流中心大牌。等到货物到了,配送员有货了,就出发了。送完之后又回到基地等货物,没有就继续大牌。这样持续下去。

本回答被提问者采纳
参考技术B 你看web socket的时候没发现页面都是要求html5吗,这个适用性当前环境下不强,而且这方面的具体应用其实不多,使用ajax刷新简单方便,兼容性也好,基本上满足一般的需求。

关于使用PHP socket.io 做消息推送服务

1、确保已安装redis拓展,可使用php -v 进行查看。如没有安装拓展请参考linux下安装redis扩展

2、下载文档 https://github.com/Lijianeng10/socket-

3、具体使用方法参考官方文档 https://github.com/walkor/phpsocket.io/tree/master/docs/zh 

4、$sender_io = new SocketIO(2120); 此种声明方式需在SocketIO.php 文件中设置IP地址。

 

 

 表示开启了服务器的 8090 socket监听端口

5、客户端开始连接服务端

 

 

 

以上是关于关于 java socket的消息推送问题的主要内容,如果未能解决你的问题,请参考以下文章

关于使用PHP socket.io 做消息推送服务

利用 socket.io 实现消息实时推送

使用 socket.io 技术实现消息实时推送

消息推送学习一原生Socket的使用

android消息推送,使用MQTT协议,谁有用java写过服务端

WebSocket与消息推送