lighttpd+fastcgi EventSource测试

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");

2、代码实现:

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;
}

编译生成test.fastcgi

修改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",
        ))
)

2)、应用端:

<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>

3、在支持HTML5的火狐浏览器上输入网址:http://192.168.*.*/index1.html

会一直有如下打印:

this is test-event
ttttttttttttt

如果设置了retry参数的话server会按照此间隔来发送event

你可能感兴趣的:(EventSource)