`

nodejs实现long-polling

 
阅读更多

运行方式如下:

node long.js

不断往服务器目录放置message文件如:(echo "new message" > message)

首页index.html如下

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title>Test Long-Polling</title>
  <script type="text/javascript" src="http://code.jquery.com/jquery-1.5.min.js"></script>
</head>
<body> 
  <div id="container">
  <h1>Test Long-Polling</h1>
  <ul id="results">
  </ul>
  </div>
<script>
 
$(function ($) {
  function longPoll() {
    $.ajax({
      type: 'POST',
      url: 'http://127.0.0.1:8080/get',
      data: '',
      success: function(data) {
        console.log(data);
        $('#results').append('<li>' + data + '</li>');
        longPoll(); //获取到数据后继续发起请求
      },
      error:function(){
        setTimeout(function(){ //如果网络或者服务器异常,则等待5s再发起请求
          longPoll();
        }, 5000);
      }
    });
  }
  longPoll();
});
</script>
</body>
</html>

 服务long.js如下:

var http = require("http"),
    url  = require("url"),
    path = require("path"),
    fs   = require("fs");

var handle = {}
handle["/get"]         = getHandler;

var handleStream;

http.createServer(function (req, res) {
    var pathname=url.parse(req.url).pathname;
    if(typeof handle[pathname] === "function"){
    	handle[pathname](res, req);
    }
    else {
        /*
        * 发送静态页面:首页
        */
        pathname=__dirname+url.parse(req.url).pathname;   
        if (path.extname(pathname)=="") {   
            pathname+="/";   
        }   
        if (pathname.charAt(pathname.length-1)=="/"){   
            pathname+="index.html";   
        }
        fs.exists(pathname,function(exists){   
            if(exists){   
                switch(path.extname(pathname)){   
                case ".html":   
                    res.writeHead(200, {"Content-Type": "text/html"});   
                    break;   
                default:   
                    res.writeHead(200, {"Content-Type": "application/octet-stream"});   
                }   
       
                fs.readFile(pathname,function (err,data){   
                    res.end(data);   
                });   
            } else {   
                res.writeHead(404, '404 Not Found', {'Content-Type': 'text/html'});   
                res.end('<h1>404 Not Found</h1>');   
            }   
        });   
    }
}).listen(8080, "0.0.0.0");

console.log("Server running at http://0.0.0.0:8080/");

function getHandler(res, req){//如果是post方式请求,返回消息,否则返回404,简单的安全保证
    if (req.method == 'POST') {
	return handleStream(req, res);
    }
    res.writeHead(404, '404 Not Found', {'Content-Type': 'text/html'});
    res.end('<h1>404 Not Found</h1>');
}

//用文本文件模拟消息或者数据库,正式环境还是应该用mysql或者redis替换
handleStream = function (req, res) {
    var filename = './message';
    fs.readFile(filename, 'utf8', function (err, data) {
        if (!err) { 
            res.writeHead(200, {'Content-Type': 'text/html'});
            res.end(data);
            fs.unlinkSync(filename) //删掉message文件
        } else {
            //设置10秒以后重新检测message文件内容
            setTimeout(function() { handleStream(req, res) }, 10000);
        }
    });
}

 

分享到:
评论

相关推荐

    node.js chat程序如何实现Ajax long-polling长链接刷新模式

    node.js chat是node.js作者用JS写的一个多人聊天工具, 源代码公开下载,网址是chat.nodejs.org。作者用这个小例子,来展示如何用nodejs开发高效率的应用程序。对于nodejs的学习者来说,是一个很好的例子

    nodejs-chats-using-longpolling-eventsourcing-websockets-ulbitv:使用3种不同方式聊天的Node.js应用

    这些技术都是为了实现客户端与服务器之间的高效、实时的数据交换,特别是在Web开发中创建聊天、协作工具和其他实时应用时。 首先,我们来了解**长轮询**。长轮询是一种HTTP持久连接,它允许服务器在有新数据可用时...

    nodejs-push-notification-server:一个使用 nodejs 构建的简单推送通知服务器

    Socket.IO支持多种传输机制,如WebSocket、Long-Polling等,确保在各种网络条件下都能保持连接。它提供了一个简单的API,使得开发者可以轻松地实现服务器与客户端之间的实时双向通信。 **三、创建推送通知服务器** ...

    nodejs-express-socketio-chatroom:使用node + express + socket.io的简单聊天室

    它不仅支持WebSocket协议,还通过其他技术(如polling、long-polling)为不支持WebSocket的浏览器提供了兼容性,确保了跨平台的实时性。 接下来,我们将分步骤地构建这个聊天室: 1. **项目初始化**: 首先,确保...

    NodeJS-Socket.io

    Socket.io的核心是通过WebSocket协议来提供实时通信,但同时它也支持其他多种备选的 fallback 技术,如polling、long-polling等,确保在各种网络环境中都能稳定工作。 WebSocket是一种在客户端和服务器之间建立持久...

    Node.js-一个简单的多人聊天室。基于vue和nodeSocket.IO

    它不仅封装了WebSocket协议,还提供了对polling、long-polling等多种兼容旧浏览器的解决方案。在这个聊天室中,Socket.IO负责在客户端和服务器之间建立连接,实现实时消息的传输。当一个用户发送消息时,Socket.IO会...

    node.js实现后台连接socket套接字获取数据

    它是基于WebSocket协议的,但同时也支持其他几种 fallback 技术,如polling、long-polling等,确保在不支持WebSocket的环境中也能实现类似的功能。WebSocket是一种在单个TCP连接上进行全双工通信的协议,相比HTTP,...

    Node.js实现聊天室功能

    它会自动降级到其他实时通信技术,如polling或long-polling。 4. **HTML/CSS/JavaScript**: 客户端界面通常由HTML、CSS和JavaScript组成。HTML用于结构,CSS用于样式,JavaScript负责与WebSocket服务器交互。你可以...

    NodeJs 几个npm模块

    它通过多种技术(如 WebSocket、Long Polling)进行降级处理,确保在各种浏览器和移动设备上都能实现低延迟、高可靠性的真实时通信。Socket.IO 提供了一套简单的 API,使得开发者可以轻松地在客户端和服务器之间建立...

    socket-chat:通过Socket和Nodejs进行聊天

    Socket.IO提供了一种简单的方式来创建WebSocket服务器和客户端,同时在WebSocket不支持的浏览器或环境中回退到其他协议,如polling或long-polling。 **CSS基础** 虽然主要的技术焦点在于Socket和Node.js,但项目...

    realtime-chat-room:使用 nodejs、serverjs 和 socket.io 的实时聊天室

    Socket.IO通过WebSocket、Long-Polling等不同的传输机制确保在各种网络环境中都能保持连接,同时提供了简单的API,让开发者可以轻松地在应用中添加实时功能。 **实时聊天室的构建步骤** 1. **安装依赖** 首先,你...

    简单的聊天室

    Socket.IO支持多种传输机制,如polling、long-polling等,确保即使在网络不稳定的情况下也能保持连接。在本项目中,Socket.IO作为客户端和服务器之间通信的桥梁,处理数据的发送和接收。 项目运行前,你需要确保...

    nodejs结合socket.io实现websocket通信功能的方法

    Socket.IO 能够自动选择最优的传输方式(如 WebSocket、long-polling 等),并且能够在各种网络环境中工作。 3. **WebSocket 原理** - WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 连接是...

    battlecity:NES 战城克隆游戏。 基于nodejs和socket io

    它封装了WebSocket协议和其他多种备选技术,如polling、long-polling等,确保在各种网络环境下都能提供可靠的实时通信。在"战城"克隆游戏中,Socket.IO扮演着至关重要的角色,负责处理客户端和服务器之间的数据交换...

    chan

    基于HTTP的双向方式长度较长(long polling):直到消息入队或出队,服务器才会返回响应。未dequeue的消息位于内存中,实际的工作方式就是Golang的Channel。 受原理所限,此服务不能实现消息的可靠传递(reliable ...

    websockets:节点JS

    这个示例使用SocketIO ,它不支持NodeJS模块cluster (它仍然可以工作,但是会回websocket long polling而不是websocket )。 生成证书并将其放置在certs文件夹( ./server/certs )中以进行本地开发。 如果您不...

    玩转NODE.JS(四)-搭建简单的聊天室的代码

    Socket.IO的核心功能是它能够自动选择最佳的传输方式,如WebSocket、long-polling等,确保最佳性能和兼容性。 #### 二、项目初始化 - **创建项目目录**:首先创建一个名为`chatroom`的文件夹,作为项目的工作空间...

    Node-SocketIO:一个聊天应用程序,展示nodejs + expressjs和socketio

    Socket.IO是一个实时应用框架,能够在浏览器和服务器之间建立持久的连接,支持多种传输方式,包括WebSocket、long polling等,确保数据在不同环境下的顺畅传输。在聊天应用中,Socket.IO负责维持客户端与服务器之间...

    Bubble:第一个使用nodeJS html5 socket.io的游戏

    它的核心功能是解决各种浏览器兼容性问题,提供跨平台的WebSocket支持,并且在WebSocket不可用时可以自动回退到其他如Long Polling的技术,确保实时通信的可靠性。在气泡游戏中,Socket.IO使得玩家的动作能立即反映...

    node.js:Projeto临时NodeJS,ExpressJS,Vue JS,Socket IO,MySQL,MongoDB,TDD和Javascriptavançado

    它能在多种浏览器和设备上工作,并自动在WebSocket、Long Polling等多种传输协议间切换。 6. **MySQL**:MySQL是一款关系型数据库管理系统,广泛应用于互联网应用,提供高速、稳定的数据存储和查询能力。 7. **...

Global site tag (gtag.js) - Google Analytics