| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3698 人关注过本帖, 1 人收藏
标题:反向Ajax扫盲贴(2)comet
只看楼主 加入收藏
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
结帖率:80.91%
收藏(1)
 问题点数:0 回复次数:12 
反向Ajax扫盲贴(2)comet
上次开了一帖 轮询 有兴趣的朋友呢 可以去看看 https://bbs.bccn.net/thread-445825-1-1.html
这次呢 打算跟大家说说comet 也就是服务器推 借用网上现成的源码 我给大家尽量的 详细的解释一下comet是咋回事 借此呢提高大家对comet的了解
这个帖子从头到尾您看完 我感觉10分钟 外加实践一下 comet您算是入门了
这次内容比较多 可能一次说不完 今天呢 有多少说多少
这次呢 找了一个源码web实时聊天系统 打算通过这个聊天系统给大家说说comet在其中是如何应用的
系统简单说明如下:
 
系统所用数据库:sqlite数据库
 
  UserInfo:用户信息表
 
  UserRelation:用户关系表
 
  MessageInfo:聊天信息表
 
开发结构:
图片附件: 游客没有浏览图片的权限,请 登录注册


 数据层--与sqlite数据库之间的交互
  逻辑层--数据转换
  实体层--数据对象
  Web服务:利用WebService对外提供公共的接口,主要提供客户端与服务器端数据之间的交互。
  客户端():利用comet中ajax反向技术推送聊天信息。




