چت با RabbitmQ به زبان سی شارپ و ASP.NET MVC

چت با RabbitmQ

چت با RabbitmQ ، در این مقاله، نحوه‏ ی توسعه ‏ی یک برنامه‏ ی چت با RabbitmQ به زبان سی شارپ و ASP.NET MVC خواهید آموخت. نخست، نیاز است RabbitMQ و OTP را دانلود کنید.

اگر بخش قبلی مطلب ما را نخوانده‏ اید همواره می‏توانید آن را در لینک‏ های زیر بخوانید.

مرحله ۱: چت با RabbitmQ

http://www.rabbitmq.com/download.html

چت با RabbitmQ

مرحله ۲: OTP

http://www.erlang.org/downloads

چت با RabbitmQ

یک پروژه ‏ی MVC جدید ایجاد کنید.

مرحله ۳: ویژوال استودیو را باز کنید

چت با RabbitmQ

به منوی File رفته و New Project->Web application->MVC را انتخاب کنید.

چت با RabbitmQ

از قسمت New Project، ASP.NET Web Application را انتخاب و OK را کلیک کنید.

چت با RabbitmQ

MVC را انتخاب و OK را کلیک کنید.

چت با RabbitmQ

در ویژوال استودیو، ساختار پوشه همانطور که در تصویر آمده برای برنامه ‏ی چت در پنجره‏ ی Solution Explorer نشان داده می‏شود.

چت با RabbitmQ

بر روی Project کلیک راست کرده و “Manage NuGet Packages..” را انتخاب کنید.

چت با RabbitmQ

Rabbitmq را جستجو کرده و پکیج rabbitmq.client را نصب کنید.

چت با RabbitmQ

افزودن HomeController جدید.
بر روی پوشه‏ ی Controllers کلیک راست کرده، Add >> Controller را کلیک کنید.

چت با RabbitmQ

هنگامیکه کاربر کنترل کننده را انتخاب کرد، کادر محاوره ‏ای “Add Scaffold” باز می‏شود.

MVC 5 Controller – Empty را انتخاب و دکمه ‏ی “Add” را کلیک کنید.

چت با RabbitmQ

چت با RabbitmQ

یک نام (HomeController) به Controller داده و “Add” را کلیک کنید.

چت با RabbitmQ

هنگامیکه کاربر بر روی دکمه ‏ی Add کلیک می‏کند، Workspace (فضای کاری) برای نوشتن کد باز خواهد شد.

چت با RabbitmQ

کد زیر را در HomeController کپی کنید.

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Web;  
using RabbitMQ.Client;  
using RabbitMQ.Util;  
using System.Web.Mvc;  
using ChatApplication.Models.HelperBll;  
using System.Web.UI.WebControls;  
  
namespace ChatApplication.Controllers  
{  
    public class HomeController : Controller  
    {  
        DataLayer dl = new DataLayer();  
        // GET: Home  
        public ActionResult Index()  
        {  
            if (Session["userid"]==null)  
            {  
                return RedirectToAction("login");  
            }  
            else  
            {  
                return View();  
            }  
        }  
        [HttpPost]  
        public JsonResult sendmsg(string message,string friend)  
        {  
            RabbitMQBll obj = new RabbitMQBll();  
            IConnection con = obj.GetConnection();  
            bool flag = obj.send(con, message,friend);  
            return Json(null);  
        }  
        [HttpPost]  
        public JsonResult receive()  
        {  
            try  
            {  
                RabbitMQBll obj = new RabbitMQBll();  
                IConnection con = obj.GetConnection();  
                string userqueue = Session["username"].ToString();  
                string message = obj.receive(con, userqueue);  
                return Json(message);  
            }  
            catch (Exception)  
            {  
  
                return null;  
            }  
  
             
        }  
        public ActionResult login()  
        {  
  
            return View();  
        }  
        [HttpPost]  
        public ActionResult login(FormCollection fc)  
        {  
            string email = fc["txtemail"].ToString();  
            string password = fc["txtpassword"].ToString();  
            UserModel user = dl.login(email, password);  
            if (user.userid > 0)  
            {  
                ViewData["status"] = 1;  
                ViewData["msg"] = "login Successful...";  
                Session["username"] = user.email;  
                Session["userid"] = user.userid.ToString();  
                return RedirectToAction("Index");  
            }  
            else  
            {  
  
                ViewData["status"] = 2;  
                ViewData["msg"] = "invalid Email or Password...";  
                return View();  
            }  
  
        }  
  
