GFF高仿QQ客戶端及伺服器

来源:https://www.cnblogs.com/yswenli/archive/2018/11/24/6274526.html
-Advertisement-
Play Games

一、GFF簡介 GFF是仿QQ界面,通信基於SAEA.MessageSocket、SAEA.Http、SAEA.MVC實現包含客戶端和伺服器的程式,源碼完全公開,項目源碼地址:https://github.com/yswenli/GFF ,大家可以去我的github瞭解,歡迎follow,star與 ...


一、GFF簡介

GFF是仿QQ界面,通信基於SAEA.MessageSocket、SAEA.Http、SAEA.MVC實現包含客戶端和伺服器的程式,源碼完全公開,項目源碼地址:https://github.com/yswenli/GFF ,大家可以去我的github瞭解,歡迎follow,star與fork。

GFF消息採用高性能基於IOCP模型的tcp實現,文件採用http實現,代碼簡潔,一目瞭然,非常適合想要瞭解聊天通信關鍵技術的朋友。

二、運行界面

GFF已實現了消息、表情、圖片、截圖等關鍵功能,已編譯的綠色版https://github.com/yswenli/GFF/releases下載下來後運行如下圖:

三、關鍵技術

1.界面採用了CSkin的一套QQ皮膚,更多的可以百度一下CSkin相關的資料,或者查看GFF的源碼。

2.客戶端通信使用了SAEA.MessageSocket的封裝類MessageHelper,代碼非常簡潔,不到100行代碼,輕鬆實現通信。

  1 /*****************************************************************************************************
  2  * 本代碼版權歸Wenli所有,All Rights Reserved (C) 2015-2016
  3  *****************************************************************************************************
  4  * 所屬域:WENLI-PC
  5  * 登錄用戶:Administrator
  6  * CLR版本:4.0.30319.17929
  7  * 唯一標識:20da4241-0bdc-4a06-8793-6d0889c31f95
  8  * 機器名稱:WENLI-PC
  9  * 聯繫人郵箱:[email protected]
 10  *****************************************************************************************************
 11  * 命名空間:MCITest
 12 
 13 
 14  * 創建年份:2015
 15  * 創建時間:2015-12-02 11:15:24
 16  * 創建人:Wenli
 17  * 創建說明:
 18  *****************************************************************************************************/
 19 
 20 using GFF.Component.Config;
 21 using SAEA.MessageSocket;
 22 using System;
 23 using System.Net;
 24 using System.Text;
 25 using System.Threading.Tasks;
 26 
 27 namespace GFFClient
 28 {
 29     public class MessageHelper
 30     {
 31         public delegate void OnErrorHander(Exception ex, string msg);
 32 
 33         public delegate void OnMessageHanndle(string channelID, string msg);
 34 
 35         private static readonly object lockObj = new object();
 36 
 37         private string _channelID;
 38 
 39         private string _userName;
 40 
 41         ClientConfig clientConfig;
 42 
 43         public MessageHelper()
 44         {
 45             clientConfig = ClientConfig.Instance();
 46         }
 47 
 48         /// <summary>
 49         ///     Tcp客戶端
 50         /// </summary>
 51         public MessageClient Client { get; private set; }
 52 
 53         public void Start(string userName, string channelID)
 54         {
 55             _userName = userName;
 56             _channelID = channelID;
 57 
 58             Client = new MessageClient(10240, clientConfig.IP, clientConfig.Port);
 59             Client.OnChannelMessage += Client_OnChannelMessage;
 60             Client.OnPrivateMessage += Client_OnPrivateMessage;
 61             Client.OnError += Client_OnError;
 62             Client.Connect();
 63             Client.Login();
 64             Client.Subscribe(channelID);
 65         }
 66 
 67         private void Client_OnError(string ID, Exception ex)
 68         {
 69             OnError.Invoke(ex, ex.Message);
 70         }
 71 
 72         private void Client_OnChannelMessage(SAEA.MessageSocket.Model.Business.ChannelMessage msg)
 73         {
 74             OnMessage?.Invoke(_channelID, msg.Content);
 75         }
 76 
 77         private void Client_OnPrivateMessage(SAEA.MessageSocket.Model.Business.PrivateMessage msg)
 78         {
 79             OnMessage?.Invoke(msg.Receiver, msg.Content);
 80         }
 81 
 82         public void Publish(string channelID, string value)
 83         {
 84             Client.SendChannelMsg(channelID, value);
 85         }
 86 
 87 
 88         public void SendFile(string channelID, string fileName, Action<string> callBack)
 89         {
 90             HttpSendFileAsync(fileName, url => { callBack?.Invoke(url); });
 91         }
 92 
 93 
 94         public void HttpSendFileAsync(string fileName, Action<string> callBack)
 95         {
 96             Task.Run(() =>
 97             {
 98                 using (WebClient webClient = new WebClient())
 99                 {
100                     var url = clientConfig.Url + Encoding.UTF8.GetString(webClient.UploadFile(clientConfig.Url + "Upload", fileName));
101                     callBack.Invoke(url);
102                 }
103             });
104         }
105 
106         public void Stop()
107         {
108             try
109             {
110                 Client.Dispose();
111             }
112             catch { }
113         }
114 
115         public event OnMessageHanndle OnMessage;
116 
117         public event OnErrorHander OnError;
118     }
119 }
View Code