[ 本帖最后由 wangnannan 于 2015-5-29 11:22 编辑 ]
搜索更多相关主题的帖子: 服务器 数据库 朋友 如何 网上 服务器 数据库 朋友 如何 网上 
2015-05-29 10:58
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
操作方法呢 就是先登录 登录成功后,两选项卡分别跳转到如下界面:双击在线好友中的行,则可开始进行聊天。
其中聊天过程是使用了comet推送技术。
图片附件: 游客没有浏览图片的权限,请 登录注册

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-05-29 11:04
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
程序代码:
var Global = {
    Action: null,
    MyInfo: current_user,
    FriendInfo: null
};
function PHPArray(Action) {
    this.params = new Object();
    this.length = 3;
    Global.Action = Action;
    this.params["Action"] = Global.Action;
    this.params["UserId"] = Global.MyInfo.UserId;
    this.params["PassWord"] = Global.MyInfo.PassWord;
}
PHPArray.prototype.Add = function (key, value) {
    this.params[key] = value;
    this.length++;
}
PHPArray.prototype.ToJson = function () {
    var tempstr = "{";
    for (var key in this.params) {
        tempstr += key + ":\"" + this.params[key] + "\",";
    }
    tempstr = tempstr.substring(0, tempstr.length - 1);
    tempstr += "}";
    return (new Function("return " + tempstr))();
}
function PostSubmit(params, success) {
    $.post("comet_broadcast.asyn", params,
    success, "json");
}
$(document).ready(function () {
    //初始化事件
    InitEvent();
    //显示我的资料
    ShowUserInfo("my", Global.MyInfo);
    //获取好友
    GetFriends();
    //保持连接
    Keepline();
});
//初始化事件
function InitEvent() {
    //鼠标移上触发事件
    $('#Friends .list .user').live('mouseover mouseout dblclick', function (e) {
        if (e.type == 'mouseover') {
            // do something on mouseover
            //Selected==0表示未选中,1表示选中
            if ($(this).attr("Selected") == "false") {
                $(this).css("background-color", "#B0DAED");
            }
            var friend = {
                UserId: $(this).attr("UserId"),
                UserName: $(this).attr("UserName"),
                Sex: $(this).attr("Sex"),
                Age: $(this).attr("Age"),
                Email: $(this).attr("Email")
            };
            ShowUserInfo("temp_friend", friend);
            $("#tabFriend").css({
                "top": $(e.toElement).offset().top + this.offsetHeight - 5 + "px",
                "left": $(e.toElement).offset().left + this.offsetWidth - 5 + "px"
            }).show("fast");
        } else if (e.type == "mouseout") {
            // do something on mouseout
            if ($(this).attr("Selected") == "false") {
                $(this).css("background-color", "transparent");
            }
            $("#tabFriend").remove();
        } else if (e.type == "dblclick") {
            if ($(this).attr("Selected") == "true") return;
            if ($(this).attr("Status") == "离线") return;
            $("#Friends .list .user[Selected='true']")
            .css("background-color", "transparent")
            .attr("Selected", "false");
            $(this).attr("Selected", "true");
            Global.FriendInfo = {
                UserId: $(this).attr("UserId"),
                UserName: $(this).attr("UserName"),
                Sex: $(this).attr("Sex"),
                Age: $(this).attr("Age"),
                Email: $(this).attr("Email")
            };
            ShowUserInfo("friend", Global.FriendInfo);
            $(this).css("background-color", "#ffe6b0");
        }
    });
    //发送消息
    $("#btnSendMsg").click(function () { SendMsg(); });
}
function ShowUserInfo(type, user) {
    var tabId, tabTitle, selector;
    selector = "#Messages .user_info";
    if (type == "my") {
        tabId = "my_info";
        tabTitle = "我的资料(" + user.UserId + ")";
        $("#Messages .user_info #" + tabId).remove();
    } else {
        tabTitle = "好友资料(" + user.UserId + ")";
        if (type == "friend") {
            tabId = "friend_info";
            $("#Messages .user_info #" + tabId).remove();
        } else {
            tabId = "tabFriend";
            selector = "body";
        }
    }
    var tempstr = "<table id='" + tabId + "' cellpadding='0' cellspacing='0'>";
    tempstr += "<tr>";
    tempstr += "<td colspan='4' class='title'>" + tabTitle + "</td>";
    tempstr += "</tr>";
    tempstr += "<tr>";
    tempstr += "<td class='label'>姓名:</td>";
    tempstr += "<td colspan='3'>" + user.UserName + "</td>";
    tempstr += "</tr>";
    tempstr += "<tr>";
    tempstr += "<td class='label'>性别:</td>";
    tempstr += "<td>" + user.Sex + "</td>";
    tempstr += "<td class='label'>年龄:</td>";
    tempstr += "<td>" + user.Age + "</td>";
    tempstr += "</tr>";
    tempstr += "<tr>";
    tempstr += "<td class='label'>邮箱:</td>";
    tempstr += "<td colspan='3'>" + user.Email + "</td>";
    tempstr += "</tr>";
    tempstr += "</table>";
    $(selector).append(tempstr);
}
function Keepline() {
    var array = new PHPArray("Keepline");
    var success = function (data, status) {
        if (data.ResponseStatus == 1) {
            ShowMessage(data.ResponseData, "recive");
        }
        Keepline();
    }
    //注意这里
    PostSubmit(array.ToJson(), success);
}
function GetFriends() {
    var array = new PHPArray("GetFriends");
    var success = function (data, status) {
        if (data.ResponseStatus != 1) return;
        ShowFriends(data.ResponseData.OnlineFriends, "Online");
        ShowFriends(data.ResponseData.OfflineFriends, "Offline");
    }
    //这里
    PostSubmit(array.ToJson(), success);
}
function ShowFriends(data, type) {
    if (!data) return;
    var tempstr = "";
    $(data).each(function (index, item) {
        tempstr += "<div class='user' selected='false' ";
        tempstr += "UserId='" + item.UserId + "' ";
        tempstr += "UserName='" + item.UserName + "' ";
        tempstr += "PassWord='" + item.PassWord + "' ";
        tempstr += "Sex='" + item.Sex + "' ";
        tempstr += "Age='" + item.Age + "' ";
        tempstr += "Email='" + item.Email + "' ";
        tempstr += "Status='" + item.Status + "' ";
        tempstr += ">";
        tempstr += item.UserId;
        tempstr += "</div>";
    });
    var selector = "#Friends ";
    if (type == "Online") {
        selector += ".list_online";
    } else {
        selector += ".list_offline";
    }
    selector += " .list";
    $(selector).append(tempstr);
}
function SendMsg() {
    if (!Global.FriendInfo) {
        alert("请选择一位在线好友...");
        return;
    }
    var Content = $("#txtSendMsg").val();
    var array = new PHPArray("SendMsg");
    array.Add("ReciveUserId", Global.FriendInfo.UserId);
    array.Add("Content", Content);
    var success = function (data, status) {
        ShowMessage(data.ResponseData, "send");
    }
    //这里 

    PostSubmit(array.ToJson(), success);
}
function ShowMessage(message, type) {
    var tabClass;
    if (type == "send") {
        tabClass = "sendmsg";
    } else if (type == "recive") {
        tabClass = "recivemsg";
    }
    var tempstr = "<table class='" + tabClass + "' cellpadding='0' cellspacing='0'>";
    tempstr += "<tr>";
    tempstr += "<td class='user'>" + message.SendUserId + " " + message.SendTime + "</td>";
    tempstr += "</tr>";
    tempstr += "<tr>";
    tempstr += "<td class='msg'>" + message.Content + "</td>";
    tempstr += "</tr>";
    tempstr += "</table>";
    $("#Messages .chat .message").append(tempstr);
}
function Offline() {
    var array = new PHPArray("Offline");
    var success = function (data, status) {
        alert("下线成功!");
    }
    //还有这里 看明白了 

    PostSubmit(array, success);
    return false;
}