        [HttpPost]  
        public JsonResult friendlist()  
        {  
            int id = Convert.ToInt32(Session["userid"].ToString());  
            List<UserModel> users = dl.getusers(id);  
            List<ListItem> userlist = new List<ListItem>();  
            foreach (var item in users)  
            {  
                userlist.Add(new ListItem  
                {  
                    Value = item.email.ToString(),  
                    Text = item.email.ToString()  
  
                });  
            }  
            return Json(userlist);  
        }  
    }  
}   

یک جدول در پایگاه داده (PostgreSQL) ایجاد کنید.در ادامه کوئری یک جدول آمده است.

CREATE TABLE public.tbluser(userid integer NOT NULL DEFAULT nextval('tbluser_userid_seq'::regclass), email text COLLATE pg_catalog.  
    "default"  
    NOT NULL, mobile text COLLATE pg_catalog.  
    "default"  
    NOT NULL, password text COLLATE pg_catalog.  
    "default"  
    NOT NULL, dob date NOT NULL, CONSTRAINT tbluser_pkey PRIMARY KEY(userid))  

چت با RabbitmQ

رشته‏ ی اتصال را در فایل web.config در ASP.NET درج کنید.

چت با RabbitmQ

یک User Model در پوشه‏ ی Models ایجاد کنید. بر روی پوشه‏ ی Models کلیک راست <- Add را کلیک <- Class را انتخاب کنید.

چت با RabbitmQ

چت با RabbitmQ

کد زیر را در UserModel کپی کنید.

public class UserModel  
    {  
        public int userid { get; set; }  
        [Required(ErrorMessage ="Email id Is required")]  
        public string email { get; set; }  
        [Required(ErrorMessage = "Mobile Number Is required")]  
        public string mobile { get; set; }  
        [Required(ErrorMessage = "Password Is required")]  
        public string password { get; set; }  
        [Required(ErrorMessage = "Confirm Password Is required")]  
        [Compare("password", ErrorMessage = "Password and Confirmation Password must match.")]  
        public string confirmpassword { get; set; }  
        [Required(ErrorMessage = "Date Of Birth Is required")]  
        public string dob { get; set; }  
    }  

یک کلاس DataLayer.cs ایجاد کرده و آن را کپی کنید.

بر روی پوشه‏ ی Models کلیک راست <- Add را کلیک <- Class را انتخاب کنید.

چت با RabbitmQ

کد زیر را در DataLayer.cs کپی کنید.

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Web;  
using RabbitMQ.Client;  
using RabbitMQ.Util;  
using System.Web.Mvc;  
using ChatApplication.Models.HelperBll;  
using System.Web.UI.WebControls;  
  
namespace ChatApplication.Controllers  
{  
    public class HomeController : Controller  
    {  
        DataLayer dl = new DataLayer();  
        // GET: Home  
        public ActionResult Index()  
        {  
            if (Session["userid"]==null)  
            {  
                return RedirectToAction("login");  
            }  
            else  
            {  
                return View();  
            }  
        }  
        [HttpPost]  
        public JsonResult sendmsg(string message,string friend)  
        {  
            RabbitMQBll obj = new RabbitMQBll();  
            IConnection con = obj.GetConnection();  
            bool flag = obj.send(con, message,friend);  
            return Json(null);  
        }  
        [HttpPost]  
        public JsonResult receive()  
        {  
            try  
            {  
                RabbitMQBll obj = new RabbitMQBll();  
                IConnection con = obj.GetConnection();  
                string userqueue = Session["username"].ToString();  
                string message = obj.receive(con, userqueue);  
                return Json(message);  
            }  
            catch (Exception)  
            {  
  
                return null;  
            }  
  
             
        }  
        public ActionResult login()  
        {  
  
            return View();  
        }  
        [HttpPost]  
        public ActionResult login(FormCollection fc)  
        {  
            string email = fc["txtemail"].ToString();  
            string password = fc["txtpassword"].ToString();  
            UserModel user = dl.login(email, password);  
            if (user.userid > 0)  
            {  
                ViewData["status"] = 1;  
                ViewData["msg"] = "login Successful...";  
                Session["username"] = user.email;  
                Session["userid"] = user.userid.ToString();  
                return RedirectToAction("Index");  
            }  
            else  
            {  
  
                ViewData["status"] = 2;  
                ViewData["msg"] = "invalid Email or Password...";  
                return View();  
            }  
  
        }  
  
