精华内容
参与话题
问答
  • 主要介绍了php实现微信公众号主动推送消息的方法,PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制,需要的朋友可以参考下
  • 主要介绍了微信开发过程中的使用java实现微信主动推送消息示例,需要的朋友可以参考下
  • C#开发微信企业号主动推送消息的功能,支持发送文本消息/图片/语音/视频/图文消息等.
  • HTTP/2 协议-服务端主动推送消息 这篇文章介绍一下 HTTP/2 的服务端消息推送功能,它可以很大程度的提升客户的体验,它与之前介绍的 Websocket 消息推送有很大的不同,讨论一下 HTTP/2 协议中的 PUSH_PROMISE 服务端...

    HTTP/2 协议-服务端主动推送消息

    这篇文章介绍一下 HTTP/2 的服务端消息推送功能,它可以很大程度的提升客户的体验,它与之前介绍的 Websocket 消息推送有很大的不同,讨论一下 HTTP/2 协议中的 PUSH_PROMISE 服务端推送帧实现原理。

    1.服务器推送的意义

    • 提前将资源推送到浏览器
    • 推送可以基于已发送的请求,例如客户端请求 html,服务端可以主动推送 jscss 文件

    2.服务端推送的基本实现原理

    • 推送资源必须对应一个请求
    • 请求由服务端 PUSH_PROMISE 帧发送
    • 响应在 Stream IDStream 中发送,并且服务产生的 Stream ID 是偶数

    3. HTTP/1.1 中获取资源示意图

    在这里插入图片描述

    Tips:实际页面会有很多 jscss 等文件请求。

    4.HTTP/2 中获取资源示意图

    HTTP/1HTTP/2 获取资源的区别,前者是效率低下的串行请求/响应,后者是基于流的高效并行推送,HTTP/2获取资源示意图如下:
    在这里插入图片描述

    在这里插入图片描述

    Tips:在 Stream 1 中服务端基于 PUSH_PROMISE 帧告诉客户端 singwa.csssingwa.js 资源即将推送,并且 Stream 1Stream 2Stream 3 可以并行推送(备注:不同 Stream 间可以并行发送,同一个 Stream 内的数据是有序的串行)。

    5.PUSH_PROMISE 帧格式

    PUSH_PROMISE 帧中的 type=0x5,只能由服务器发送,格式如下:
    在这里插入图片描述

    6.抓包分析

    在这里插入图片描述

    Tips:如图所示,服务端推送资源之前会基于 PUSH_PROMISE 帧告诉客户端即将推送 /app/poster.jpg,这里需要搭一个基于 HTTP/2 的推送服务。

    扫码关注
    在这里插入图片描述

    展开全文
  • SpringBoot整合WebSocket实现后端向前端主动推送消息

    一、引入websocket依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>

    二、WebSocket配置

    @Configuration
    public class WebSocketConfig {
        @Bean
        public ServerEndpointExporter serverEndpointExporter() {
            return new ServerEndpointExporter();
        }
    }

    三、 WebSocket服务(前端连接地址ws://ip:端口/websocket,请自行替换ip、端口和接口名称)

    @ServerEndpoint(value = "/websocket")
    @Component
    public class WebSocketServer {
        private final static Logger log = LoggerFactory.getLogger(WebSocketServer.class);
    
        //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
        private static int onlineCount = 0;
        //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
        private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();
    
        //与某个客户端的连接会话,需要通过它来给客户端发送数据
        private Session session;
    
        /**
         * 连接建立成功调用的方法
         */
        @OnOpen
        public void onOpen(Session session) {
            this.session = session;
            //加入set中
            webSocketSet.add(this);
            //在线数加1
            addOnlineCount();
            log.info("有新连接加入!当前在线人数为" + getOnlineCount());
            try {
                sendMessage("连接成功");
            } catch (IOException e) {
                log.error("websocket IO异常");
            }
        }
    
        /**
         * 连接关闭调用的方法
         */
        @OnClose
        public void onClose() {
            //从set中删除
            webSocketSet.remove(this);
            //在线数减1
            subOnlineCount();
            log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
        }
    
        /**
         * 收到客户端消息后调用的方法
         *
         * @param message 客户端发送过来的消息
         */
        @OnMessage
        public void onMessage(String message, Session session) {
            log.info("来自客户端的消息:" + message);
    
            //群发消息
            for (WebSocketServer item : webSocketSet) {
                try {
                    item.sendMessage(message);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * @param session
         * @param error
         */
        @OnError
        public void onError(Session session, Throwable error) {
            log.error("发生错误");
            error.printStackTrace();
        }
    
        public void sendMessage(String message) throws IOException {
            this.session.getBasicRemote().sendText(message);
        }
    
        /**
         * 群发自定义消息
         */
        public static void sendInfo(String message) throws IOException {
            log.info(message);
            for (WebSocketServer item : webSocketSet) {
                try {
                    item.sendMessage(message);
                } catch (IOException e) {
                    continue;
                }
            }
        }
    
        public static synchronized int getOnlineCount() {
            return onlineCount;
        }
    
        public static synchronized void addOnlineCount() {
            WebSocketServer.onlineCount++;
        }
    
        public static synchronized void subOnlineCount() {
            WebSocketServer.onlineCount--;
        }
    }

    四、消息推送

    后端调用WebServer的sendInfo接口(例如:WebSocketServer.sendInfo("Hello World");)实现主动向前端推送消息

    展开全文
  • springboot websocket后台主动推送消息

    千次阅读 2018-06-11 17:17:57
    springboot,websocket,后台主动推送消息1.2.pom&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="...

    springboot,websocket,后台主动推送消息

    1.pom

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    
    	<groupId>com.liuxl.cartmall</groupId>
    	<artifactId>spring-websocket</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<packaging>jar</packaging>
    
    	<name>spring-websocket</name>
    	<description>Demo project for Spring Boot
    	https://spring.io/guides/gs/messaging-stomp-websocket/</description>
    
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.0.2.RELEASE</version>
    		<relativePath/> <!-- lookup parent from repository -->
    	</parent>
    
    	<properties>
    		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    		<java.version>1.8</java.version>
    	</properties>
    
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-websocket</artifactId>
    		</dependency>
    
      <dependency>
                <groupId>org.webjars</groupId>
                <artifactId>webjars-locator-core</artifactId>
            </dependency>
            <dependency>
                <groupId>org.webjars</groupId>
                <artifactId>sockjs-client</artifactId>
                <version>1.0.2</version>
            </dependency>
            <dependency>
                <groupId>org.webjars</groupId>
                <artifactId>stomp-websocket</artifactId>
                <version>2.3.3</version>
            </dependency>
            <dependency>
                <groupId>org.webjars</groupId>
                <artifactId>bootstrap</artifactId>
                <version>3.3.7</version>
            </dependency>
            <dependency>
                <groupId>org.webjars</groupId>
                <artifactId>jquery</artifactId>
                <version>3.1.0</version>
            </dependency>
    
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    			<scope>test</scope>
    		</dependency>
    	</dependencies>
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    			</plugin>
    		</plugins>
    	</build>
    
    
    </project>
    

    2.SpringWebsocketApplication  springboot 启动类

    package com.liuxl.cartmall;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class SpringWebsocketApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(SpringWebsocketApplication.class, args);
    	}
    }
    

    3.WebSocketConfig

    package com.liuxl.cartmall.websocket;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.messaging.simp.config.MessageBrokerRegistry;
    import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
    import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
    import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
    
    //@EnableWebSocketMessageBroker注解表示开启使用STOMP协议来传输基于代理的消息,Broker就是代理的意思。 
    @Configuration
    @EnableWebSocketMessageBroker
    public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    	@Override
    	public void configureMessageBroker(MessageBrokerRegistry registry) {
    		// 订阅Broker名称
    		registry.enableSimpleBroker("/topic");
    		// 全局使用的消息前缀(客户端订阅路径上会体现出来)
    		registry.setApplicationDestinationPrefixes("/app");
    		// 点对点使用的订阅前缀(客户端订阅路径上会体现出来),不设置的话,默认也是/user/
    		// registry.setUserDestinationPrefix("/user/");
    	}
    
    	// registerStompEndpoints方法表示注册STOMP协议的节点,并指定映射的URL。
    	@Override
    	public void registerStompEndpoints(StompEndpointRegistry registry) {
    		// 这一行代码用来注册STOMP协议节点,同时指定使用SockJS协议。
    		registry.addEndpoint("/gs-guide-websocket").setAllowedOrigins("*").withSockJS();
    	}
    
    }
    

    4.Greeting,HelloMessage

    package com.liuxl.cartmall.websocket;
    
    public class Greeting {
    	private String content;
    
    	public Greeting() {
    	}
    
    	public Greeting(String content) {
    		this.content = content;
    	}
    
    	public String getContent() {
    		return content;
    	}
    }
    
    package com.liuxl.cartmall.websocket;
    
    public class HelloMessage {
    
    	private String name;
    
    	public HelloMessage() {
    	}
    
    	public HelloMessage(String name) {
    		this.name = name;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    }
    
    5.GreetingController
    package com.liuxl.cartmall.websocket;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.messaging.handler.annotation.MessageMapping;
    import org.springframework.messaging.handler.annotation.SendTo;
    import org.springframework.messaging.simp.SimpMessagingTemplate;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.util.HtmlUtils;
    
    @Controller
    public class GreetingController {
    
    	private Logger logger = LoggerFactory.getLogger(this.getClass());
    
    	@Autowired
    	private SimpMessagingTemplate messagingTemplate;
    
    	// @MessageMapping注解和我们之前使用的@RequestMapping类似
    	// @SendTo注解表示当服务器有消息需要推送的时候,会对订阅了@SendTo中路径的浏览器发送消息。
    	@MessageMapping("/hello")
    	@SendTo("/topic/greetings")
    	public Greeting greeting(HelloMessage message) throws Exception {
    		Thread.sleep(1000); // simulated delay
    		return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
    	}
    	
    	@RequestMapping("/send")
    	@ResponseBody
    	public void send(){
    		templateTest();
    	}
    	
    	
    	//客户端只要订阅了/topic/subscribeTest主题,调用这个方法即可
        public void templateTest() {
            messagingTemplate.convertAndSend("/topic/greetings", new Greeting("服务器主动推的数据"));
        }
    }
    

    6.后台 messagingTemplate.convertAndSend("/topic/greetings", new Greeting("服务器主动推的数据")); 就可以实现主动推送到前台了

    7.index.js

    var stompClient = null;
    /**
     * 建立webshocket连接
     */
    function connect() {
    	// 建立连接对象(还未发起连接)
    	var socket = new SockJS('/gs-guide-websocket');
    	// 获取 STOMP 子协议的客户端对象
    	stompClient = Stomp.over(socket);
    	// 向服务器发起websocket连接并发送CONNECT帧
    	stompClient.connect({}, function(frame) {
    		// 连接成功时(服务器响应 CONNECTED 帧)的回调方法
    		// setConnected(true);
    		console.log('Connected: ' + frame);
    		stompClient.subscribe('/topic/greetings', function(greeting) {
    			showGreeting(JSON.parse(greeting.body).content);
    		});
    	}, function errorCallBack(error) {
    		// 连接失败时(服务器响应 ERROR 帧)的回调方法
    	});
    }
    
    function showGreeting(content) {
    	$("#daiban_count").text(content);
    }
    $(function() {
    	// 监听信息
    	connect();
    });

    7.需要源码,去git下载,下载地址是:spring-websocket

    https://github.com/lxldemon/spring-websocket.git
    https://github.com/lxldemon/spring-websocket.
    展开全文
  • 通过学习借鉴朋友的实现方法进行整理,实现了PHP版的微信公共平台消息主动推送,分享给大家供大家参考,具体内容如下此方法是通过模拟登录微信公共平台的方法来实现的。代码如下:一、登录接口部分代码//登录private...

    通过学习借鉴朋友的实现方法进行整理,实现了PHP版的微信公共平台消息主动推送,分享给大家供大家参考,具体内容如下

    此方法是通过模拟登录微信公共平台的方法来实现的。

    代码如下:

    一、登录接口部分代码

    //登录

    private function login(){

    $url = 'https://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN';

    $this->send_data = array(

    'username' => $this->_account,

    'pwd' => md5($this->_password),

    'f' => 'json'

    );

    $this->referer = "https://mp.weixin.qq.com/";

    $this->getHeader = 1;

    $result = explode("\n",$this->curlPost($url));

    foreach ($result as $key => $value) {

    $value = trim($value);

    if(preg_match('/"ErrCode": (.*)/i', $value,$match)){//获取token

    switch ($match[1]) {

    case -1:

    die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"系统错误")));

    case -2:

    die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"帐号或密码错误")));

    case -3:

    die(urldecode(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>urlencode("密码错误")))));

    case -4:

    die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"不存在该帐户")));

    case -5:

    die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"访问受限")));

    case -6:

    die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"需要输入验证码")));

    case -7:

    die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"此帐号已绑定私人微信号,不可用于公众平台登录")));

    case -8:

    die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"邮箱已存在")));

    case -32:

    die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"验证码输入错误")));

    case -200:

    die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"因频繁提交虚假资料,该帐号被拒绝登录")));

    case -94:

    die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"请使用邮箱登陆")));

    case 10:

    die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"该公众会议号已经过期,无法再登录使用")));

    case 0:

    $this->userFakeid = $this->getUserFakeid();

    break;

    }

    }

    if(preg_match('/^set-cookie:[\s]+([^=]+)=([^;]+)/i', $value,$match)){//获取cookie

    $this->cookie .=$match[1].'='.$match[2].'; ';

    }

    if(preg_match('/"ErrMsg"/i', $value,$match)){//获取token

    $this->token = rtrim(substr($value,strrpos($value,'=')+1),'",');

    }

    }

    }

    二、信息发送部分代码

    //单发消息

    private function send($fakeid,$content){

    $url = 'https://mp.weixin.qq.com/cgi-bin/singlesend?t=ajax-response&lang=zh_CN';

    $this->send_data = array(

    'type' => 1,

    'content' => $content,

    'error' => 'false',

    'tofakeid' => $fakeid,

    'token' => $this->token,

    'ajax' => 1,

    );

    $this->referer = 'https://mp.weixin.qq.com/cgi-bin/singlemsgpage?token='.$this->token.'&fromfakeid='.$fakeid.'&msgid=&source=&count=20&t=wxm-singlechat&lang=zh_CN';

    return $this->curlPost($url);

    }

    三、群发信息代码

    //群发消息

    public function sendMessage($content='',$userId='') {

    if(is_array($userId) && !empty($userId)){

    foreach($userId as $v){

    $json = json_decode($this->send($v,$content));

    if($json->ret!=0){

    $errUser[] = $v;

    }

    }

    }else{

    foreach($this->userFakeid as $v){

    $json = json_decode($this->send($v['fakeid'],$content));

    if($json->ret!=0){

    $errUser[] = $v['fakeid'];

    }

    }

    }

    //共发送用户数

    $count = count($this->userFakeid);

    //发送失败用户数

    $errCount = count($errUser);

    //发送成功用户数

    $succeCount = $count-$errCount;

    $data = array(

    'status'=>0,

    'count'=>$count,

    'succeCount'=>$succeCount,

    'errCount'=>$errCount,

    'errUser'=>$errUser

    );

    return json_encode($data);

    }

    四、获取所有用户信息代码片段

    //获取所有用户信息

    public function getAllUserInfo(){

    foreach($this->userFakeid as $v){

    $info[] = $this->getUserInfo($v['groupid'],$v['fakeid']);

    }

    return $info;

    }

    //获取用户信息

    public function getUserInfo($groupId,$fakeId){

    $url = "https://mp.weixin.qq.com/cgi-bin/getcontactinfo?t=ajax-getcontactinfo&lang=zh_CN&fakeid={$fakeId}";

    $this->getHeader = 0;

    $this->referer = 'https://mp.weixin.qq.com/cgi-bin/contactmanagepage?token='.$this->token.'&t=wxm-friend&lang=zh_CN&pagesize='.$this->pageSize.'&pageidx=0&type=0&groupid='.$groupId;

    $this->send_data = array(

    'token'=>$this->token,

    'ajax'=>1

    );

    $message_opt = $this->curlPost($url);

    return $message_opt;

    }

    //获取所有用户fakeid

    private function getUserFakeid(){

    ini_set('max_execution_time',600);

    $pageSize = 1000000;

    $this->referer = "https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN&token={$_SESSION['token']}";

    $url = "https://mp.weixin.qq.com/cgi-bin/contactmanage?t=user/index&pagesize={$pageSize}&pageidx=0&type=0&groupid=0&token={$this->token}&lang=zh_CN";

    $user = $this->vget($url);

    $preg = "/\"id\":(\d+),\"name\"/";

    preg_match_all($preg,$user,$b);

    $i = 0;

    foreach($b[1] as $v){

    $url = 'https://mp.weixin.qq.com/cgi-bin/contactmanage?t=user/index&pagesize='.$pageSize.'&pageidx=0&type=0&groupid='.$v.'&token='.$this->token.'&lang=zh_CN';

    $user = $this->vget($url);

    $preg = "/\"id\":(\d+),\"nick_name\"/";

    preg_match_all($preg,$user,$a);

    foreach($a[1] as $vv){

    $arr[$i]['fakeid'] = $vv;

    $arr[$i]['groupid'] = $v;

    $i++;

    }

    }

    return $arr;

    }

    希望本文所述对大家学习php程序设计有所帮助。

    展开全文
  • <div><p>文档找了一圈没有发现 可以根据用户的 fd 使用websocket 主动推送消息的方法 类似于 mix框架中的 app()->ws->push($data);</p><p>该提问来源于开源项目:hyperf/hyperf</p></div>
  • 怎么实现服务器给android客户端主动推送消息 推荐于2016-03-04 07:32:55 最佳答案 一、消息推送基础消息推送,就是在互联网上通过定期传送用户需要的信息来减少信息过载的一项新技术。推送技术通过自动传送...
  • 介绍给微信公众号用户主动推送消息指的是发送模板消息。可以随时给用户发送提醒。功能非常丰富,比如提醒用户特定事件(该付费了,商品降价,任务执行成功,遇到错误等等)。不仅可以向用户发送文字消息,还可以实现...
  • 推荐一个网站www.itziy.com csdn免积分下载器、pudn免积分下载器、51cto免积分下载器www.verypan.com 百度网盘搜索引擎www.94cto.com 编程相关视频教程、电子书、源码、开发工具、文档手册模拟...,实现主动信息发送...
  • php实现微信公众号 主动推送消息

    千次阅读 2018-12-10 14:14:04
    通过学习借鉴朋友的实现方法进行整理,实现了PHP版的微信公共平台消息主动推送,分享给大家供大家参考,具体内容如下 此方法是通过模拟登录微信公共平台的方法来实现的。代码如下: 一、登录接口部分代码 //登录 ...
  • 严格地说,HTTP 协议是没有办法做服务器主动推送的,但是当服务器向客户端声明接下来要发送流信息时,客户端就会保持连接打开,SSE 使用的就是这种原理。 一、SSE 能做什么?  理论上, SSE 和 WebSocket 做的是...
  • 服务器段主动推送的方式 1.轮询 这种方式实际上并不是服务器端主动,而是引言中提到的方式。 简单来说是客户端定时不停地向服务器端发请求,不管之前的请求是否返回结果,返回什么结果。只管自己发送请求。 缺点:...
  • 服务器主动推送消息数据给客户端

    千次阅读 2019-02-11 15:17:14
    这个问题第一次是我在实现一个导师的方案的时候所发现的,一开始我需要实现服务器与客户端的密钥协商和数据传递,服务器需要主动分发(推送)密钥给客户端,因为以前没有做过相关编码,后来只能想到用反向连接,也...
  • 它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端这里我将使用springboot2.0 集成的websocket 实现简单的服务器推送消息1.gradle添加依赖compile('org.springframework.boot:...
  • 需求:项目测试,缺少用户登录失败给admin推送消息,想到这个方式,当用户登录失败时,admin用户会在页面看到咣咣乱弹的alert. 正文 pom.xml <!-- webSocket 开始--> <dependency> <groupId>...
  • pom.xml配置: &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-websocket&...packa...
  • 一、消息推送基础消息推送,就是在互联网上通过定期传送用户需要的信息来减少信息过载的一项新技术。推送技术通过自动传送信息给用户,来减少用于网络上搜索的时间。它根据用户的兴趣来搜索、过滤信息,并将其定期推...
  • 在手机上相信都有来自服务器的推送消息,比如一些及时的新闻信息,这篇文章主要就是实现这个功能,只演示一个基本的案例。使用的是websocket技术。 一、什么是websocket WebSocket协议是基于TCP的一种新的网络协议。...
  • <?...header('X-Accel-Buffering: no'); header('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); set_time_limit(0);... //清空(擦除)缓冲区并关闭输出缓冲 ob_implicit_flush(...
  • pom.xml: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.2.RELEASE<... &l...

空空如也

1 2 3 4 5 ... 20
收藏数 1,832
精华内容 732
关键字:

主动推送消息