1.前言html
本次實現的這個聊天工具是我去年c#程序設計課程所寫的Socket仿QQ聊天,因爲當時候沒有本身的服務器,只能在機房局域網內進行測試,最近在騰訊雲上買了一臺雲主機(本人學生黨,騰訊雲有個學生專享活動一元一個月的雲服務器,若是仍是學生的能夠試一下,地址http://www.qcloud.com/event/qcloudSchool),通過從新編碼實現了廣域網聊天的功能。下面開始介紹個人自制聊天軟件啦!!!數據庫
2.功能c#
1. 聊天室服務器端的建立。數組
2. 聊天室客戶端的建立。服務器
3. 實現客戶與服務器的鏈接通信。網絡
4. 實現客戶之間的私聊(窗口抖動,通常信息,文件)。函數
5. 實現客戶端的在線信息顯示。工具
6. 實現服務器端當前在線客戶信息。測試
7. 保存談話記錄。阿里雲
8.實現客戶端仿QQ的通常操做(註冊,登陸,修改密碼,查找好友,更新我的信息,娛樂,切換頭像)
3.技術
本程序是設計一個相似QQ的網絡即時聊天工具,主要是採用WinForms+ADO.NET+Socket通訊+thread+雲服務器技術實現。軟件功能主要包括用戶註冊、用戶登陸、用戶間聊天、查找/添加好友、我的設置以及服務器的搭建等。客戶端經過公共的SQLServer2008數據庫交換信息,消息的發送和讀取都是經過Socket通訊技術和操做數據庫來完成的。在程序中採用定時掃描數據庫的方式來查找登陸用戶。以及Socket通訊技術實現信息交換。
4.網絡通訊簡介
博客園上有不少簡介我簡單引用一下
一、Socket還被稱做「套接字」,應用程序一般經過套接字向網絡發送請求或者應答網絡請求。根據鏈接啓動的方式以及本地套接字要鏈接的目標,套接字之間的鏈接過程能夠分爲三個步驟:服務器監聽,客戶端請求,鏈接確認。
二、端口:能夠認爲是計算機與外界通信交流的出口。
三、Tcp: TCP是一種面向鏈接(鏈接導向)的、可靠的、基於字節流的運輸層通訊協議。UDP是另外一個重要的傳輸協議。
四、UDP:用戶數據報協議,是一種無鏈接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。
本人以爲博主張龍豪的這篇Socket文章寫得不錯,你們能夠參考一下。
http://www.cnblogs.com/knowledgesea/archive/2012/11/26/2788669.html
這是一幅很是經典的圖啊,相信看後你們對Socket就會有必定的瞭解。
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; }
運行效果
小練習源碼地址:http://pan.baidu.com/s/1sld12Kt
5.小結
本次只是開了一個頭,咱們介紹了一下的Socket仿QQ聊天的基本實現思想,從下次博客開始我要開始寫服務器如何監聽多個客戶端,而且如何實現端對端的通訊,以及對通訊協議的自定義,說了這麼多,看一下我實現的效果吧。下次咱們繼續聊。
下面這幅圖爲客戶端聊天是發送窗口抖動的效果,好吧有點鬼畜,(上面那個爲服務器-*可部署於服務器*,下面爲兩個客戶端)
6源碼
下面這個源碼基本上是我課程設計時所做,我把它命名爲MyChatV1.0,後續的博客中我還會重構個人代碼,你們能夠先下載的看一下(寫的可能比較挫),核心實現代碼我還會在我後續的博客中介紹。(APP.config文件中的數據庫地址是我使用阿里雲免費的數據庫,你們能夠直接使用但注意只能用於交流,本地數據庫文件我也會上傳到源碼當中)。
這個系列未完,待續。。。。。。。。。。。。。。。。。。。。。,期待您的關注
MyChatV1.0源碼:http://pan.baidu.com/s/1pLnEUwV