Socket實現仿QQ聊天(可部署於廣域網)附源碼(1)-簡介


1.前言

     本次實現的這個聊天工具是我去年c#程序設計課程所寫的Socket仿QQ聊天,由於當時候沒有自己的服務器,只能在機房局域網內進行測試,最近在騰訊雲上買了一台雲主機(本人學生黨,騰訊雲有個學生專享活動一元一個月的雲服務器,如果還是學生的可以試一下,地址http://www.qcloud.com/event/qcloudSchool),經過重新編碼實現了廣域網聊天的功能。下面開始介紹我的自制聊天軟件啦!!!

2.功能

1. 聊天室服務器端的創建。

2. 聊天室客戶端的創建。

3. 實現客戶與服務器的連接通訊。

4. 實現客戶之間的私聊(窗口抖動,一般信息,文件)。

5. 實現客戶端的在線信息顯示。

6. 實現服務器端當前在線客戶信息。

7. 保存談話記錄。

8.實現客戶端仿QQ的一般操作(注冊,登錄,修改密碼,查找好友,更新個人信息,娛樂,切換頭像)

3.技術

     本程序是設計一個類似QQ的網絡即時聊天工具,主要是采用WinForms+ADO.NET+Socket通信+thread+雲服務器技術實現。軟件功能主要包括用戶注冊、用戶登錄、用戶間聊天、查找/添加好友、個人設置以及服務器的搭建等。客戶端通過公共的SQLServer2008數據庫交換信息,消息的發送和讀取都是通過Socket通信技術和操作數據庫來完成的。在程序中采用定時掃描數據庫的方式來查找登錄用戶。以及Socket通信技術實現信息交換。

4.網絡通信簡介

博客園上有很多簡介我簡單引用一下

1、Socket還被稱作“套接字”,應用程序通常通過套接字向網絡發送請求或者應答網絡請求。根據連接啟動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分為三個步驟:服務器監聽,客戶端請求,連接確認。

2、端口:可以認為是計算機與外界通訊交流的出口。

3、Tcp: TCP是一種面向連接(連接導向)的、可靠的、基於字節流的運輸層通信協議。UDP是另一個重要的傳輸協議。

4、UDP:用戶數據報協議,是一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。

本人覺得博主張龍豪的這篇Socket文章寫得不錯,大家可以參考一下。

聊天程序(基於Socket、Thread)

http://www.cnblogs.com/knowledgesea/archive/2012/11/26/2788669.html

這是一幅非常經典的圖啊,相信看后大家對Socket就會有一定的了解。

wpsDA99.tmp

5.簡單實現Socket通信

服務器代碼:

public Form1()
       {
           InitializeComponent();
           //防止新線程調用主線程卡死
          CheckForIllegalCrossThreadCalls = false;
       }
       Socket sck = null;
       Thread thread = null;
       //點擊開啟服務端監聽
       private void btnServer_Click(object sender, EventArgs e)
       {
           //創建一個Socket實例
           //第一個參數表示使用ipv4
           //第二個參數表示發送的是數據流
           //第三個參數表示使用的協議是Tcp協議
           sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
           //獲取ip地址局域網使用 ipv4,廣域網使用外網IP
           IPAddress ip = IPAddress.Parse(txtIP.Text);
           //創建一個網絡通信節點,這個通信節點包含了ip地址,跟端口號。
           //這里的端口我們設置為1029,這里設置大於1024,為什么自己查一下端口號范圍使用說明。
           IPEndPoint endPoint = new IPEndPoint(ip, int.Parse(txtPort.Text));
           //Socket綁定網路通信節點
           sck.Bind(endPoint);
           //設置監聽隊列
           sck.Listen(10);
           ShowMsg("開啟監聽!");

           //開啟一個新線程,放入Socket服務監聽
           Thread thread = new Thread(JtSocket);
           //設置為后台線程
           thread.IsBackground = true;
           thread.Start();
       }
       Socket accSck = null;
       //Socket服務監聽函數
       void JtSocket()
       {
           while (true)//注意該循環,服務端要持續監聽,要不然一個客戶端鏈接過后就無法鏈接第二個客戶端了。
           {
               //創建一個接收客戶端通信的Socket
               accSck = sck.Accept();
               //如果監聽到客戶端有鏈接,則運行到下一部,提示,鏈接成功!
               ShowMsg("鏈接成功!");
           }
       }

       //消息框里面數據
       void ShowMsg(string str)
       {
           string Ystr = "";
           if (txtChat.Text != "")
           {
               Ystr = txtChat.Text + "\r\n";
           }
           txtChat.Text = Ystr + str;
       }
           /// <summary>
           /// 向客戶端發消息
           /// </summary>
           /// <param name="sender"></param>
           /// <param name="e"></param>
       private void btnSend_Click(object sender, EventArgs e)
       {
           string SendMsg = txtMsg.Text;
           if (SendMsg != "")
           {
               byte[] buffer = System.Text.Encoding.UTF8.GetBytes(SendMsg); //將要發送的數據,生成字節數組。
               accSck.Send(buffer);
               ShowMsg("向客戶端發送了:" + SendMsg);
           }
       }

  客戶端代碼:

