GFF高仿QQ客户端及服务器

简介:

一、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  * 联系人邮箱:wenguoli_520@qq.com
 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 }
复制代码

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  * 联系人邮箱:wenguoli_520@qq.com
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 }
复制代码
复制代码
 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 }
复制代码

 

四、项目结构

 

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
如果发现本文有什么问题和任何建议,也随时欢迎交流~

 

 

相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
14天前
|
存储 人工智能 自然语言处理
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
ChatMCP 是一款基于模型上下文协议(MCP)的 AI 聊天客户端,支持多语言和自动化安装。它能够与多种大型语言模型(LLM)如 OpenAI、Claude 和 OLLama 等进行交互,具备自动化安装 MCP 服务器、SSE 传输支持、自动选择服务器、聊天记录管理等功能。
95 15
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
|
1月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
42 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
2月前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
176 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
2月前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
184 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
2月前
使用Netty实现文件传输的HTTP服务器和客户端
本文通过详细的代码示例,展示了如何使用Netty框架实现一个文件传输的HTTP服务器和客户端,包括服务端的文件处理和客户端的文件请求与接收。
81 1
使用Netty实现文件传输的HTTP服务器和客户端
|
2月前
|
网络协议 Unix Linux
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
102 4
|
2月前
|
网络协议 Java API
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
73 2
|
2月前
|
存储 网络协议 Java
【网络】UDP回显服务器和客户端的构造,以及连接流程
【网络】UDP回显服务器和客户端的构造,以及连接流程
61 2
|
2月前
|
安全 区块链 数据库
|
2月前
|
存储 网络协议 Unix
docker的底层原理一:客户端-服务器架构
本文详细解释了Docker的客户端-服务器架构,包括常驻后台的Docker守护进程、通过命令行接口发送请求的Docker客户端、以及它们之间通过Unix socket或网络接口进行的通信。
28 0