先和服务器创建连接
var chat = new EventSource("/chat"); //这里的字符串无关紧要,,只是做一个标识表示这个请求
服务器端接受请求后响应
server.on("request", function(request, response) { var url = require('url').parse(request.url); //解析请求的url if (url.pathname == '/chat') { response.writeHead(200, {'Content-Type': 'text/event-stream'}); //非常重要 response.write("data: Connected\n\n"); //响应数据 //响应数据要"data: "开头 //如果连接关闭 request.connection.on("end", function() { response.end(); }); }
客户端监听响应
chat.onmessage = function(event) { var msg = event.data; console.log(msg); }
补充:
服务器端的监听请求和响应
server.on("request", function(request, response) { //监听是否有请求到达此服务器 //我也不知道为什么要解析 var url = require('url').parse(request.url); //如果请求方法是post,另外我查过了method是方法的意思 if (request.method == "POST") { var body = ""; //从请求主体获取数据,,chunk就是数据 request.on("data", function(chunk) { body += chunk; } //数据获取完毕,在服务器的控制台输出获取到的信息 request.on("end", function() { console.log("body: " + body); } //设置响应的头(类型,编码什么的) response.writeHead(200, {"Content-Type": "text/html"}); //200是成功的意思,,后面是类型 //响应的主体,,好像只能响应字符串 response.write("request OK"); //响应完毕 response.end(); } else if (request.mathod == "GET") { //如果是get请求 //this your code //什么判断文件类型啊,,文件内容啊,,文件能不能打开啊 } });
以上是nodejs
以下记录一下客户端的请求:
XMLHttpRequest的用法:
新建一个请求对象,,因为请求有很多方法,,所以做成一个对象
var request = new XMLHttpRequest(); //用的构造函数
选择一个请求方法,,有很多,,常用的就只有 post 和 get
request.open("GET", "http:www.baidu.****/****"); //第一个参数是方法,,第二个参数是url就是目标地址 //要注意的是虽然方法小写也没什么关系,,但是大家都是大写,,那就大写好了 request.open("POST", "*****");
这里可以设置请求的头类型什么的,,但是一般都会自动设置,,所以跳过
设置回调函数,,有很多作用,,比如下载的进度,,比如请求成功后能做什么,,
request.onreadystatechange(function() { //如果请求完成,,并且响应也成功接受 if (request.readyState == 4 && request.status == 200) { //第一个是请求的状态,,第二个是响应的状态 //调用响应的消息 console.log(request.responseText); } }
注意,,非常重要的一点来了,,前面所有的都是设置这个请求的属性,,,并没有发送请求,,所以现在发送
request.send(null); //GET 并不用附带什么数据,,但是并不是说不能 request.send("hello node"); //好像只可以发送字符串,,当然字符串变量也是可以的
这就是XMLHttpRequest的使用方法了
下面说一下JSONP:
原理很简单,,就是使用script调用外部文件那一套,,不过是在代码中调用并执行而已
甚至来说最重要的是服务器响应的内容,,而不是客户端的请求内容
首先先设置一个url,,因为这次没有send方法了,,不能发随意发送数据了,,就需要url带上一些信息来证明这是一个特殊的请求
var url = "http://127.0.0.1:8000/js/my.js"; //自己服务器上的文件 function getJsonp(data) { //回调函数,,响应完成后执行 console.log(data); //这么调用其实是错误的,,但是data就是my.js文件里的内容 } url += "?jsonp=" + "getJsonp"; //在末尾添加这样一段文本,,可以在服务器端找到
然后新建一个script文档元素,,设置url,,并插入文档的任意位置
var script = document.createElement('script'); script.src = url; //在这里就发送请求了,,还响应了 document.body.appendChild(script); //插进后面,,污,,这里就调用了script里面的内容
这个方法的服务器端配合:
var http = require('http'); var fs = require('fs'); var server = new http.Server(); server.listen(8000); server.on("request", function(request, response) { var url = require('url').parse(request.url); if (request.method == "GET") { //读取url里面的文件名 var filename = url.pathname.substring(1); var type; //判断要get的文件类型 //这里简化了,,,有很多类型的 switch(filename.substring(filename.lastIndexOf(".") + 1)) { case "html": type = "text/html; charset=utf-8"; break; case "js": type = "application/javascript; charset=utf-8"; break; } fs.readFile(filename, function(err, content) { if (err) { //如果发生错误云云 response.write(err.message); response.end(); } else { response.writeHead(200, {"Content-Type": type}); if (url.query) { //如果这个属性有数据的话,,,就是刚才设置的尾部接收到了 response.write(url.query.substring(url.query.indexOf('=') + 1) + "(" + content + ")"); //将刚才的尾部设置为函数调用,,返回响应 response.end(); } else { //正常响应 response.write(content); response.end(); } } }); } });
不知道为什么,,,,代码看起来非常难看,,,,,
写了好多,,,,如果有人看到这里,,,不胜感激,,,,本人学疏才浅,,,必然有很多错误,,,如果能指正,,,万分感谢,,,
另外本人饿着肚子,,,,,如果有重庆的人,,,,并且手边正好有一份能糊口的工作,,,,不胜感激