登陸窗口如下:
本文首先來實現“注冊新賬號功能”
第一步:
打開VS2010 ,找到BasicForm窗體類,這個類是美化窗體的一個基類,我們可以從此窗體繼承
第二步,創建新窗體
RegisterUser.cs
把新窗體RegisterUser繼承的Form類改成BasicForm類
如下圖:
現在新窗體就可以使用BasicForm的樣式了,效果如下:
拖入控件,界面如下:
第三步:
先來回顧一下,在數據庫中相應的表:
我們知道使用TCP通信的時候,客戶端與服務器端進行交互,並不與數據庫直接交互,而是由客戶端與服務器通信,服務器再和數據庫通信。
所以,注冊用戶的流程就是
(1):客戶端注冊頁面中,通過TCP通信,把用戶想要注冊“用戶ID”,“昵稱”,“密碼”發送給服務器。
(2) :服務器對發來的”用戶ID“進行驗證,與數據庫交互,判斷此”用戶ID“是否已經存在,存在則發返回信息給”客戶端“,告知其”用戶已經存在。
如果“用戶ID”符合要求,則插入數據庫相關表中,返回消息給“客戶端”,告知其注冊已經成功
(3):“用戶ID”,“昵稱”,“密碼”需要一個類來存放,我們這裡直接使用RcUsers數據表對應的實體類:RcUsers, 此類支持Protobuf.net序列化
(通過TCP通信,在客戶端與服務器之間傳遞數據類,必須把類序列化成二進制數據,對方收到後,再反序列化出來,我們使用網上開源的protobuf.net序列化器。
當然序列化,反序列化的工作是由 開源的networkcomms2.3.1框架幫我們完成的)
using System; using System.Collections; using System.Collections.Generic; using System.Data; using ProtoBuf; using SimpleIM.Data; namespace SimpleIM.Business { [ProtoContract] public class RcUsers { #region Constructors public RcUsers() { } #endregion #region Private Properties private int id = -1; private string userID = string.Empty; private string name = string.Empty; private string password = string.Empty; private string declaring = string.Empty; private int status = -1; private int groupID = -1; private bool isMale = false; private int userLevel = -1; private bool enabled = false; private DateTime registerTime = DateTime.UtcNow; private DateTime lastLoginTime = DateTime.UtcNow; #endregion #region Public Properties [ProtoMember(1)] public int Id { get { return id; } set { id = value; } } [ProtoMember(2)] public string UserID { get { return userID; } set { userID = value; } } [ProtoMember(3)] public string Name { get { return name; } set { name = value; } } [ProtoMember(4)] public string Password { get { return password; } set { password = value; } } [ProtoMember(5)] public string Declaring { get { return declaring; } set { declaring = value; } } [ProtoMember(6)] public int Status { get { return status; } set { status = value; } } [ProtoMember(7)] public int GroupID { get { return groupID; } set { groupID = value; } } [ProtoMember(8)] public bool IsMale { get { return isMale; } set { isMale = value; } } [ProtoMember(9)] public int UserLevel { get { return userLevel; } set { userLevel = value; } } [ProtoMember(10)] public bool Enabled { get { return enabled; } set { enabled = value; } } [ProtoMember(11)] public DateTime RegisterTime { get { return registerTime; } set { registerTime = value; } } [ProtoMember(12)] public DateTime LastLoginTime { get { return lastLoginTime; } set { lastLoginTime = value; } } #endregion } } RcUsers類 View CodeRCUsers類是由CodeSmith模板生成的, 可以參見本博客關於CodeSmith的其他相應文章
NetworkComms網絡通信框架配套CodeSmith模板使用簡介 模板下載地址: 【模板下載】分享我所使用的數據庫框架
我們在微風IM中,使用的存儲過程,數據層代碼,實體類,邏輯層代碼都是通過使用CodeSmith模板生成的(添加功能,需要做對應的修改),極大的提高了工作效率。
言歸正傳,我們開始進行注冊相關的開發:
客戶端代碼:
//定義一個契約類 用於傳遞相關的信息給服務器 RcUsers currentUser = new RcUsers(); //給屬性賦值 currentUser.UserID = txtUserID.Text.Trim(); currentUser.Password = txtPsw.Text.Trim(); currentUser.Name = txtNickName.Text.Trim(); //同步方法 傳遞並序列化契約類到服務器,並從獲取獲取返回的信息 (返回的信息類型為ResMessage) //RegUser 發送的消息類型 //ResRegUser 接收返回的消息類型 ResMessage regContract = Common.TcpConn.SendReceiveObject<ResMessage>("RegUser", "ResRegUser", 8000, currentUser); if (regContract.Message == "注冊成功") { BasicMsgBoxForm form = new BasicMsgBoxForm("注冊成功", "信息窗口", MessageBoxButtons.OK, MessageBoxIcon.None); form.StartPosition = FormStartPosition.CenterScreen; form.ShowDialog(); txtNickName.Text = ""; txtUserID.Text = ""; txtPsw.Text = ""; txtRePsw.Text = ""; } else { BasicMsgBoxForm form = new BasicMsgBoxForm(regContract.Message, "信息窗口", MessageBoxButtons.OK, MessageBoxIcon.Error); form.StartPosition = FormStartPosition.CenterScreen; form.ShowDialog(); }
using System; using System.Collections.Generic; using System.Text; using ProtoBuf; namespace SimpleIM.Business { //操作結果的返回信息,可通用 [ProtoContract] public class ResMessage { [ProtoMember(1)] public string Message; public ResMessage() { } public ResMessage(string message) { this.Message = message; } } }
服務器端相應的代碼:
//注冊新用戶 NetworkComms.AppendGlobalIncomingPacketHandler<RcUsers>("RegUser", IncomingRegisterUser);
//注冊新用戶 private void IncomingRegisterUser(PacketHeader header, Connection connection, RcUsers contract) { try { //聲明一個契約類 用於返回數據給客戶端 ResMessage resMessage = new ResMessage(); //判斷用戶是否存在 RcUsers user = DoRcUsers.GetByUserID(contract.UserID); if (user .Id>-1) { //如果存在,在不進行數據庫操作,直接返回信息給客戶端 resMessage.Message = "用戶ID已經存在"; } else { //如果不存在,則添加用戶到數據庫中
//修改一下用戶的相關信息,暫時手工設定一下,您可根據情況修改
contract.Declaring = "春暖花開"; contract.Status = -1; contract.IsMale = true; contract.UserLevel = 1; contract.Enabled = false; contract.RegisterTime = DateTime.Now; contract.LastLoginTime = DateTime.Now;
//此處 為了簡便 指定了一個組 contract.GroupID = 115; //添加用戶到數據庫中 DoRcUsers.Save(contract); resMessage.Message = "注冊成功"; } //返回信息給客戶端端 connection.SendObject("ResRegUser", resMessage); } catch (Exception ex) { LogTools.LogException(ex, "IncomingChangePsw"); } }
效果圖如下:
現在主頁面上就能夠看到新注冊的用戶了