public Client()
       {
           InitializeComponent();
           //防止新線程調用主線程卡死
           TextBox.CheckForIllegalCrossThreadCalls = false;
       }
       Socket clientSocket = null;
       Thread thread = null;
       //通過IP地址與端口號與服務端建立鏈接      
       private void btnToServer_Click(object sender, EventArgs e)
       {
           clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
           //這里的ip地址,端口號都是服務端綁定的相關數據。
           IPAddress ip = IPAddress.Parse(txtIP.Text);
           IPEndPoint endpoint = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
           clientSocket.Connect(endpoint);//鏈接有端口號與IP地址確定服務端.

           //客戶端在接受服務端發送過來的數據是通過Socket 中的Receive方法,
           //該方法會阻斷線程,所以我們自己為該方法創建了一個線程
           thread = new Thread(ReceMsg);
           thread.IsBackground = true;//設置后台線程
           thread.Start();
       }
       public void ReceMsg()
       {
           while (true)
           {
               byte[] buffer = new byte[1024 * 1024 * 2];
               clientSocket.Receive(buffer);//接收服務端發送過來的數據
               string ReceiveMsg = System.Text.Encoding.UTF8.GetString(buffer);//把接收到的字節數組轉成字符串顯示在文本框中。
               ShowMsg("接收到數據:" + ReceiveMsg);
           }
       }

       //消息框里面數據
       void ShowMsg(string str)
       {
           string Ystr = "";
           if (txtChat.Text != "")
           {
               Ystr = txtChat.Text + "\r\n";
           }
           txtChat.Text = Ystr + str;
       }

  

運行效果

gif 
小練習源碼地址:http://pan.baidu.com/s/1sld12Kt

5.小結

本次只是開了一個頭,我們介紹了一下的Socket仿QQ聊天的基本實現思想,從下次博客開始我要開始寫服務器如何監聽多個客戶端,並且如何實現端對端的通信,以及對通信協議的自定義,說了這么多,看一下我實現的效果吧。下次我們繼續聊。

下面這幅圖為客戶端聊天是發送窗口抖動的效果,好吧有點鬼畜,(上面那個為服務器-*可部署於服務器*,下面為兩個客戶端)

555123

6源碼

下面這個源碼基本上是我課程設計時所作,我把它命名為MyChatV1.0,后續的博客中我還會重構我的代碼,大家可以先下載的看一下(寫的可能比較挫),核心實現代碼我還會在我后續的博客中介紹。(APP.config文件中的數據庫地址是我使用阿里雲免費的數據庫,大家可以直接使用但注意只能用於交流,本地數據庫文件我也會上傳到源碼當中)。

這個系列未完,待續。。。。。。。。。。。。。。。。。。。。。,期待您的關注

MyChatV1.0源碼:http://pan.baidu.com/s/1pLnEUwV

 

轉載自:http://www.cnblogs.com/ATtuing/p/5398095.html

 

程序員的基礎教程:菜鳥程序員


免責聲明!

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



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