登陸窗口如下:

本文首先來實現“注冊新賬號功能”
第一步:
打開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框架幫我們完成的)

RCUsers類是由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");
}
}
效果圖如下:


現在主頁面上就能夠看到新注冊的用戶了
