Winfrom使用Socket双向通信 -- 聊天程序(客户端、服务端) -- 02

3 篇文章 0 订阅

使用Winfrom写一个聊天软件

前言

承接前一篇Winfrom使用Socket双向通信 – 聊天程序(客户端、服务端) – 01中第二钟方法.
这次增加登陆验证, 不过还没有连接数据库,如果连接数据库后将可以实现好友之间的聊天.

准备

增加登陆验证,主要是通过改变了服务器与客户端之间接收信息的方法,使用Json格式传输数据.使用了Newtonsoft.Json,需要再Nuget中安装.然后再增加一个固定格式的类:

SendData:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WebSocketServerTest
{
    /// <summary>
    /// 发送数据统一格式
    /// </summary>
    public class SendData
    {
        /// <summary>
        /// 用户昵称
        /// </summary>
        public string nickName { get; set; }
        /// <summary>
        /// 用户登录名
        /// </summary>
        public string account { get; set; }
        /// <summary>
        /// 用户密码
        /// </summary>
        public string pws { get; set; }
        /// <summary>
        /// 发送的信息内容
        /// </summary>
        public string msg { get; set; }
        /// <summary>
        /// 发送的类型,暂定loginVerify,sendMsg
        /// </summary>
        public string sendType { get; set; }
        /// <summary>
        /// 识别码
        /// </summary>
        public int code { get; set; }

        public SendData()
        {
        }

        public SendData(string nickName, string account, string pws, string msg, string sendType,int code = 0)
        {
            this.nickName = nickName;
            this.account = account;
            this.pws = pws;
            this.msg = msg;
            this.sendType = sendType;
            this.code = code;
        }

        public SendData(string nickName, string msg, string sendType,int code = 0)
        {
            this.nickName = nickName;
            this.msg = msg;
            this.sendType = sendType;
            this.code = code;
        }
    }
}

需要再服务端与客户端都增加.

服务端

服务端的界面没有改变,改变了接收信息的方法:

  				socket.OnMessage = message =>  //接收消息事件
                {
                    //处理接收到的字符串message
                    string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
                    this.Invoke(new MethodInvoker(delegate
                    {
                        //do something                                          
                        this.clientListBox.SelectedItem = clientUrl;
                        msgDispose(message);                        
                    }));
                    
                };

将处理信息的代码单独放在一个方法中:

        /// <summary>
        /// 处理接收到的消息
        /// </summary>
        /// <param name="msg">接收到客户端发送的字符串</param>
        private void msgDispose(string msg)
        {
            IWebSocketConnection web = dic_Sockets[this.clientListBox.SelectedItem.ToString()];
            SendData sendData = new SendData(); ;
            try
            {
                sendData = JsonConvert.DeserializeObject<SendData>(msg);
            }
            catch (Exception)
            {
                web.Send(JsonConvert.SerializeObject(new SendData(null, "Data Verify Filed!", "sendMsg")));
            }
            
            switch (sendData.sendType)
            {
                case "loginVerify":
                    web.Send(JsonConvert.SerializeObject(new SendData("Server", null, null, "进行了验证", "loginVerify", ("admin".Equals(sendData.account) && "admin".Equals(sendData.pws)) ? 0 : 1)));
                    break;
                case "sendMsg":
                    this.richTextBox1.Text += formatMessage(sendData.nickName, sendData.msg);
                    Speech("来自" + sendData.nickName + "的消息:" + sendData.msg);
                    break;
                default:
                    web.Send(JsonConvert.SerializeObject(new SendData(null, "Data Verify Filed!", "sendMsg")));
                    break;
            }
            
        }

客户端

客户端增加一个登陆框,两个文本框,一个登陆按钮.
在这里插入图片描述
改变客户端连接服务器的方式,默认打开程序会自动连接预设的服务器.在Client_Load中直接默认点击链接按钮.

btnConn_Click(sender, e);

更改接收消息处理事件:

        //当接收到消息时发生事件
        private void Ws_OnMessage(object sender, MessageEventArgs e)
        {
            this.Invoke(new MethodInvoker(delegate
            {
                msgDispose(e.Data);
            }));

        }
		/// <summary>
        /// 处理接收到的消息
        /// </summary>
        /// <param name="msg">接收到客户端发送的字符串</param>
        private void msgDispose(string msg)
        {
            SendData sendData = new SendData(); ;
            try
            {
                sendData = JsonConvert.DeserializeObject<SendData>(msg);
            }
            catch (Exception)
            {
                ws.Send(JsonConvert.SerializeObject(new SendData(null, "Data Verify Filed!", "sendMsg")));
            }

            switch (sendData.sendType)
            {
                case "loginVerify":
                    isLogin = sendData.code == 0;
                    this.panelLogin.BackColor = isLogin ? Color.Green : Color.Red;
                    this.msgBox.Text += formatMessage(sendData.nickName, sendData.code == 0 ? "Login Success!" : "Login Filed");
                    break;
                case "sendMsg":
                    this.msgBox.Text += formatMessage(sendData.nickName, sendData.msg);
                    //Speech("来自" + sendData.nickName + "的消息:" + sendData.msg);
                    break;
                default:
                    break;
            }

        }

登陆按钮绑定的方法:

		private void button1_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(this.texAccount.Text) )
            {
                this.labelAccountEro.Text = "用户名不能为空!";
                return;
            }
            if (string.IsNullOrEmpty(this.texPwd.Text))
            {
                this.labelPWDEro.Text = "用户名不能为空!";
                return;
            }
            this.labelAccountEro.Text = "";
            this.labelPWDEro.Text = "";
            string v = JsonConvert.SerializeObject(new SendData(null, this.texAccount.Text, this.texPwd.Text, "Login Verify", "loginVerify"));
            try
            {
                ws.Send(v);
            }
            catch (Exception ex)
            {
                this.msgBox.Text += formatMessage(this.texPCName.Text, "服务器连接错误,请查看弹窗信息。");
                MessageBox.Show("错误:\n" + ex.Message.ToString(),"提示");
            }
        }

至此已经完成.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WinForm服务端一般可以使用以下几种程序来实现: 1. ASP.NET:ASP.NET是一种用于创建Web应用程序开发框架,它可以运行在Windows平台上,并通过IIS(Internet Information Services)来提供服务。通过ASP.NET可以创建各种类型的Web应用程序,包括WinForm服务端。ASP.NET提供了许多功能强大的类和工具,可以方便地实现数据访问、用户认证等服务器端功能。 2. WCF(Windows Communication Foundation):WCF是微软提供的一种用于构建分布式应用程序开发框架,它可以在不同的进程、计算机之间进行通信。WCF提供了统一的编程模型,可以使用各种传输协议(如HTTP、TCP等)进行通信。在WinForm服务端开发中,可以使用WCF来实现与客户端的通信,提供各种服务。 3. Socket编程:Socket编程是一种基于网络的通信模型,通过Socket可以实现不同计算机之间的通信。在WinForm服务端开发中,可以使用Socket编程来实现客户端服务端之间的通信。Socket编程提供了底层的网络操作接口,可以实现灵活的网络应用程序。 4. Web API:Web API是一种用于构建HTTP服务的开发框架,它可以用于构建RESTful风格的Web服务。在WinForm服务端开发中,可以使用Web API来构建HTTP服务,提供各种功能。Web API提供了简单易用的编程模型,可以方便地处理HTTP请求和响应。 需要根据具体的需求和场景选择适合的程序来实现WinForm服务端。以上几种程序都有各自的特点和优势,可以根据实际情况进行选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值