[C#]SignalR实现扫码登录(B/S,C/S)(三)——客户端搭建(WinForm版)

4 篇文章 1 订阅
4 篇文章 0 订阅

目录

一、创建项目

二、安装Package

三、完成登录界面

3.1创建登陆界面

3.2验证结果

四、相关文章


直入主题

一、创建项目

在之前服务端的解决方案中新增一个WinForm项目 WinLogin

二、安装Package

使用Nuget安装以下Package

Microsoft.AspNet.SignalR.Client

 

以上包有依赖项(贴心的Nuget帮咱把Json都引用好了),需要全部引入,引用完成后的packages.config文件如下:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.AspNet.SignalR.Client" version="2.4.1" targetFramework="net452" />
  <package id="Newtonsoft.Json" version="6.0.4" targetFramework="net452" />
</packages>

三、完成登录界面

3.1创建登陆界面

在项目中新增一个WinForm页面 Login.cs

拖两个label两个textbox控件进来,长这个样子

来写后台代码,如果你看过Web版客户端实现的方法,这里也差不多。但是WinForm控件赋值时有个跨线程安全的验证。我没能很好的解决,如果您有更好的办法,请在评论区告诉我,谢谢!

那就直接贴代码了:

using Microsoft.AspNet.SignalR.Client;
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;

namespace WinLogin
{
    public partial class Login : Form
    {
        HubConnection connection;
        IHubProxy hub;
        string url = "http://localhost:9999";
        //Safe
        //private delegate void SafeCallDelegate(TextBox textBoxControl, string text);

        public Login()
        {
            InitializeComponent();
        }

        private void Login_Load(object sender, EventArgs e)
        {
            //控件跨线程安全验证设置为false,不然无法对控件进行赋值。
            //微软官方说明 https://docs.microsoft.com/zh-cn/dotnet/desktop/winforms/controls/how-to-make-thread-safe-calls-to-windows-forms-controls?f1url=%3FappId%3DDev14IDEF1%26l%3DZH-CN%26k%3Dk(EHInvalidOperation.WinForms.IllegalCrossThreadCall);k(TargetFrameworkMoniker-.NETFramework,Version%253Dv4.5.2);k(DevLang-csharp)%26rd%3Dtrue&view=netframeworkdesktop-4.8
            //我尝试用安全的方式去对控件进行赋值,但是失败了。所有注释为Safe的代码都是微软建议的写法,但是没有成功
            //如果您有更好的方式,请在评论区告诉我,谢谢!
            Control.CheckForIllegalCrossThreadCalls = false;

            connection = new HubConnection(url);
            //类名必须与服务端一致
            hub = connection.CreateHubProxy("MyHub");

            //方法名必须与服务端一致
            hub.On<string>("GetUUID", getUUID);

            hub.On<string>("GetUserInfo", getUserInfo);

            connection.Start().Wait();

            hub.Invoke("Register").Wait();
        }

        private void getUUID(string message)
        {
            this.txtUUID.Text = message;
            //Safe
            //WriteTextSafe(txtUUID, message);
        }
        private void getUserInfo(string message)
        {
            this.txtUserInfo.Text = message;
            //Safe
            //WriteTextSafe(txtUserInfo, message);
        }

        //Safe
        //private void WriteTextSafe(TextBox textBoxControl, string text)
        //{
        //    if (textBoxControl.InvokeRequired)
        //    {
        //        var d = new SafeCallDelegate(WriteTextSafe);
        //        textBoxControl.Invoke(d, new object[] { text });
        //    }
        //    else
        //    {
        //        textBoxControl.Text = text;
        //    }
        //}
    }
}

这样就可以了!

3.2验证结果

因为我们把代码写在了同一个解决方案中,就没法同时调试了。

我们进入服务端项目的生成目录中ScanQRCodeToLogin\SignalRService\bin\Debug 直接启动SignalRService.exe

然后将 WinLogin设置为启动项目

启动项目 进入LoginForm,进入后注册成功,获取到UUID

这时我们新开Web窗口,调用服务端扫码登陆的API模拟扫码登陆成功

可以看到我们登陆成功的同时,客户端收到了用户的登陆信息

好的,鼓掌,我们C/S版的扫码登陆就完成了

如果你想把它应用到你的项目中,你还需要把UUID在客户组转变成一个真正的二维码,用APP去读取二维码中的UUID,然后去调用 服务端登陆成功的接口

四、相关文章

[C#]SignalR实现扫码登录(B/S,C/S)

[C#]SignalR实现扫码登录(B/S,C/S)(一)——服务端搭建

[C#]SignalR实现扫码登录(B/S,C/S)(二)——客户端搭建(Web版)

[C#]SignalR实现扫码登录(B/S,C/S)(三)——客户端搭建(WinForm版)

[C#]SignalR实现扫码登录(B/S,C/S)源码

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 C# C/S 登录界面代码,你可以参考一下: 客户: ```csharp using System; using System.Net.Sockets; using System.Text; using System.Windows.Forms; namespace Client { public partial class LoginForm : Form { private TcpClient client; private NetworkStream stream; public LoginForm() { InitializeComponent(); } private void btnLogin_Click(object sender, EventArgs e) { try { client = new TcpClient(); client.Connect("127.0.0.1", 8888); // 连接服务器 stream = client.GetStream(); string username = txtUsername.Text.Trim(); string password = txtPassword.Text.Trim(); string loginInfo = "login " + username + " " + password; byte[] buffer = Encoding.UTF8.GetBytes(loginInfo); stream.Write(buffer, 0, buffer.Length); buffer = new byte[1024]; int len = stream.Read(buffer, 0, buffer.Length); string result = Encoding.UTF8.GetString(buffer, 0, len); if (result == "success") { MessageBox.Show("登录成功"); } else { MessageBox.Show("用户名或密码错误"); } } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { stream?.Close(); client?.Close(); } } } } ``` 服务器: ```csharp using System; using System.Net; using System.Net.Sockets; using System.Text; namespace Server { class Program { static void Main(string[] args) { TcpListener listener = new TcpListener(IPAddress.Any, 8888); listener.Start(); Console.WriteLine("服务器已启动"); while (true) { TcpClient client = listener.AcceptTcpClient(); Console.WriteLine("客户已连接"); NetworkStream stream = client.GetStream(); byte[] buffer = new byte[1024]; int len = stream.Read(buffer, 0, buffer.Length); string loginInfo = Encoding.UTF8.GetString(buffer, 0, len); string[] info = loginInfo.Split(' '); string username = info[1]; string password = info[2]; if (username == "admin" && password == "123456") { buffer = Encoding.UTF8.GetBytes("success"); stream.Write(buffer, 0, buffer.Length); } else { buffer = Encoding.UTF8.GetBytes("fail"); stream.Write(buffer, 0, buffer.Length); } stream.Close(); client.Close(); } } } } ``` 注:为了简化代码,此示例中没有进行任何的安全验证,请勿在实际项目中使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值