使用.net和jquery实现一对一的网页聊天系统

一、首先介绍一下网页聊天系统的设计思路:

1)用户1和用户2进行网页聊天,我们将聊天数据存入数据库中,数据库的设计如下:

其中ID为一条聊天记录的id,YHID1为发送方,YHID2为接收方,XXSJ为消息时间,XXNR为消息内容,COLOR为字体颜色,SIZE为字体大小,SFJS为标记消息是否已被接收。

2)两人聊天,自己为发送方,对方为接收方。当用户进入聊天窗口时,从数据库中查询以时间为顺序的前10条数据(YHID1或者YHID2为自己的ID的数据);当发送方发出消息时,将该消息插入数据库,同时从数据库查询以时间为顺序的前10条数据。

3)消息记录页面为了采用ajax页面无刷新更新数据。

二、然后介绍如何控制数据的收发:

 

 

接收消息函数:

function receiveMessage() {
            $.ajax({
                url: "services/WebService.asmx/ReceiveMess",
                type: 'post',
                contentType: "application/json;charset=utf-8",
                dataType: 'json',
                data:"{YHID:"+$('#H_YHID1').val()+",TOP:"+'10'+"}",
                async: true,
                success: function (response) {
                    $('#chat_info').html(response.d);
                },
                
            });
        }
 

发送消息函数:

<strong><span style="font-size:14px;">function sendMessage() {
            clearInterval(receiveMessage);
            var mess = $('#message').val();
            var f_size = $('#ztdx').find("option:selected").text();
            var f_color = $('#ztys').find("option:selected").text();
            if (mess.trim() == "") { alert("请输入消息内容"); }
            else {
                 $('#btn_send').val("请稍等");
                   $.ajax({
                    url: "services/WebService.asmx/SendMess",
                    type: 'post',
                    contentType: "application/json;charset=utf-8",
                    dataType: 'json',
                    data: "{mess:'" + mess + "',size:" + f_size+",color:'"+f_color+"'}",
                    async: true,
                    success: function (response) {
                        if (response.d == "SendOk") {
                            $('#message').val("");
                            $('#btn_send').val("发送");
                            $('#btn_send').button();
                        }
                    },
                   
                });</span>
               <span style="font-size:14px;"> setInterval(receiveMessage,1000);
            }
        }</span></strong>
<strong><span style="font-size:14px;"></span></strong> 

在document.ready函数中执行以下函数:

$(function(){

      ///接收消息
     receiveMessage();
     setInterval(receiveMessage, 1000);//每秒刷新
     ///发送消息

      $('#btn_send').click(function () {
                sendMessage();
            });

})

在后台的WebService.asmx函数中有两个方法,用来响应ajax执行后台动作,读取/写入数据库信息

发送消息:

public string SendMess(string mess,int size,string color)
        {
           
            Model.T_JSTX model = new Model.T_JSTX();//消息对象实例化
            model.YHID1 = Session["YHID1"].ToString();//发送方
            model.YHID2 = Session["YHID2"].ToString();//接收方
            model.XXNR = mess;//消息
            model.XXSJ = DateTime.Now;//事件
            model.SFJS = false;//初始设置为未接收
            model.SIZE = size;//字体大小
            model.COLOR = color;//字体颜色
            BLL.B_JSTX bll = new BLL.B_JSTX();
            if (bll.Add(model))
            {
                return "SendOk";
            }
            else
            {
                return "SendError";
            }


        }

接收消息:

public string ReceiveMess(string YHID,string TOP)
        {
           
            BLL.B_JSTX bll = new BLL.B_JSTX();
            DataSet ds = bll.Get(YHID, Convert.ToInt32(TOP));//获取前TOP条数据
            List<Model.T_JSTX> list = new List<Model.T_JSTX>();
            string YHID1=Session["YHID1"].ToString();//用戶ID
            for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
            {
                Model.T_JSTX model=new Model.T_JSTX();
                int ID = (int)ds.Tables[0].Rows[i]["ID"];
                model.YHID1 =(string) ds.Tables[0].Rows[i]["YHID1"];
                model.YHID2 = (string)ds.Tables[0].Rows[i]["YHID2"];
                model.XXNR = (string)ds.Tables[0].Rows[i]["XXNR"];
                model.XXSJ = (DateTime)ds.Tables[0].Rows[i]["XXSJ"];
                model.SIZE = (int)ds.Tables[0].Rows[i]["SIZE"];
                model.COLOR = (string)ds.Tables[0].Rows[i]["COLOR"];
                list.Add(model);
                if (YHID1 == model.YHID2.Trim())//如果用戶是接收方
                {
                    bll.UpdataSFJS(ID);//写回,设置是否接收为True
                }
           
            }
            StringBuilder sb = new StringBuilder();

//下面的for语句是用来匹配字符实现表情显示的
            for (int i = 0; i < list.Count; i++)
            {
                Regex reg = new Regex(@"\[.*?\]", RegexOptions.IgnoreCase);

                MatchCollection regs = reg.Matches(list[i].XXNR);
                if (regs.Count!=0)
                {
                    foreach (Match match in regs)
                    {
                        for (int j = 0; j < str.Length; j++)
                        {
                            if ("["+str[j]+"]" == match.Value) {
                                list[i].XXNR = list[i].XXNR.Replace(match.Value, "<img src='images/mr/"+j+".gif'" + "/>");
                            }

                        }
                           
                    }

                }
               //通过判断接收方还是发送方显示不同的颜色
                if (list[i].YHID1.Trim() == Session["YHID1"].Tostring())
                {
                    sb.Insert(0, "<div><div style='color:blue'>"+ list[i].YHID1 + "对" + list[i].YHID2 + "说:" + list[i].XXSJ + "</div><div style='word-wrap:break-word;word-break:break-all;color:"+list[i].COLOR+";font-size:"+list[i].SIZE+"pt'>" + list[i].XXNR + "</div></div>");
                }
                else
                {
                    sb.Insert(0, "<div><div style='color:green'>" + list[i].YHID1 + "对" + list[i].YHID2 + "说:" + list[i].XXSJ + "</div><div style='word-wrap:break-word;word-break:break-all;color:" + list[i].COLOR + ";font-size:"+list[i].SIZE+"pt'>" + list[i].XXNR + "</div></div>");
                }


                   
            }
           
            return sb.ToString();

        }
    }

