چت با RabbitmQ ، در این مقاله، نحوه ی توسعه ی یک برنامه ی چت با RabbitmQ به زبان سی شارپ و ASP.NET MVC خواهید آموخت. نخست، نیاز است RabbitMQ و OTP را دانلود کنید.
اگر بخش قبلی مطلب ما را نخوانده اید همواره میتوانید آن را در لینک های زیر بخوانید.
مرحله ۱: چت با RabbitmQ
http://www.rabbitmq.com/download.html
مرحله ۲: OTP
http://www.erlang.org/downloads
یک پروژه ی MVC جدید ایجاد کنید.
مرحله ۳: ویژوال استودیو را باز کنید
به منوی File رفته و New Project->Web application->MVC را انتخاب کنید.
از قسمت New Project، ASP.NET Web Application را انتخاب و OK را کلیک کنید.
MVC را انتخاب و OK را کلیک کنید.
در ویژوال استودیو، ساختار پوشه همانطور که در تصویر آمده برای برنامه ی چت در پنجره ی Solution Explorer نشان داده میشود. آموزش MVC
بر روی Project کلیک راست کرده و “Manage NuGet Packages..” را انتخاب کنید.
Rabbitmq را جستجو کرده و پکیج rabbitmq.client را نصب کنید.
افزودن HomeController جدید.
بر روی پوشه ی Controllers کلیک راست کرده، Add >> Controller را کلیک کنید.
هنگامیکه کاربر کنترل کننده را انتخاب کرد، کادر محاوره ای “Add Scaffold” باز میشود.
MVC 5 Controller – Empty را انتخاب و دکمه ی “Add” را کلیک کنید.
چت با RabbitmQ
یک نام (HomeController) به Controller داده و “Add” را کلیک کنید.
هنگامیکه کاربر بر روی دکمه ی Add کلیک میکند، Workspace (فضای کاری) برای نوشتن کد باز خواهد شد.
کد زیر را در 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))
رشته ی اتصال را در فایل web.config در ASP.NET درج کنید.
یک User Model در پوشه ی Models ایجاد کنید. بر روی پوشه ی Models کلیک راست <- Add را کلیک <- Class را انتخاب کنید.
کد زیر را در 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 را انتخاب کنید.
کد زیر را در 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 &amp;gt; 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&amp;lt;UserModel&amp;gt; users = dl.getusers(id); List&amp;lt;ListItem&amp;gt; userlist = new List&amp;lt;ListItem&amp;gt;(); 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 را انتخاب کنید.
کد زیر را در 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 کلیک راست کنید.
به Index نام بدهید.
کد زیر را در View کپی کنید.
@using System.Web.Optimization @{ Layout = null; } &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta name="viewport" content="width=device-width" /&amp;gt; &amp;lt;title&amp;gt;Index&amp;lt;/title&amp;gt; @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/bootstrap") &amp;lt;script type="text/javascript"&amp;gt; $(document).ready(function () { $("#btnsend").click(function () { send(); }); getmyfriends(); function getmyfriends() { $.ajax({ type: "POST", url: "@Url.Action("friendlist")", contentType: "application/json; charset=utf-8", data: '{}', dataType: "json", success: function (r) { var ddlfrined = $("[id*=ddlfriend]"); // ddlfrined.empty().append('&amp;lt;option selected="selected" value="0"&amp;gt;select&amp;lt;/option&amp;gt;'); for (var i = 0; i &amp;lt;r.length; i++) { ddlfrined.append($("&amp;lt;option&amp;gt;&amp;lt;/option&amp;gt;").val(r[i].Value).html(r[i].Text)); } }, error: function (r) { alert("error"); } }); } setInterval(function () { $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", data: '{}', url: "@Url.Action("receive")", dataType: "json", success: function (response) { var data = $("#divmsg").html(); $("#divmsg").html(data + "&amp;lt;br&amp;gt;Friend:" + response); }, error: function (response) { } }); }, ۵۰۰۰); function send() { var message = $("#txtmsg").val(); var friend = $("#ddlfriend").val(); var data = $("#divmsg").html(); $("#divmsg").html(data + "&amp;lt;br&amp;gt;Me:" + message); $("#txtmsg").val(""); debugger; $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", data: '{"message":"' + message + '","friend":"'+friend+'"}', url: "@Url.Action("sendmsg")", dataType: "json", success: function (response) { var data = $("#divmsg").html(); $("#divmsg").html(data + "&amp;lt;br&amp;gt;Me :" + message); }, error: function (response) { } }); } }); &amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;nav class="nav navbar-default"&amp;gt; &amp;lt;div class="navbar-brand"&amp;gt; &amp;lt;span style="float:right;"&amp;gt;@Session["username"].ToString()&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/nav&amp;gt; &amp;lt;br /&amp;gt; &amp;lt;div class="clearfix"&amp;gt;&amp;lt;/div&amp;gt; @using (Html.BeginForm()) { &amp;lt;div class="container"&amp;gt; &amp;lt;div class="row"&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class="row"&amp;gt; &amp;lt;div class="col-md-4"&amp;gt; &amp;lt;div class="form-group"&amp;gt; &amp;lt;select id="ddlfriend" name="ddlfriend" class="form-control"&amp;gt; &amp;lt;/select&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class="form-group"&amp;gt; &amp;lt;input type="text" name="txtmsg" id="txtmsg" class="form-control" /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class="form-group"&amp;gt; &amp;lt;input type="button" value="send" class="btn btn-success" name="btnsend" id="btnsend" /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class="col-md-6"&amp;gt; &amp;lt;div class="panel panel-success"&amp;gt; &amp;lt;div class="panel-heading"&amp;gt; &amp;lt;div class="panel-title"&amp;gt; Messages &amp;lt;/div&amp;gt; &amp;lt;div class="panel-footer" style="min-height:400px;"&amp;gt; &amp;lt;div id="divmsg"&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; } &amp;lt;div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt;
F5 را برای ساخت (Build) و اجرای (Run) پروژه بفشارید.
هیچ دیدگاهی نوشته نشده است.