        [HttpPost]  
        public JsonResult friendlist()  
        {  
            int id = Convert.ToInt32(Session["userid"].ToString());  
            List<UserModel> users = dl.getusers(id);  
            List<ListItem> userlist = new List<ListItem>();  
            foreach (var item in users)  
            {  
                userlist.Add(new ListItem  
                {  
                    Value = item.email.ToString(),  
                    Text = item.email.ToString()  
  
                });  
            }  
            return Json(userlist);  
        }  
    }  
}   

یک کلاس RabbitMQBll.cs برای مدیریت عملیات Rabbitmq (پیوند، ارسال و دریافت) ایجاد کنید.

بر روی پوشه‏ ی Models کلیک راست <- Add را کلیک <- Class را انتخاب کنید.

چت با RabbitmQ

کد زیر را در RabbitMQBll.cs کپی کنید.

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Web;  
using RabbitMQ.Client;  
using RabbitMQ.Util;  
using RabbitMQ.Client.Events;  
using System.Text;  
  
namespace ChatApplication.Models.HelperBll  
{  
    public class RabbitMQBll  
    {  
        public IConnection GetConnection()  
        {  
            ConnectionFactory factory = new ConnectionFactory();  
            factory.UserName = "";  
            factory.Password = "";  
            factory.Port = 5672;  
            factory.HostName = "localhost";  
            factory.VirtualHost = "/";  
             
            return factory.CreateConnection();  
        }  
        public bool send(IConnection con,string message,string friendqueue)  
        {  
            try  
            {  
                IModel channel = con.CreateModel();  
                channel.ExchangeDeclare("messageexchange", ExchangeType.Direct);  
                channel.QueueDeclare(friendqueue, true, false, false, null);  
                channel.QueueBind(friendqueue, "messageexchange", friendqueue, null);  
                var msg = Encoding.UTF8.GetBytes(message);  
                channel.BasicPublish("messageexchange", friendqueue, null, msg);  
                  
            }  
            catch (Exception)  
            {  
  
                  
            }  
            return true;  
  
        }  
        public string receive(IConnection con,string myqueue)  
        {  
            try  
            {  
                string queue = myqueue;  
                IModel channel = con.CreateModel();  
                channel.QueueDeclare(queue: queue, durable: true, exclusive: false, autoDelete: false, arguments: null);  
                var consumer = new EventingBasicConsumer(channel);  
                BasicGetResult result = channel.BasicGet(queue: queue, autoAck: true);  
                if (result != null)  
                    return Encoding.UTF8.GetString(result.Body);  
                else  
                    return null;  
            }  
            catch (Exception)  
            {  
                return null;  
                  
            }  
             
        }  
    }  
} 

کد زیر را در Views -> Index.cshtml اضافه کنید.
بر روی متد Index در HomeController -> Add View کلیک راست کنید.

چت با RabbitmQ

به Index نام بدهید.

چت با RabbitmQ

کد زیر را در View کپی کنید.

@using System.Web.Optimization  
@{  
    Layout = null;  
}  
  
<!DOCTYPE html>  
  