[ 本帖最后由 wangnannan 于 2015-5-29 11:21 编辑 ]

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-05-29 11:05
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
他这个写的吧 乍一看有点懵 大家看这段就可以
function PostSubmit(params, success) {
    $.post("comet_broadcast.asyn", params,
    success, "json");
}

这段是关键代码 有些人说用Ajax的长轮询比较好 其实comet貌似就是通过ajax演变而来的 也就是comet是ajax里面的一种,只不过有多种实现方式
    <httpHandlers>
      <!--comet长连接配置字节-->
      <add verb="*" path="comet_broadcast.asyn" type="ServerPushHttpHandler.ServerPush,ServerPushHttpHandler"/>
    </httpHandlers>

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-05-29 11:09
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
OK 主要就是上边这两段 其它辅助代码 就不解释了 大家慢慢看一目了然 咱们只说comet
根据配置文件的指向 找到代码
图片附件: 游客没有浏览图片的权限,请 登录注册

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-05-29 11:12
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
程序代码:
using System;
using System.Collections.Generic;
using System.Text;
#region 命名空间
using WebChatSDK;
using ChatModel;
using Newtonsoft.Json;
using System.Web;
#endregion

namespace ServerPushHttpHandler
{
    public class ServerPushHandler
    {
        #region 全局变量
        HttpContext m_Context;
        //推送结果
        ServerPushResult _IAsyncResult;
        //声明一个集合
        static Dictionary<string, ServerPushResult> dict = new Dictionary<string, ServerPushResult>();
        //sdk对外接口
        WebChat sdk = new WebChat();
        #endregion

        #region 构造函数
        /// <summary>
        /// 构造方法
        /// </summary>
        public ServerPushHandler(HttpContext context, ServerPushResult _IAsyncResult)
        {
            this.m_Context = context;
            this._IAsyncResult = _IAsyncResult;
        }
        #endregion

        #region 执行操作
        /// <summary>
        /// 根据Action判断执行方法
        /// </summary>
        /// <returns></returns>
        public ServerPushResult ExecAction()
        {
            sdk.User = new UserInfo()
            {
                UserId = m_Context.Request["UserId"],
                PassWord = m_Context.Request["PassWord"]
            };
            switch (m_Context.Request["Action"])
            {
                case "Register":
                    Register();
                    break;
                case "Online":
                    Online();
                    break;
                case "Offline":
                    Offline();
                    break;
                case "Keepline":
                    Keepline();
                    break;
                case "GetFriends":
                    GetFriends();
                    break;
                case "SendMsg":
                    SendMsg();
                    break;
                default:
                    break;
            }
            return _IAsyncResult;
        }
        #endregion