3.服務端使用SAEA.MessageSocket實現服務端消息處理邏輯、SAEA.MVC實現文件處理邏輯,有興趣的朋友可以在此基礎上實現更多實際業務。

 1 /*****************************************************************************************************
 2  * 本代碼版權歸Wenli所有,All Rights Reserved (C) 2015-2016
 3  *****************************************************************************************************
 4  * 所屬域:WENLI-PC
 5  * 登錄用戶:Administrator
 6  * CLR版本:4.0.30319.17929
 7  * 唯一標識:20da4241-0bdc-4a06-8793-6d0889c31f95
 8  * 機器名稱:WENLI-PC
 9  * 聯繫人郵箱:[email protected]
10  *****************************************************************************************************
11  * 命名空間:MCITest
12 
13 
14  * 創建年份:2015
15  * 創建時間:2015-12-02 11:15:24
16  * 創建人:Wenli
17  * 創建說明:
18  *****************************************************************************************************/
19 
20 using GFF.Component.Config;
21 using GFF.Helper;
22 using SAEA.MessageSocket;
23 using SAEA.MVC;
24 using SAEA.Sockets.Interface;
25 using System;
26 
27 namespace GFFServer
28 {
29     internal class Program
30     {
31         private static MessageServer messageServer;
32 
33         private static SAEAMvcApplication mvcApplication;
34 
35         private static void Main(string[] args)
36         {
37             Console.Title = "GFFServer";
38 
39 
40             ConsoleHelper.WriteLine("正在初始化消息伺服器...", ConsoleColor.Green);
41             messageServer = new MessageServer();
42             messageServer.OnAccepted += Server_OnAccepted;
43             messageServer.OnError += Server_OnError;
44             messageServer.OnDisconnected += Server_OnDisconnected;
45             ConsoleHelper.WriteLine("消息伺服器初始化完畢...", ConsoleColor.Green);
46 
47 
48 
49             ConsoleHelper.WriteLine("正在初始化文件伺服器...", ConsoleColor.DarkYellow);
50             var filePort = ServerConfig.Instance().FilePort;
51             mvcApplication = new SAEAMvcApplication(port: filePort);
52             mvcApplication.SetDefault("File", "Test");
53             ConsoleHelper.WriteLine("文件伺服器初始化完畢,http://127.0.0.1:" + filePort + "/...", ConsoleColor.DarkYellow);
54 
55 
56 
57             ConsoleHelper.WriteLine("正在啟動消息伺服器...", ConsoleColor.Green);
58             messageServer.Start();
59             ConsoleHelper.WriteLine("消息伺服器啟動完畢...", ConsoleColor.Green);
60 
61 
62 
63             ConsoleHelper.WriteLine("正在啟動文件伺服器...", ConsoleColor.DarkYellow);
64             mvcApplication.Start();
65             ConsoleHelper.WriteLine("文件伺服器啟動完畢...", ConsoleColor.DarkYellow);
66 
67 
68 
69             ConsoleHelper.WriteLine("點擊回車,結束服務");
70             Console.ReadLine();
71         }
72 
73         private static void Server_OnDisconnected(string ID, Exception ex)
74         {
75             ConsoleHelper.WriteInfo(string.Format("客戶端{0}已斷開連接,當前連接數共記:{1}", ID, messageServer.ClientCounts));
76         }
77 
78         private static void Server_OnError(string ID, Exception ex)
79         {
80             ConsoleHelper.WriteErr(ex);
81         }
82 
83         private static void Server_OnAccepted(IUserToken userToken)
84         {
85             ConsoleHelper.WriteInfo(string.Format("客戶端{0}已連接,當前連接數共記:{1}", userToken.ID, messageServer.ClientCounts));
86         }
87     }
88 }
View Code
 1 using SAEA.MVC;
 2 using System.IO;
 3 
 4 namespace GFFServer.Controllers
 5 {
 6     /// <summary>
 7     /// 文件處理
 8     /// </summary>
 9     public class FileController : Controller
10     {
11         public ActionResult Test()
12         {
13             return Content("GFF File Server");
14         }
15 
16         [HttpPost]
17         public ActionResult Upload()
18         {
19             var postFile = HttpContext.Request.PostFiles[0];
20             var filePath = HttpContext.Server.MapPath("/Files");
21             if (!Directory.Exists(filePath)) Directory.CreateDirectory(filePath);
22             filePath = Path.Combine(filePath, postFile.FileName);
23             System.IO.File.WriteAllBytes(filePath, postFile.Data);
24             return Content("Download?fileName=" + postFile.FileName);
25         }
26 
27 
28         public ActionResult Download(string fileName)
29         {
30             var filePath = Path.Combine(HttpContext.Server.MapPath("/Files"), fileName);
31             return File(filePath);
32         }
33     }
34 }
View Code

 