<html>  
<head>  
    <meta name="viewport" content="width=device-width" />  
    <title>Index</title>  
    @Styles.Render("~/Content/css")  
    @Scripts.Render("~/bundles/jquery")  
    @Scripts.Render("~/bundles/bootstrap")  
    <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%20type%3D%22text%2Fjavascript%22%3E%20%20%0A%20%20%20%20%20%20%20%20%24(document).ready(function%20()%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%24(%22%23btnsend%22).click(function%20()%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20send()%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20getmyfriends()%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20function%20getmyfriends()%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24.ajax(%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20%22POST%22%2C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20url%3A%20%22%40Url.Action(%22friendlist%22)%22%2C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contentType%3A%20%22application%2Fjson%3B%20charset%3Dutf-8%22%2C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20data%3A%20'%7B%7D'%2C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dataType%3A%20%22json%22%2C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20success%3A%20function%20(r)%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20ddlfrined%20%3D%20%24(%22%5Bid*%3Dddlfriend%5D%22)%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20ddlfrined.empty().append('%3Coption%20selected%3D%22selected%22%20value%3D%220%22%3Eselect%3C%2Foption%3E')%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(var%20i%20%3D%200%3B%20i%20%3Cr.length%3B%20i%2B%2B)%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ddlfrined.append(%24(%22%3Coption%3E%3C%2Foption%3E%22).val(r%5Bi%5D.Value).html(r%5Bi%5D.Text))%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20error%3A%20function%20(r)%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alert(%22error%22)%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20setInterval(function%20()%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24.ajax(%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20%22POST%22%2C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contentType%3A%20%22application%2Fjson%3B%20charset%3Dutf-8%22%2C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20data%3A%20'%7B%7D'%2C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20url%3A%20%22%40Url.Action(%22receive%22)%22%2C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dataType%3A%20%22json%22%2C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20success%3A%20function%20(response)%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20data%20%3D%20%24(%22%23divmsg%22).html()%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24(%22%23divmsg%22).html(data%20%2B%20%22%3Cbr%3EFriend%3A%22%20%2B%20response)%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20error%3A%20function%20(response)%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%205000)%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20function%20send()%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20message%20%3D%20%24(%22%23txtmsg%22).val()%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20friend%20%3D%20%24(%22%23ddlfriend%22).val()%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20data%20%3D%20%24(%22%23divmsg%22).html()%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24(%22%23divmsg%22).html(data%20%2B%20%22%3Cbr%3EMe%3A%22%20%2B%20message)%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24(%22%23txtmsg%22).val(%22%22)%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20debugger%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24.ajax(%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20%22POST%22%2C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contentType%3A%20%22application%2Fjson%3B%20charset%3Dutf-8%22%2C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20data%3A%20'%7B%22message%22%3A%22'%20%2B%20message%20%2B%20'%22%2C%22friend%22%3A%22'%2Bfriend%2B'%22%7D'%2C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20url%3A%20%22%40Url.Action(%22sendmsg%22)%22%2C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dataType%3A%20%22json%22%2C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20success%3A%20function%20(response)%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20data%20%3D%20%24(%22%23divmsg%22).html()%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24(%22%23divmsg%22).html(data%20%2B%20%22%3Cbr%3EMe%20%3A%22%20%2B%20message)%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20error%3A%20function%20(response)%20%7B%20%20%0A%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%0A%20%20%20%20%20%20%20%20%7D)%3B%20%20%0A%20%20%20%20%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&lt;script&gt;" title="&lt;script&gt;" />  
</head>  
<body>  
    
<nav class="nav navbar-default">  
        
<div class="navbar-brand">  
           <span style="float:right;">@Session["username"].ToString()</span>  
        </div>

  
    </nav>

  
    
  
    
<div class="clearfix"></div>

  
    @using (Html.BeginForm())  
    {  
        
<div class="container">
  
            
<div class="row">  
                 
            </div>

  
            
<div class="row">
  
                
<div class="col-md-4">
  
                    
<div class="form-group">  
                        <select id="ddlfriend" name="ddlfriend" class="form-control">  
  
                        </select>  
                    </div>

  
                    
<div class="form-group">  
                        <input type="text" name="txtmsg" id="txtmsg" class="form-control" />  
                    </div>

  
                    
<div class="form-group">  
                        <input type="button" value="send" class="btn btn-success" name="btnsend" id="btnsend" />  
                    </div>

  
                </div>

  
                
<div class="col-md-6">
  
                    
<div class="panel panel-success">
  
                        
<div class="panel-heading">
  
                            
<div class="panel-title">  
                                Messages  
                            </div>

  
                            
<div class="panel-footer" style="min-height:400px;">
  
                                
<div id="divmsg">  
                                </div>

  
                            </div>

  
                        </div>

  
                    </div>

  
                </div>

  
            </div>

  
        </div>

  
    }  
    
<div>  
   </div>

  
</body>  
</html>     

F5 را برای ساخت (Build) و اجرای (Run) پروژه بفشارید.

چت با RabbitmQ

چت با RabbitmQ


زهره سلطانیان

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.