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

来源:http://www.cnblogs.com/ATtuing/archive/2016/04/16/5398095.html
-Advertisement-
Play Games

1.前言 本次實現的這個聊天工具是我去年c#程式設計課程所寫的Socket仿QQ聊天,由於當時候沒有自己的伺服器,只能在機房區域網內進行測試,最近在騰訊雲上買了一臺雲主機(本人學生黨,騰訊雲有個學生專享活動一元一個月的雲伺服器,如果還是學生的可以試一下,地址http://www.qcloud.com ...


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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、Web Service簡介 1.1、Web Service基本概念 Web Service也叫XML Web Service WebService是一種可以接收從Internet或者Intranet上的其它系統中傳遞過來的請求,輕量級的獨立的通訊技術。是:通過SOAP在Web上提供的軟體服務,使 ...
  • 一步一步搭框架(asp.netmvc+easyui+sqlserver)-01 要搭建的框架是企業級開發框架,適用用企業管理信息系統的開發,如:OA、HR等 1、框架名稱:sampleFrame。 2、搭建原則:最少知識原則。 3、先定義一個簡單的編碼規範:除類名和介面名外,其餘首字母小寫。 4、準 ...
  • 使用EntityFramework6連接MySQL 不是微軟的親兒子這待遇就是不一樣,其中的坑可真實不少,為了連MySQL足足折騰了我大半天。 廢話不多說直接開始。 安裝MySQL 從官網上下載最新版,下載好以後直接安裝就可以了。最新版的MySQL已經包含了所有開發需要的功能(包括MySQL連接器) ...
  • 運算符 new一個Class時,new完成了兩方面內容:一是調用new class命令來為實例在托管堆中分配記憶體;二是調用構造函數來實現對象初始化。 修飾符 顯示隱藏從基類繼承來的成員。雖然可以不用new修飾符情況下隱藏成員,但會生成警告。如果用new關鍵字顯示隱藏成員,則會取消此警告。 無new關 ...
  • 到目前為止,我們定義的ServiceProvider已經實現了基本的服務提供和回收功能,但是依然漏掉了一些必需的細節特性。這些特性包括如何針對IServiceProvider介面提供一個ServiceProvider對象,何創建ServiceScope,以及如何提供一個服務實例的集合。 一、提供一個... ...
  • GDI 映射模式 MM_TEXT 1邏輯單位 = 1像素 MM_LOMETRIC 1邏輯單位 = 0.1mm MM_HIMETRIC 1邏輯單位 = 0.01mm MM_LOENGLISH 1邏輯單位 = 0.01 in = 0.254mm MM_HIENGLISH 1邏輯單位 = 0.001 in ...
  • this關鍵字 引用類的當前實例,包括繼承而來的方法,通常可以省略。 將對象作為參數傳遞到其他方法。 聲明索引器 ...
  • 一寫完後,好久沒有繼續寫了。最近公司又在重新開發許可權系統了,但是由於我人微言輕,無法阻止他們設計一個太監版的許可權系統。想想確實是官大一級壓死人啊, 沒辦法我只好不參與了 讓他們去折騰。 我就大概說一下公司目前在做的許可權系統,各位看官給點評價。 設計總體要求: (註:項目名稱為 統一許可權管理系統) 1 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...