        #region 注册用户
        private void Register()
        {
            sdk.User.UserName = m_Context.Request["UserName"];
            sdk.User.Sex = m_Context.Request["Sex"];
            sdk.User.Age = Convert.ToInt32(m_Context.Request["Age"]);
            sdk.User.Email = m_Context.Request["Email"];
            _IAsyncResult.Result = sdk.Register_User();
            if (!dict.ContainsKey(sdk.User.UserId))
            {
                dict.Add(sdk.User.UserId, _IAsyncResult);
            }
            _IAsyncResult.Send();
        }
        #endregion

        #region 用户上线
        private void Online()
        {
            _IAsyncResult.Result = sdk.Verify_User();
            if (!dict.ContainsKey(sdk.User.UserId))
            {
                dict.Add(sdk.User.UserId, _IAsyncResult);
            }
            _IAsyncResult.Send();
        }
        #endregion

        #region 用户下线
        private void Offline()
        {
            _IAsyncResult.Result = sdk.Downline_User();
            if (dict.ContainsKey(sdk.User.UserId))
            {
                dict.Remove(sdk.User.UserId);
            }
            _IAsyncResult.Send();
        }
        #endregion

        #region 保持联接
        private void Keepline()
        {
            if (!dict.ContainsKey(sdk.User.UserId))
                dict.Add(sdk.User.UserId, _IAsyncResult);
            else //登录时虽然保存了当前用户的连接,但是登录完后异步向客户端推送了数据,此时这个客户端连接已经失效,那么在connect时相当于才是此客户端与服务器端真正的连接,需要重新更新ServerPushResult的值
                dict[sdk.User.UserId] = _IAsyncResult;
        }
        #endregion

        #region 获取好友
        private void GetFriends()
        {
            _IAsyncResult.Result = sdk.Get_Friends();
            _IAsyncResult.Send();
        }
        #endregion

        #region 添加好友
        private void AddFriend()
        {
            UserInfo friend = new UserInfo()
            {
                UserId = m_Context.Request["FriendId"]
            };
            _IAsyncResult.Result = sdk.Add_Friend(friend);
            _IAsyncResult.Send();
        }
        #endregion

        #region 发送消息
        private void SendMsg()
        {
            MessageInfo message = new MessageInfo()
            {
                SendUserId = m_Context.Request["UserId"],
                ReciveUserId = m_Context.Request["ReciveUserId"],
                Content = m_Context.Request["Content"]
            };
            string result = sdk.Send_Msg(message);
            if (dict.ContainsKey(message.ReciveUserId))
            {
                dict[message.ReciveUserId].Result = result;
                dict[message.ReciveUserId].Send();
            }
            _IAsyncResult.Result = result;
            _IAsyncResult.Send();
        }
        #endregion

        #region 全站广播
        public void SendMsg(string Action, string strContent)
        {
            MessageInfo message = new MessageInfo()
            {
                SendUserId = m_Context.Request["UserId"],
                ReciveUserId = m_Context.Request["ReciveUserId"],
                Content = m_Context.Request["Content"]
            };
            foreach (ServerPushResult IAsyncResult in dict.Values)
            {
                //IAsyncResult.ResultXml = strContent;
                //IAsyncResult.Send(null);
            }
        }
        #endregion
    }
}

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-05-29 11:12
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
handler里面方法 简单明了 这个具体就不解释了
怎么样很简单吧

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-05-29 11:13
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
附上源码http://(%E8%81%8A%E5%A4%A9).zip

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-05-29 11:14
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
COMET目前有两种实现方式,长轮询和iframe流一 今天给大家介绍的呢 是长轮询

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-05-29 11:15
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
说了这么多 如果您还不懂 非要刨根问底问为什么 好的 理论在这里 先实践在看理论 你会发现其实这也没传说中那么难
http://www.

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-05-29 11:17
快速回复:反向Ajax扫盲贴(2)comet
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039566 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved