node与socket.io搭配小例子-转载

//服务端代码
io = require(‘socket.io‘).listen(app),
fs = require(‘fs‘),
cookie=require(‘cookie‘);
request=require(‘request‘);
global.userlist={};

app.listen(8080);
//io.set(‘log level‘, 1);//将socket.io中的debug信息关闭

function handler (req, res) {
    res.writeHead(200, {
        ‘Content-Type‘: ‘text/plain‘
    });
    res.end(‘Hello World\n‘);
}
var content;
var socketUser = {};
var settings={};
settings.host=‘http://localhost/test/node/myapp/‘;
io.sockets.on(‘connection‘, function (socket) {
    if(socket.handshake.headers.cookie){
        var curcookie=cookie.parse(socket.handshake.headers.cookie);
        var id=curcookie[‘PHPSESSID‘];
        request(settings.host+‘getinfo.php?type=getinfo&sid=‘+id,function(err,res,body){
            if(!err&&res.statusCode==200){
                if(body){
                    body=eval(‘(‘+body+‘)‘);
                    var userid=body.ID;
                    var username=body.UserName;
                    var online=body.Online;
                    //将新用户存进socket用户列表中
                    userlist[id]=socket;

                    socketUser[id] = {
                        ‘userid‘:userid,
                        ‘username‘:username
                    };
                    //更改上线状态
                    request(settings.host+‘getinfo.php?type=online&sid=‘+id,function(err,res,body){})

                    //发送信息给新登录用户
                    socket.emit(‘system‘,{
                        ‘alluser‘:socketUser
                    });

                    //上线欢迎
                    socket.emit(‘open‘,{
                        ‘msg‘:‘welcome!‘
                    })

                    //下线推送通知  disconnect方法名不能修改
                    socket.on(‘disconnect‘,function(){
                        //更改用户不在线
                        socketUser[id]=null;
                        userlist[id]=null;
                        request(settings.host+‘getinfo.php?type=unline&sid=‘+id,function(err,res,body){})
                        socket.broadcast.emit(‘broadcast‘,{
                            ‘msg‘:‘noline‘,
                            ‘unlineid‘:userid,
                            ‘unlinename‘:username,
                            ‘type‘:1
                        });
                    })

                    //监听接收用户信息
                    socket.on(‘sendnews‘, function (data) {
                        if(data.touserid&&userlist[data.touserid]!=undefined){
                            var user=userlist[data.touserid];
                            data.fromusername=socketUser[data.fromuserid].username;
                            //将用户信息发送给指定用户
                            user.emit(‘receivenews‘,data);
                        }else{
                            socket.emit(‘receivenews‘,data);
                        }
                    });

                    //广播  推送已登录的用户
                    socket.broadcast.emit(‘broadcast‘,{
                        ‘userid‘:userid,
                        ‘username‘:username,
                        ‘type‘:2
                    });
                }else{
                    console.log(‘falseness connect‘);
                }
            }
        })
    }else{
        console.log(‘cookie not exist‘);
    }
});
//客户端代码

<?php
$data = $_GET;
if (!isset($data[‘username‘]) || $data[‘username‘] === ‘‘ || !isset($data[‘id‘]) || $data[‘id‘] === ‘‘) {
    header("location:login.php");
}
session_id($data[‘id‘]);
session_start();
$userid = $data[‘id‘];
$name = $data[‘username‘];
$con = <a href="https://www.baidu.com/s?wd=mysql_connect&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1YvPAndmhNWnWu9nvczmWb10ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnHT1n1D4P1R4PjnkPjcdnW6vPs" target="_blank" class="baidu-highlight">mysql_connect</a>("localhost", "root", "") or die("sds");
<a href="https://www.baidu.com/s?wd=mysql_select_db&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1YvPAndmhNWnWu9nvczmWb10ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnHT1n1D4P1R4PjnkPjcdnW6vPs" target="_blank" class="baidu-highlight">mysql_select_db</a>("test", $con);
mysql_query("set names utf8");
$sql = ‘select * from io_user where username="‘ . $name . ‘" and ID=‘ . $userid;
$result = mysql_query($sql);
$res = mysql_fetch_assoc($result);
if (!$res) {
    header("location:login.php");
}
?>
<html lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Ssocket</title>
        <script type="text/javascript" src="public/javascripts/jquery.min.js"></script>
        <script type="text/javascript" src="http://localhost:8080/socket.io/socket.io.js"></script>
    </head>

    <body>
        <p>我的id:<?php echo $userid ?></p>
        <p>我的名字:<?php echo $name; ?></p>
        <h4>在线用户列表</h4>
        <table border="1" id="userlists">
            <thead>
                <tr>
                    <th width="80px">ID</th>
                    <th width="80px">用户名</th>
                    <th width="80px">选中</th>
                </tr>
            </thead>
            <tbody>
            </tbody>
        </table>
        <p style="margin-top:10px">
            信息:
            <input type="text" style="width:338px" id="content">
            <button id="send">发送</button>
        </p>
        <div id="msg"></div>
        <div id="unline"></div>
        <script type="text/javascript">
            var userid=‘<?php echo $userid; ?>‘;
            var username=‘<?php echo $name; ?>‘;
            var socket = io.connect(‘http://localhost:8080‘);

            //欢迎信息
            socket.on(‘open‘,function(res){
                console.log(res);
            })

            //无连接
            socket.on(‘disconnect‘,function(res){
                console.log(‘not connect‘);
            })

            //接收用户消息
            socket.on(‘receivenews‘,function(res){
                var html=‘<p>来自用户 (‘+res.fromusername+‘) 的消息: ‘+res.content+‘</p>‘;
                $(‘#msg‘).append(html)
            })

            //接收系统消息
            socket.on(‘system‘,function(res){
                if(res.alluser){
                    var html=‘‘;
                    var time=0;
                    $.each(res.alluser,function(k,v){
                        if(v==null||v.userid==userid){
                            return;
                        }
                        time++;
                        html+=‘<tr userid="‘+v.userid+‘"><td>‘+time+‘<td>‘+v.username+‘</td>‘;
                        html+=‘<td><input type="checkbox" class="checkbox" userid="‘+v.userid+‘"></td></tr>‘;  

                    })
                    $(‘#userlists tbody‘).html(html);
                }
            })

            //获取推送信息
            socket.on(‘broadcast‘,function(res){
                if(res.type==1&&res.unlineid!=userid){
                    $(‘#userlists tbody tr[userid="‘+res.unlineid+‘"]‘).remove();
                    $(‘#unline‘).append(‘<p>用户‘+res.unlinename+‘离线</p>‘)
                    return false;
                }
                if(res.type==2&&res.userid){
                    if(res.userid==userid){
                        return false;
                    }
                    if($(‘#userlists tbody tr[userid="‘+res.userid+‘"]‘).length>0){
                        return false;
                    }
                    var html=‘‘;
                    var length=$(‘#userlists tbody tr‘).length;
                    html+=‘<tr userid="‘+res.userid+‘"><td>‘+(length+1)+‘<td>‘+res.username+‘</td>‘;
                    html+=‘<td><input type="checkbox" class="checkbox" userid="‘+res.userid+‘"></td></tr>‘;
                    $(‘#userlists tbody‘).append(html);
                    $(‘#unline‘).append(‘<p>用户‘+res.username+‘上线</p>‘)
                    return false;
                }
            })

            $(function(){
                $(‘.checkbox‘).live(‘click‘,function(){
                    if($(this).attr(‘checked‘)==‘checked‘){
                        $(‘.checkbox‘).removeAttr(‘checked‘);
                        $(this).attr(‘checked‘,true);
                    }

                })

                //输入框回车事件
                $("#content").keyup(function(e){
                    if(e.keyCode==13){
                        $(‘#send‘).trigger(‘click‘);
                    }
                    return false;
                });

                $(‘#send‘).click(function(){
                    var content=$(‘#content‘).val();
                    var data={};
                    var touserid=$(‘.checkbox[checked]‘).attr(‘userid‘);
                    if(touserid==undefined){
                        alert(‘请选择用户‘);
                        return false;
                    }
                    if(content!=‘‘){
                        $(‘#content‘).val(‘‘);
                        data.fromuserid=userid;
                        data.touserid=touserid;
                        data.content=content;
                        //发送信息
                        socket.emit(‘sendnews‘,data);
                    }
                })
            })
        </script>
    </body>
</html>

代码网上转载而来,质量不论,仅做参考

时间: 2024-10-20 10:54:27

node与socket.io搭配小例子-转载的相关文章

使用Node.js+Socket.IO搭建WebSocket实时应用【转载】

原文:http://www.jianshu.com/p/d9b1273a93fd Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. WebSocket简介 谈到Web实时推送,就不得不说WebSocket.在WebSocket出现之前,很多网站为了实现实时推送技术,通常采用的方案是轮询(Polling)和Comet技术,Comet又可细分为两种实现方

[转载]使用node.js+socket.io搭建实时消息系统

在开发web应用时,经常会有消息接收需求.例如后台处理完某个任务,需要告知用户等.一个简单的做法,是使用ajax轮询.这样带来的问题一是低效,二是消息触达不够实时.另一个方法是使用websocket来接收消息,但可惜IE不支持这种方式.下面推荐一种既能实时接收消息,又能兼容各种浏览器的方案,那就是node.js+socket.io. node.js的异步非阻塞模型,做消息推送非常合适.socket.io则负责屏蔽浏览器的差异,其会选择性的使用下列方式建立连接:websocket, flash s

使用Node.js+Socket.IO搭建WebSocket实时应用

Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. 作者:潘良虎链接:https://www.zhihu.com/question/20215561/answer/26419995来源:知乎原文地址:http://www.plhwin.com/2014/05/28/nodejs-socketio/ WebSocket简介 谈到Web实时推送,就不得不说

基于node.js+socket.io+html5实现的斗地主游戏(1)概述

一.游戏描述 说是斗地主游戏,其实是寝室自创的"捉双A",跟很多地方的捉红10.打红A差不多,大概规则是: 1.基础牌型和斗地主一样,但没有大小王,共52张牌,每人13张,这也是为什么题目直接叫斗地主游戏的原因了. 2.手牌有黑桃A和草花A的两个人一伙:若黑桃A和草花A都在一个人手里,那就自己一伙. 3.开牌之后可以选择亮A或者不亮A,亮A之后队友也应亮明身份,互相配合出牌. 4.随机指定最先出牌者. 5.按照手牌出完顺序记分数,分别记4.3.2.1分,最后整队加和,分数高的队伍获胜.

Node.js+socket.io在线聊天室

Node.js+socket.io实现在线聊天室,照着这个教程做的,稍加改动即可实现. Node.js:0.10.31 Express:3.* 创建工程chat: 添加几个文件,工程结构如下 代码: package.json: { "name": "application-name", "version": "0.0.1", "private": true, "scripts": { &

(转)使用Node.js+Socket.IO搭建WebSocket实时应用

Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. WebSocket简介 谈到Web实时推送,就不得不说WebSocket.在WebSocket出现之前,很多网站为了实现实时推送技术,通常采用的方案是轮询(Polling)和Comet技术,Comet又可细分为两种实现方式,一种是长轮询机制,一种称为流技术,这两种方式实际上是对轮询技术的改进,这些方案

用node.js(socket.io)实现数据实时推送

在做商品拍卖的时候,要求在商品的拍卖页面需要实时的更新当前商品的最高价格.实现的方式有很多,比如: 1.setInterval每隔n秒去异步拉取数据(缺点:更新不够实时) 2. AJAX轮询方式方式推送数据(缺点:服务端需要在死循环中反复查询数据库) 3.websocket推送数据(缺点:仅支持html5标准的浏览器) socket.io的简要介绍 所有客户端都通过socket.io挂在nodejs服务器上(注意: 只是挂着,不需要任何循环,因为它是事件驱动的):需要推送消息了,服务器就与nod

基于Node.js + socket.io实现WebSocket的聊天DEMO

原文摘自我的前端博客,欢迎大家来访问 http://hacke2.github.io 简介 最近看Node.js和HTML5,练手了一个简易版的聊天DEMO,娱乐一下 为什么需要socket.io? node.js提供了高效的服务端运行环境,但是由于浏览器端对HTML5的支持不一, 为了兼容所有浏览器,提供卓越的实时的用户体验,并且为程序员提供客户端与服务端一致的编程体验, 于是socket.io诞生. 简答来说socket.io具体以下特点: 1.socket.io设计的目标是支持任何的浏览器

使用node.js + socket.io + redis实现基本的聊天室场景

在这篇文章Redis数据库及其基本操作中介绍了Redis及redis-cli的基本操作. 其中的publish-subscribe机制应用比较广泛, 那么接下来使用nodejs来实现该机制. 本文是对之前的一篇文章使用socket.io+redis来实现基本的聊天室应用场景的详细补充. 关于redis的详细情况, 请参考Redis数据库及其基本操作. 对于redis的前提是redis-server一直在运行, 这里就使用默认的localhost:6379. node.js连接redis-serv