四、項目結構

 

1.GFF.Component 封裝客戶的截圖、聊天展現、表情、配置等

2.GFF.Helper 封裝了GFF項目中需要使用的一些工具類

3.GFF.Model 是GFF中使用到類、介面、枚舉等

4.GFFClient 是GFF的客戶端主體項目

5.GFFServer 是GFF的服務端主體項目

 

 


轉載請標明本文來源:https://www.cnblogs.com/yswenli/p/6274526.html
更多內容歡迎我的的github:https://github.com/GFF
如果發現本文有什麼問題和任何建議,也隨時歡迎交流~

 

 


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

-Advertisement-
Play Games
更多相關文章
  •  寫在前面 上篇文章我帶著大家通過分析了一遍ASP.NET Core的源碼瞭解了它的啟動過程,然後又帶著大家熟悉了一遍配置文件的載入方式,最後引出了依賴註入以及控制反轉的概念!如果大家把前面幾張都理解了,那麼你也就入了ASP.NET Core的大門了。但是我們還需要一個版本控制工具來提高我們的編碼 ...
  • 項目源文件下載https://files.cnblogs.com/files/ckym/Log4NetTestSourceCode.zip Log4net是一款非常好用的日誌記錄的框架,使用它可以實現將日誌輸出到控制台,文件,資料庫等功能 網上有很多log4net的使用教程,一些非常簡陋,一些又很深 ...
  • 日期:2018年11月24日 環境:Window 10,VS2015 一、利用VS2015自帶的工具生成DLL 步驟: 1.利用C#準備一個.cs文件; 2.開始菜單->Visual Studio 2015->VS2015 開發人員命令提示; 3.輸入csc /t:library /out:C:\U ...
  • 在我們很多的Web應用中會遇到需要從後端將指定的數據或消息實時推送到前端,通常的做法是前端寫個腳本定時到後端獲取,或者藉助WebSocket技術實現前後端實時通訊。因定時刷新的方法弊端很多(已不再採用),所以基於WebSocket技術實現的通訊方案正越來越受大家喜愛,於是在ASP.NET中就有了鼎鼎... ...
  • 1.什麼是docker-swarm 在公司網站流量爆髮式增長的時候,一臺伺服器往往不能滿足需求,之前我的解決辦法是通過nginx來實現負載均衡,有了docker-machine之後,解決方案會更加簡單。當流量增加時,我們按照需要往docker-swarm集群中添加主機就可以了。 2.原理 我們把一組 ...
  • ASP.NET -- WebForm -- 頁面生命周期事件在頁生命周期的每個階段中,頁將引發可運行您自己的代碼進行處理的事件。 1. PreInit: 使用該事件來執行下列操作: 檢查 IsPostBack 屬性來確定是不是第一次處理該頁。 創建或重新創建動態控制項。 動態設置主控頁。 動態設置 T ...
  • 1 使用插件名稱Epplus,多個Sheet頁數據應用,Demo為柱狀圖(Epplus支持多種圖表) 2 Epplus 的安裝和引用 新建一個工程文件或控制台應用程式 打開 Vs2017 Tools 的Nuget 包管理器,使用命令 install-package Epplus 3 開始在創建的工程 ...
  • 第一篇:把代碼連接到容器 第二篇:定製Docker鏡像 上一篇文章最後有個問題,定製的鏡像無法正常運行: 這可能是由於無法找到要運行的dll引起的問題。 之前的Dockerfile的文檔我是按照微軟的文檔操作的。 不過隨後我還是查看了Docker的文檔:https://docs.docker.com ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...