一、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-20163  *****************************************************************************************************4  * 所属域:WENLI-PC5  * 登录用户:Administrator6  * CLR版本:4.0.30319.179297  * 唯一标识:20da4241-0bdc-4a06-8793-6d0889c31f958  * 机器名称:WENLI-PC9  * 联系人邮箱:wenguoli_520@qq.com10  *****************************************************************************************************11  * 命名空间:MCITest12 13 14  * 创建年份:201515  * 创建时间:2015-12-02 11:15:2416  * 创建人:Wenli17  * 创建说明: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 GFFClient28 {29     public class MessageHelper30     {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-20163  *****************************************************************************************************4  * 所属域:WENLI-PC5  * 登录用户:Administrator6  * CLR版本:4.0.30319.179297  * 唯一标识:20da4241-0bdc-4a06-8793-6d0889c31f958  * 机器名称:WENLI-PC9  * 联系人邮箱: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.Controllers5 {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
如果发现本文有什么问题和任何建议,也随时欢迎交流~

 

感谢您的阅读,如果您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是yswenli 。

GFF高仿QQ客户端及服务器相关推荐

  1. 高仿QQ空间项目实战开发(带服务器端程序)

    大家好,今天我在这里分享一个小程序.高仿QQ空间的APP,这里给大家分享一个安卓APP和PHP写的服务器程序.想提高安卓开发能力或安卓和后台服务器一起做的初学者值得一看,老鸟跳过. 接下来我们看看效果 ...

  2. Java仿QQ客户端(用JTree实现好友列表)

    仿QQ客户端 当前效果 登录界面 好友列表界面 当前效果 登录界面 首先,为了达到美观的目的,需要添加一张背景图片,我采用的方法是将图片添加到JLabel上,再将JLabel添加到界面上,但这样会面临 ...

  3. 用Vue高仿qq音乐官网-pc端

    用Vue高仿qq音乐官网-pc端 一直想做一个vue项目 然后呢 我就做了http://www.tuicool.com/articles/eymeiiN 效果预览 部分地方不全部根据原版,也有自由发挥 ...

  4. 如何使用MFC编写自定义UI界面【附高仿QQ 2014登陆界面范例程序】

    地址: http://blog.csdn.net/hujkay作者:Jekkay Hu(34538980@qq.com)关键词:MFC, 编写异行窗体,自定义UI控件,VC++,异形控件,高仿QQ登陆 ...

  5. 高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框

    上一篇高仿QQ即时聊天软件开发系列之二登录窗口界面写了一个大概的布局和原理 这一篇详细说下拉框的实现原理 先上最终效果图 一开始其实只是想给下拉框加一个placeholder效果,让下拉框在未选择未输 ...

  6. Android实现高仿QQ附近的人搜索展示

    本文主要实现了高仿QQ附近的人搜索展示,用到了自定义控件的方法 最终效果如下 1.下面展示列表我们可以使用ViewPager来实现(当然如果你不觉得麻烦,你也可以用HorizontalScrollVi ...

  7. android qq红点,Android高仿QQ小红点功能

    先给大家展示下效果图: 绘制贝塞尔曲线: 主要是当在一定范围内拖拽时算出固定圆和拖拽圆的外切直线以及对应的切点,就可以通过path.quadTo()来绘制二阶贝塞尔曲线了~ 整体思路: 1.当小红点静 ...

  8. android+qq底部界面,Android 高仿QQ 界面滑动效果

    Android高仿QQ界面滑动效果 点击或者滑动切换画面,用ViewPager实现, 首先是布局文件: android:layout_width="match_parent" an ...

  9. Android开发之高仿QQ消息侧拉删除

    Android开发之高仿QQ消息侧拉删除 QQ消息的侧滑删除效果之炫酷,想必大家都见过吧,本人作为一名安卓开发人员,遇到如此炫酷的效果,怎能不研究一番呢,现本人已实现其基本功能,现将代码贴出,望各位大 ...

最新文章

  1. 『网站升级』PHPWind8.0至8.3升级过程及问题种种回顾录
  2. [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  3. php mysql delete_php教程之PHP MySQL Delete
  4. Windows server 2012远程桌面会话主机和远程桌面授权,server2012
  5. SVN客户端和中文包的安装
  6. 跟着王道考研学计算机网络笔记(一):初步了解计算机网络
  7. 线性不可分的线性支持向量机的原始问题(凸二次规划)详细求解
  8. APUE学习笔记-15章进程间通信
  9. struct termios
  10. opencv cvtcolor函数中断异常
  11. 设计模式--设配器模式
  12. 读书笔记—CLR via C#章节4-7
  13. 范数(Norm)和谱半径(Spectral Radii)
  14. 找回忘记的ADSL拨号密码
  15. 数字图像处理与MATLAB 第四章学习笔记
  16. 玻璃温室建造工程中不容忽视的桁架结构
  17. [TCP/IP] Linux 搭建服务器局域网
  18. Linux 编辑doc,Linux 指令篇-文档编辑.doc
  19. 序号计算机软件工程协会网,中国计算机学会推荐的软件工程类国际学术刊物与会议.docx...
  20. MACD二次金叉选股公式,零轴上下、一次三次金叉举一反三

热门文章

  1. 阿里云前端开发学习路线 - CSS快速掌握 笔记
  2. js bind函数详解
  3. hosts文件无法修改无法保存
  4. 并发编程 – Concurrent 用户指南( 下 )
  5. python写游戏需要安装什么软件_python开发游戏的前期准备
  6. Android - Glide加载gif时图片自适应手机屏幕的宽高
  7. 陕西单招计算机机测试题,陕西省单招计算机考试题
  8. HCIA网络基础10-交换网络及STP
  9. C++——程序员的逼格神器-github
  10. 给喜欢的主播自动发弹幕——但是用python