1、在HTML5中,Web应用程序中可以使用EventSource接收服务器发送的事件:
https://developer.mozilla.org/zh-CN/docs/Server-sent_events/Using_server-sent_events
https://developer.mozilla.org/zh-CN/docs/Server-sent_events/EventSource
http://dsheiko.com/weblog/html5-and-server-sent-events
在Web应用程序中使用服务器发送事件很简单.在服务器端,只需要按照一定的格式返回事件流,在客户端中,只需要为一些事件类型绑定监听函数,和处理其他普通的事件没多大区别.
服务器端发送事件流格式:
事件流仅仅是一个简单的文本数据流,文本应该使用UTF- 8格式的编码.每条消息后面都由一个空行作为分隔符.以冒号开头的行为注释行,会被忽略.
注:注释行可以用来防止连接超时,服务器可以定期发送消息一条注释行,以保持连接不断.
每条消息是由多个字段组成的,每个字段由字段名,一个冒号,以及字段值组成.
字段
规范中规定了下面这些字段:
event:
事件类型.如果指定了该字段,则在客户端接收到该条消息时,会在当前的EventSource对象上触发一个事件,事件类型就是该字段的字段值,你可以使用addEventListener()方法在当前EventSource对象上监听任意类型的命名事件,如果该条消息没有event字段,则会触发onmessage属性上的事件处理函数.
data:
消息的数据字段.如果该条消息包含多个data字段,则客户端会用换行符把它们连接成一个字符串来作为字段值.
id:
事件ID,会成为当前EventSource对象的内部属性"最后一个事件ID"的属性值.
retry:
一个整数值,指定了重新连接的时间(单位为毫秒),如果该字段值不是整数,则会被忽略.
除了上面规定的字段名,其他所有的字段名都会被忽略.
从服务器接受事件:
服务器发送事件API也就是EventSource接口,在你创建一个新的EventSource对象的同时,你可以指定一个接受事件的URI.例如:
var evtSource = new EventSource("ssedemo.php");
1)、服务器端:
#include <stdlib.h> #include <string.h> #include <syslog.h> #include <alloca.h> #include <fcgiapp.h> #define LISTENSOCK_FILENO 0 #define LISTENSOCK_FLAGS 0 int main(int argc, char** argv) { openlog("testfastcgi", LOG_CONS|LOG_NDELAY, LOG_USER); int err = FCGX_Init(); /* call before Accept in multithreaded apps */ if(err){ syslog (LOG_INFO, "FCGX_Init failed: %d", err); return 1; } FCGX_Request cgi; err = FCGX_InitRequest(&cgi, LISTENSOCK_FILENO, LISTENSOCK_FLAGS); if(err){ syslog(LOG_INFO, "FCGX_InitRequest failed: %d", err); return 2; } while(1){ err = FCGX_Accept_r(&cgi); syslog(LOG_INFO, "Receive Request!"); if(err){ syslog(LOG_INFO, "FCGX_Accept_r stopped: %d", err); break; } char** envp; int size = 200; for (envp = cgi.envp; *envp; ++envp) size += strlen(*envp) + 11; char* result = (char*) alloca(size); for (envp = cgi.envp; *envp; ++envp) { strcat(result, *envp); strcat(result, "\r\n"); } syslog(LOG_INFO,"%s",result); const char * request_uri; request_uri = FCGX_GetParam("REQUEST_URI", cgi.envp); if(strcmp(request_uri,"/setting-event.php")==0){ FCGX_FPrintF(cgi.out,"Content-Type: text/event-stream\r\n"); FCGX_FPrintF(cgi.out,"Cache-Control: no-cache\r\n\r\n"); FCGX_FPrintF(cgi.out, "event: %s\n", "test-event"); FCGX_FPrintF(cgi.out, "data: %s\n\n", "this is test-event"); FCGX_FFlush(cgi.out); syslog(LOG_INFO,"setting-event.php"); } //FCGX_FPrintF(cgi.out,"%s",result); FCGX_Finish_r(&cgi); } return 0; }
修改fastcgi.conf
添加:
fastcgi.server += ( "/setting-event.php" => (( "socket" => "/tmp/lighttpd.event.socket", "bin-path" => "/tmp/network/sbin/test.fastcgi", # "bin-path" => "/tmp/NMP/bin/test.php", "max-procs" => 1, # "host" => "127.0.0.1", # "port" => 8081, "check-local" => "disable", )) )
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>dongle settings</title> <script type="text/javascript" src="./Global/jquery.min.js"></script> <script type="text/javascript" src="./Global/jquery.json.min.js"></script> <script language="javascript"> var evtSource; ///* evtSource = new EventSource("setting-event.php"); function addEventSource(url, type, cb) { evtSource.addEventListener(type, cb, true); console.log("111"); } evtSource.onmessage = function(e) { console.log("222222222"); } //*/ $(window).load(function(){ this.addEventSource("setting-event.php","test-event",function(e){ console.log(e.data); console.log("ttttttttttttt"); }); }); </script> </head> <body> <p>lighttpd fastcgi test(for mips-linux)</p> <p>This is a test html</p> <hr> <br> </body> </html>
会一直有如下打印:
this is test-event ttttttttttttt