这里只提供了一个大体的思路和不太清晰的代码,代码是从我在项目中直接拷贝出来的,没有经过修改,直接拷贝的话是不能用的。

这样的数据库设计存在一个很大的弊端:当数据量过大时,查询的速度会明显变慢,导致用户体验过差。

如果你有更好的设计思路,请不吝赐教!

 


 
 


 

 

 

 

 

在 ASP.NET MVC 中使用 SignalR 实现一对一聊天需要以下步骤: 1. 创建一个名为 ChatHub 的 SignalR Hub 类,并在其中定义需要推送的消息方法。 ```csharp using Microsoft.AspNetCore.SignalR; using System.Threading.Tasks; namespace MvcSignalR.Hubs { public class ChatHub : Hub { public async Task SendMessage(string user, string message) { await Clients.User(user).SendAsync("ReceiveMessage", message); } } } ``` 2. 在 Startup.cs 中配置 SignalR 中间件,并启用身份验证。 ```csharp using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Authentication; using Microsoft.AspNetCore.SignalR; using Microsoft.Extensions.DependencyInjection; using MvcSignalR.Hubs; using System.Security.Claims; namespace MvcSignalR { public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddSignalR(); services.AddAuthentication(options => { options.DefaultScheme = "Cookies"; options.DefaultChallengeScheme = "oidc"; }) .AddCookie("Cookies") .AddOpenIdConnect("oidc", options => { options.Authority = "https://demo.identityserver.io/"; options.ClientId = "interactive.confidential"; options.ClientSecret = "secret"; options.ResponseType = "code"; options.SaveTokens = true; options.GetClaimsFromUserInfoEndpoint = true; }); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseStaticFiles(); app.UseAuthentication(); app.UseSignalR(routes => { routes.MapHub<ChatHub>("/chathub"); }); app.UseMvcWithDefaultRoute(); } } } ``` 在这个示例中,我们使用 IdentityServer 作为身份验证提供程序。当用户登录后,我们将使用 SignalR 的 User 方法将消息推送到特定的用户。 3. 在客户端 JavaScript 中引用 SignalR 库,并连接到 SignalR Hub。 ```javascript <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <script src="/lib/signalr/dist/browser/signalr.js"></script> <script> var connection = new signalR.HubConnectionBuilder().withUrl("/chathub").build(); connection.start().then(function () { console.log("connected"); }).catch(function (err) { return console.error(err.toString()); }); $("#sendButton").click(function () { var user = $("#userInput").val(); var message = $("#messageInput").val(); connection.invoke("SendMessage", user, message).catch(function (err) { return console.error(err.toString()); }); }); connection.on("ReceiveMessage", function (message) { console.log(message); }); </script> ``` 在这个示例中,我们使用 jQuery 获取用户输入的用户名和消息,并将它们传递给 SignalR Hub 的 SendMessage 方法。 4. 在服务器端调用 SendMessage 方法以向特定的用户发送消息。我们将使用 HttpContext.User.Identity.Name 获取当前用户的用户名。 ```csharp public class HomeController : Controller { private readonly IHubContext<ChatHub> _chatHub; public HomeController(IHubContext<ChatHub> chatHub) { _chatHub = chatHub; } [Authorize] public IActionResult Index() { return View(); } [HttpPost] [Authorize] public async Task<IActionResult> SendMessage(string message) { var user = HttpContext.User.Identity.Name; await _chatHub.Clients.User(user).SendAsync("ReceiveMessage", message); return Ok(); } } ``` 在这个示例中,我们使用 IHubContext 获取 ChatHub 的实例,并使用 Clients.User 方法将消息推送到特定的用户。 以上就是在 ASP.NET MVC 中使用 SignalR 实现一对一聊天的基本步骤。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值