用SignalR 2.0開發客服系統[系列3:實現點對點通訊]


前言

交流群:195866844

 

目錄:

用SignalR 2.0開發客服系統[系列1:實現群發通訊]

用SignalR 2.0開發客服系統[系列2:實現聊天室]

真的很感謝大家的支持,今天發表系列3,我們的正菜馬上就要來了..

 

 

開發環境

 開發工具:VS2013 旗艦版

 數據庫:未用

 操作系統:WIN7旗艦版

 

正文開始

首先我們來看看實現的效果:

 

所用到的方法和類(重要):

其實細心的朋友應該早就發現了,在上篇博客我們就已經用到了這個方法:

//調用指定連接對象的JS               
Clients.Client(連接對象的唯一標識).addMessage("");

//調用指定集合中所有連接對象的JS
Clients.Clients(集合).addMessage("")

 

下面上代碼:

首先實體類:

很簡單,只有一個用戶類

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace SignalRTest
{
    /// <summary>
    /// 用戶類
    /// </summary>
    public class UserInfo
    {
        [Key]
        public string ContextID { get; set; }
        public string Name { get; set; }

    }

}

 

Hub的源碼(同樣,注釋很全,我就不單獨的拿出來講了):

using Microsoft.AspNet.SignalR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Threading.Tasks;
using Microsoft.AspNet.SignalR.Hubs;
using Newtonsoft.Json;

namespace SignalRTest
{
    [HubName("ptopHub")]
    public class PTPHub : Hub
    {
       public static List<UserInfo> UserList = new List<UserInfo>();
       //public static List<RoomInfo> RoomList = new List<RoomInfo>();

        /// <summary>
        /// 重寫鏈接事件
        /// </summary>
        /// <returns></returns>
       public override Task OnConnected()
       {
           // 查詢用戶。
           var user = UserList.SingleOrDefault(u => u.ContextID == Context.ConnectionId);

           //判斷用戶是否存在,否則添加進集合
           if (user == null)
           {
               user = new UserInfo()
               {
                     Name = "",
                     ContextID = Context.ConnectionId
               };
               UserList.Add(user);

           }
           
           return base.OnConnected();
       }
        /// <summary>
        /// 獲取用戶名和自己的唯一編碼
        /// </summary>
        /// <param name="name"></param>
       public void GetName(string name)
       {
           // 查詢用戶。
           var user = UserList.SingleOrDefault(u => u.ContextID == Context.ConnectionId);
           if (user != null)
           {
               user.Name = name;
               Clients.Client(Context.ConnectionId).showID(Context.ConnectionId);
           }
           
           GetUserList();
       }
        /// <summary>
        /// 重寫斷開的事件
        /// </summary>
        /// <returns></returns>
       public override Task OnDisconnected()
       {
           var user =UserList.Where(u => u.ContextID == Context.ConnectionId).FirstOrDefault();

           //判斷用戶是否存在,存在則刪除
           if (user != null)
           {
               //刪除用戶
               UserList.Remove(user);

           }
           //更新所有用戶的列表
           GetUserList();
           return base.OnDisconnected();
       }

       /// <summary>
       /// 更新所有用戶的在線列表
       /// </summary>
       private void GetUserList()
       {

           var itme = from a in UserList
                      select new { a.Name, a.ContextID };
           string jsondata = JsonConvert.SerializeObject(itme.ToList());
           Clients.All.getUserlist(jsondata);

       }
        /// <summary>
        /// 發送消息
        /// </summary>
        /// <param name="contextID"></param>
        /// <param name="Message"></param>
       public void SendMessage(string contextID, string Message)
       {
           var user = UserList.Where(u => u.ContextID == contextID).FirstOrDefault();

           //判斷用戶是否存在,存在則發送
           if (user != null)
           {
               //給指定用戶發送,把自己的ID傳過去
               Clients.Client(contextID).addMessage(Message + " " + DateTime.Now,Context.ConnectionId);
               //給自己發送,把用戶的ID傳給自己
               Clients.Client(Context.ConnectionId).addMessage(Message + " " + DateTime.Now, contextID);
           }
           else
           {
               Clients.Client(Context.ConnectionId).showMessage("該用戶已離線");
           }
       }
      
    }
}

前端HTML+JS(上次有朋友吐槽JS沒注釋 - -,實在不好意思,呃..這次加上了..):

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>點對點聊天</title>
    <script src="Scripts/jquery-1.10.2.min.js"></script>
    <script src="Scripts/jquery.signalR-2.0.0.min.js"></script>
    <!--這里要注意,這是虛擬目錄,也就是你在OWIN Startup中注冊的地址-->
    <script src="signalr/hubs"></script>
    <script type="text/javascript">
        var Clients = [];
        $(function () {
            chat = $.connection.ptopHub;
            //注冊提示信息方法
            chat.client.showMessage = function (Message) {
                alert(Message);
            }
            //注冊顯示信息的方法
            chat.client.addMessage = function (Message,contextID) {
                if ($.inArray(contextID,Clients) == -1) {
                    AddRoom(contextID);
                } 
                    $("#" + contextID).find("ul").each(function () {
                        $(this).append('<li>' + Message + '</li>')
                    })
            }
            //注冊查詢房間列表的方法
            chat.client.getUserlist = function (data) {
                if (data) {
                    var jsondata = $.parseJSON(data);
                    $("#roomlist").html(" ");
                    for (var i = 0; i < jsondata.length; i++) {
                        var html = ' <li>用戶名:' + jsondata[i].Name + '<button roomname="' + jsondata[i].ContextID + '" onclick="PtoPSendStart(this)">與他聊天</button></li>';
                        $("#roomlist").append(html);
                    }
                }
            }
            //注冊顯示個人信息的方法
            chat.client.showID = function (data) {
                $("#ConID").html(data);
                Clients.push(data);
            }
            // 獲取用戶名稱。
            $('#username').html(prompt('請輸入您的名稱:', ''));
            //連接成功后獲取自己的信息
            $.connection.hub.start().done(function () {
                chat.server.getName($('#username').html());
            });

        });
        //開始聊天
        function PtoPSendStart(data) {
            var val = $(data).attr('roomname');
            AddRoom(val);
        }
        //顯示聊天窗口
        function AddRoom(val) {
            Clients.push(val)
            var html = '<div style="float:left; margin-left:30px; border:double" id="' + val + '" roomname="' + val + '"><button onclick="RemoveRoom(this)">退出</button>\
                                    ' + val + '房間\
                                                聊天記錄如下:<ul>\
                                                </ul>\
                                    <input type="text" /> <button onclick="SendMessage(this)">發送</button>\
                                    </div>'
            $("#RoomList").append(html);

        }
        //發送消息
        function SendMessage(data) {
            var message = $(data).prev().val();
            var room = $(data).parent();
            var username = $("#username").html();
            message = username + ":" + message;
            var roomname = $(room).attr("roomname");
            chat.server.sendMessage(roomname, message);
        }

    </script>
</head>
<body>
    <div>
        <div>名稱:<p id="username"></p></div>
        <div>用戶唯一編碼:<p id="ConID"></p></div>
    </div>
    <div style="float:left;border:double">
        <div>在線用戶列表</div>
        <ul id="roomlist"></ul>
    </div>
    <div id="RoomList">
    </div>
</body>
</html>

至此就完成了基本的點對點聊天的功能,真心很感謝大家的支持,希望能對大家有幫助.

我的Q :524808775 加我請注明來源 - -,我們共同討論.

我會堅持寫完本系列..

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM