前言
承接前一篇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(),"提示");
}
}
至此已经完成.