網絡編程之即時通信程序(聊天室)------(三)客戶端登錄


    上一節我們講了即時通信程序的服務端的搭建,今天我們來實現客戶端的登錄。

就像我們qq登錄一樣都需要一個唯一的qq號,當然qq號是長久使用的,而我們的這個即時通信程序只是臨時的聊天使用,為了區別不同的用戶,我們需要用戶在使用該程序時注冊一個用戶名,然后要向固定的IP+端口發送請求,連接服務器。先上個圖,然后再開始講解!

 

 

上邊已經說了,在登錄的時候都需要用戶起一個用戶名,這個用戶名用戶當然可以隨意起,然后登錄,連接服務器,這個時候需要服務器注意的是用戶名重名的問題,我們還記得我們在搭建服務器端的時候建立了一個Dictionary<string,Socket>字典onlineListServer來保存負責和客戶端通信的套接字,也就是Dictionary的鍵也是唯一的,所以這個用戶名必須是唯一的,用戶是隨機輸入的,當然可能有重名的問題,如果有重名,這個時候我們需要在服務端和登錄端做雙重的處理,在服務端,上一節我們已經講了,在用戶連接成功之后先判斷onlineListServer字典中是否存在與用戶名相同的鍵,如果存在則將用戶名+"1",並將與之負責的通信套接字加入該字典中,並向登錄端發送一個消息告訴登錄端,該用戶名已存在,要用戶端做好重名處理,用戶端接受服務端發送的消息,根據消息內容的不同做不同的處理,如果重名,則和客戶端一樣將用戶名+“1”,如果不重名,則直接登錄成功,進行客戶端主界面。

下面我會通過具體的代碼跟大家慢慢的解釋。

首先創建一個Form窗體,命名為ClientLogin,界面布局如上,主要控件如下:

三個文本框,分別為txtIP,txtPort,txtName,分別代表請求服務端IP和端口,登錄 用戶名

兩個按鈕,分別為btndl,btnqx分別表示登錄和取消。

因為我們需要記錄登錄名,然后根據不同的登錄名來進行區別不同的用戶,同時每一個登錄名對應一個相應的TCPClient對象來連接、監聽客戶端並且和其他對象進行通信。所以我們需要為該ClientLogin添加額外的屬性分別是string類型的LoginName和TcpClient類型的TCPClient,分別表示用戶登錄名和負責連接通信的TCPClient實例。

代碼如下:

在 public partial class ClientLogin : Form

    {}中添加屬性: 

 public string LoginName//登錄名
        {
            get;
            set;
        }
        public TcpClient TCPClient//連接通信實例
        {
            get;
            set;
        }

 

   在btndl按鈕的Click事件的處理函數中寫下如下代碼

private void btndl_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(txtIP.Text.ToString()))//判斷IP是否為空,請求、監聽服務端IP
            {
                if (!string.IsNullOrEmpty(txtName.Text.Trim()))//判斷用戶名是否為空,請求服務端固定端口
                {
                    this.LoginName = txtName.Text;
                    try
                    {
                        this.TCPClient = new TcpClient();//示例化ClientLogin.TCPClient屬性
                        this.TCPClient.Connect(IPAddress.Parse(txtIP.Text), Convert.ToInt32(txtPort.Text));//連接服務器
                        netStream = TCPClient.GetStream();示例化
                        byte[] buffer = Encoding.Default.GetBytes("ON|" + LoginName + "|");
                        netStream.Write(buffer,0,buffer.Length);//向服務器發送登錄者名,並等待服務端的驗證
                        Thread.Sleep(100);
                    byte[] buffer1=new byte[1];
                    netStream.Read(buffer1, 0, 1);//獲取服務端回發的驗證消息
                    string i = Encoding.Default.GetString(buffer1);//根據不同的消息做不同的處理
                    if (i=="1")//如果為“1”則表示用戶名重名,需做重名處理
                    {
                        this.LoginName += "1";
                    }
                        this.DialogResult = DialogResult.OK;
                           this.Close();
                    }
                    catch (Exception e1)
                    {
                        MessageBox.Show("連接異常:" + e1.Message);
                    }
                }
                else
                {
                    MessageBox.Show("請輸入登陸昵稱!");
                }
            }
            else
            {
                MessageBox.Show("請確保輸入一個有效的IP地址!");
            }
        }

  在取消按鈕中做如下處理:

private void btntc_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.No;
            this.Close();
        }

   這個時候關於即時通信程序的登錄端已經做好了,但是現在請大家考慮這樣的一個問題,我們的登錄界面只是起一個登錄連接的作用,在登錄成功以后我們直接就進入了聊天界面,這個登錄界面就沒有任何意義了,如何把該登錄界面給消除了,有人會說直接this.IsVisialbe=fales,隱藏不得了,但是這樣的話即使聊天客戶端關閉以后,程序仍在運行,因為主程序並沒有被關閉。也許還有的朋友會說,直接this.close();,但是這樣的話整個應用程序就被關閉了,因為我們在Program.cs里啟用的主程序為ClientLogin界面,該界面一關閉,該程序也就關閉了。那么我們該如何做呢?

這個時候我們需要在Program.cs文件里邊做如下的修改:

static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            ClientLogin clientLogin = new ClientLogin();
            if (clientLogin.ShowDialog() == DialogResult.OK)
            {
                Application.Run(new ChatClient(clientLogin));
            }
            else
            {
                Application.Exit();
            }
        }

      在應用程序的主函數里,我們先實例化一個ClientLogin對象,即程序運行時先彈出登陸頁面,然后再根據登陸界面clientLogin.ShowDialog()的結果進行判斷,如果登陸成功即:DialogResult.OK則這個時候程序才開始運行聊天主客戶端,如果DialogResult不是OK,則這個時候聊天主客戶端根本就不會運行。現在大家明白了為什么在ClientLogin.cs頁會有四行代碼作高亮標注了吧,他們就是為給ClientLogin的Dialogresult屬性賦值,根據登錄情況的不同,賦不同的值,進而控制聊天主客戶端是否運行。在這里如果我們關閉了聊天主客戶端,我們的程序馬上就會關閉,因為我們的運行的主程序即為聊天主客戶端,而非登錄端。如果大家對這一點還有不明白的可以參看我之前的博文《C# 關閉登錄窗體,進入主窗體后,主窗體關閉,程序進程仍在運行的問題》。

      好了,這一節就到這里了,在這一節里我們實現了即時通信程序客戶端的登錄,在這里需要注意的是客戶端登錄時重名問題,以及登錄成功后登錄窗體的關閉問題。希望可以對大家有所幫助,也希望大家多多指點。我會在下一節給教授大家如何實現即時通信程序的主客戶端也就是聊天這一塊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM