前三篇写完了服务端和客户端百分之70的代码,接下来完成主界面的开发。
SignalR聊天系统的服务端以及数据库1https://blog.csdn.net/hyx1229/article/details/121258116?spm=1001.2014.3001.5501https://blog.csdn.net/hyx1229/article/details/121258116?spm=1001.2014.3001.5501SignalR聊天系统服务端的方法 2https://blog.csdn.net/hyx1229/article/details/121277634?spm=1001.2014.3001.5501https://blog.csdn.net/hyx1229/article/details/121277634?spm=1001.2014.3001.5501
一、登录成功后获取在线好友列表
获取在线好友列表是在我们登录成功之后,也就是进入聊天窗体的时候,我们可以在聊天窗体的加载事件中去执行向服务端获取好友列表的操作。
通过代码可以看到,我们把监听写在主动获取之前,这是为了防止我们先向服务端获取列表,却还未开启监听,那么我们将得不到数据。
private async void MainFrm_Load(object sender, EventArgs e)
{
//监听好友上线通知
ChatService.BuddysOnline(Bind);
//监听获取好友列表的结果
ChatService.ReceiveBuddyList(Bind);
//监听消息
ChatService.ReceiveMessage(ReceiveMsg);
//监听添加好友的结果,并重新获取在线的好友列表
ChatService.ReceiveAddBuddyResult(GetBuddyList);
//向服务端获取好友列表
GetBuddyList();
}
私有方法
/// <summary>
/// 向服务端获取好友列表
/// </summary>
private async void GetBuddyList()
{
await ChatService.Connection.InvokeAsync("GetBuddys", ChatService.UserId);
}
当我们监听获取到好友列表后我们需要给下拉框添加数据,绑定数据源。我们是冲静态类中的UserList集合中去获取的,因为在我们监听到数据以后,我们会将数据添加到这个集合中。
private void Bind()
{
cb_buddy.Items.Clear();
foreach (var item in ChatService.UsersList)
{
cb_buddy.Items.Add(item.NickName);
}
cb_buddy.SelectedIndex = 0;
}
二、发送消息给指定好友
我们必须要选择下拉框中的一个好友才能够发送消息,我们会从UserList中去获取当前选择了好友的昵称去找他对应的连接id,从而实现指定发信息给谁。
private void bt_Send_Click(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(cb_buddy.Text))
{
MessageBox.Show("请选择好友发送","提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
return;
}
tb_MsgInfo.AppendText($"\r\n{DateTime.Now}");
tb_MsgInfo.AppendText($"\r\n我:{tb_sendMsg.Text}");
ToUserMessageDto msg = new ToUserMessageDto()
{
Message = tb_sendMsg.Text,
ToConnectionId =ChatService.UsersList.
FirstOrDefault(n=>n.NickName==cb_buddy.Text).ConnectionId
};
ChatService.Connection.InvokeAsync("SendToUser", msg);
}
三、接收好友给自己发的消息
在load事件中我们已经开启了监听接收消息。
下面是监听到消息后的处理 ,不过这里有个缺陷的逻辑没写,当接收到消息后我默认是认为这是你当前选择的好友给你发的消息,并展示在文本域中了,有时间的话我会改一改。
private void ReceiveMsg(string msg,DateTime sendTime)
{
tb_MsgInfo.AppendText($"\r\n{sendTime.ToString()}");
tb_MsgInfo.AppendText($"\r\n{cb_buddy.Text}:{msg}");
}
然后这边切换好友的时候我把文本域的内容清空了,因为暂时我还没写聊天记录,比较忙所以就缺胳膊少腿了。
private void cb_buddy_SelectedIndexChanged(object sender, EventArgs e)
{
tb_MsgInfo.Clear();
}
四、添加好友
在load事件中,已经开启了监听添加好友的结果,下面代码是添加按钮的方法。我们需要输入好友的id。
private void bt_addbuddy_Click(object sender, EventArgs e)
{
var fid = long.Parse(tb_search.Text);
ChatService.Connection.InvokeAsync("AddBuddy",ChatService.UserId,fid);
}
主界面的全部代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ChatRommClient_WinFrom.Dtos;
using Microsoft.AspNetCore.SignalR.Client;
namespace ChatRommClient_WinFrom
{
public partial class MainFrm : Form
{
public MainFrm()
{
InitializeComponent();
}
private async void MainFrm_Load(object sender, EventArgs e)
{
//监听好友上线通知
ChatService.BuddysOnline(Bind);
//监听获取好友列表的结果
ChatService.ReceiveBuddyList(Bind);
//监听消息
ChatService.ReceiveMessage(ReceiveMsg);
//监听添加好友的结果
ChatService.ReceiveAddBuddyResult(GetBuddyList);
//向服务端获取好友列表
GetBuddyList();
}
/// <summary>
/// 切换好友
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cb_buddy_SelectedIndexChanged(object sender, EventArgs e)
{
tb_MsgInfo.Clear();
}
/// <summary>
/// 发送消息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void bt_Send_Click(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(cb_buddy.Text))
{
MessageBox.Show("请选择好友发送","提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
return;
}
tb_MsgInfo.AppendText($"\r\n{DateTime.Now}");
tb_MsgInfo.AppendText($"\r\n我:{tb_sendMsg.Text}");
ToUserMessageDto msg = new ToUserMessageDto()
{
Message = tb_sendMsg.Text,
ToConnectionId =ChatService.UsersList.
FirstOrDefault(n=>n.NickName==cb_buddy.Text).ConnectionId
};
ChatService.Connection.InvokeAsync("SendToUser", msg);
}
/// <summary>
/// 退出程序
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MainFrm_FormClosed(object sender, FormClosedEventArgs e)
{
ChatService.Connection.StopAsync();
Application.Exit();
}
/// <summary>
/// 添加好友
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void bt_addbuddy_Click(object sender, EventArgs e)
{
var fid = long.Parse(tb_search.Text);
ChatService.Connection.InvokeAsync("AddBuddy",ChatService.UserId,fid);
}
#region 私有方法
private void Bind()
{
cb_buddy.Items.Clear();
foreach (var item in ChatService.UsersList)
{
cb_buddy.Items.Add(item.NickName);
}
cb_buddy.SelectedIndex = 0;
}
private void ReceiveMsg(string msg,DateTime sendTime)
{
tb_MsgInfo.AppendText($"\r\n{sendTime.ToString()}");
tb_MsgInfo.AppendText($"\r\n{cb_buddy.Text}:{msg}");
}
/// <summary>
/// 向服务端获取好友列表
/// </summary>
private async void GetBuddyList()
{
await ChatService.Connection.InvokeAsync("GetBuddys", ChatService.UserId);
}
#endregion
}
}
最后附上效果图:
还有很多地方不够完善,大家有兴趣的可以自己完善,有时间的话我也会更新的。
源码地址:https://download.csdn.net/download/hyx1229/42548815
需要免费源码的可以加.net core学习交流群:831181779,在群里@群主即可