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行代码,轻松实现通信。
/*****************************************************************************************************
* 本代码版权归Wenli所有,All Rights Reserved (C) 2015-2016
*****************************************************************************************************
* 所属域:WENLI-PC
* 登录用户:Administrator
* CLR版本:4.0.30319.17929
* 唯一标识:20da4241-0bdc-4a06-8793-6d0889c31f95
* 机器名称:WENLI-PC
* 联系人邮箱:wenguoli_520@qq.com
*****************************************************************************************************
* 命名空间:MCITest * 创建年份:2015
* 创建时间:2015-12-02 11:15:24
* 创建人:Wenli
* 创建说明:
*****************************************************************************************************/ using GFF.Component.Config;
using SAEA.MessageSocket;
using System;
using System.Net;
using System.Text;
using System.Threading.Tasks; namespace GFFClient
{
public class MessageHelper
{
public delegate void OnErrorHander(Exception ex, string msg); public delegate void OnMessageHanndle(string channelID, string msg); private static readonly object lockObj = new object(); private string _channelID; private string _userName; ClientConfig clientConfig; public MessageHelper()
{
clientConfig = ClientConfig.Instance();
} /// <summary>
/// Tcp客户端
/// </summary>
public MessageClient Client { get; private set; } public void Start(string userName, string channelID)
{
_userName = userName;
_channelID = channelID; Client = new MessageClient(, clientConfig.IP, clientConfig.Port);
Client.OnChannelMessage += Client_OnChannelMessage;
Client.OnPrivateMessage += Client_OnPrivateMessage;
Client.OnError += Client_OnError;
Client.Connect();
Client.Login();
Client.Subscribe(channelID);
} private void Client_OnError(string ID, Exception ex)
{
OnError.Invoke(ex, ex.Message);
} private void Client_OnChannelMessage(SAEA.MessageSocket.Model.Business.ChannelMessage msg)
{
OnMessage?.Invoke(_channelID, msg.Content);
} private void Client_OnPrivateMessage(SAEA.MessageSocket.Model.Business.PrivateMessage msg)
{
OnMessage?.Invoke(msg.Receiver, msg.Content);
} public void Publish(string channelID, string value)
{
Client.SendChannelMsg(channelID, value);
} public void SendFile(string channelID, string fileName, Action<string> callBack)
{
HttpSendFileAsync(fileName, url => { callBack?.Invoke(url); });
} public void HttpSendFileAsync(string fileName, Action<string> callBack)
{
Task.Run(() =>
{
using (WebClient webClient = new WebClient())
{
var url = clientConfig.Url + Encoding.UTF8.GetString(webClient.UploadFile(clientConfig.Url + "Upload", fileName));
callBack.Invoke(url);
}
});
} public void Stop()
{
try
{
Client.Dispose();
}
catch { }
} public event OnMessageHanndle OnMessage; public event OnErrorHander OnError;
}
}
3.服务端使用SAEA.MessageSocket实现服务端消息处理逻辑、SAEA.MVC实现文件处理逻辑,有兴趣的朋友可以在此基础上实现更多实际业务。
/*****************************************************************************************************
* 本代码版权归Wenli所有,All Rights Reserved (C) 2015-2016
*****************************************************************************************************
* 所属域:WENLI-PC
* 登录用户:Administrator
* CLR版本:4.0.30319.17929
* 唯一标识:20da4241-0bdc-4a06-8793-6d0889c31f95
* 机器名称:WENLI-PC
* 联系人邮箱:wenguoli_520@qq.com
*****************************************************************************************************
* 命名空间:MCITest * 创建年份:2015
* 创建时间:2015-12-02 11:15:24
* 创建人:Wenli
* 创建说明:
*****************************************************************************************************/ using GFF.Component.Config;
using GFF.Helper;
using SAEA.MessageSocket;
using SAEA.MVC;
using SAEA.Sockets.Interface;
using System; namespace GFFServer
{
internal class Program
{
private static MessageServer messageServer; private static SAEAMvcApplication mvcApplication; private static void Main(string[] args)
{
Console.Title = "GFFServer"; ConsoleHelper.WriteLine("正在初始化消息服务器...", ConsoleColor.Green);
messageServer = new MessageServer();
messageServer.OnAccepted += Server_OnAccepted;
messageServer.OnError += Server_OnError;
messageServer.OnDisconnected += Server_OnDisconnected;
ConsoleHelper.WriteLine("消息服务器初始化完毕...", ConsoleColor.Green); ConsoleHelper.WriteLine("正在初始化文件服务器...", ConsoleColor.DarkYellow);
var filePort = ServerConfig.Instance().FilePort;
mvcApplication = new SAEAMvcApplication(port: filePort);
mvcApplication.SetDefault("File", "Test");
ConsoleHelper.WriteLine("文件服务器初始化完毕,http://127.0.0.1:" + filePort + "/...", ConsoleColor.DarkYellow); ConsoleHelper.WriteLine("正在启动消息服务器...", ConsoleColor.Green);
messageServer.Start();
ConsoleHelper.WriteLine("消息服务器启动完毕...", ConsoleColor.Green); ConsoleHelper.WriteLine("正在启动文件服务器...", ConsoleColor.DarkYellow);
mvcApplication.Start();
ConsoleHelper.WriteLine("文件服务器启动完毕...", ConsoleColor.DarkYellow); ConsoleHelper.WriteLine("点击回车,结束服务");
Console.ReadLine();
} private static void Server_OnDisconnected(string ID, Exception ex)
{
ConsoleHelper.WriteInfo(string.Format("客户端{0}已断开连接,当前连接数共记:{1}", ID, messageServer.ClientCounts));
} private static void Server_OnError(string ID, Exception ex)
{
ConsoleHelper.WriteErr(ex);
} private static void Server_OnAccepted(IUserToken userToken)
{
ConsoleHelper.WriteInfo(string.Format("客户端{0}已连接,当前连接数共记:{1}", userToken.ID, messageServer.ClientCounts));
}
}
}
using SAEA.MVC;
using System.IO; namespace GFFServer.Controllers
{
/// <summary>
/// 文件处理
/// </summary>
public class FileController : Controller
{
public ActionResult Test()
{
return Content("GFF File Server");
} [HttpPost]
public ActionResult Upload()
{
var postFile = HttpContext.Request.PostFiles[];
var filePath = HttpContext.Server.MapPath("/Files");
if (!Directory.Exists(filePath)) Directory.CreateDirectory(filePath);
filePath = Path.Combine(filePath, postFile.FileName);
System.IO.File.WriteAllBytes(filePath, postFile.Data);
return Content("Download?fileName=" + postFile.FileName);
} public ActionResult Download(string fileName)
{
var filePath = Path.Combine(HttpContext.Server.MapPath("/Files"), fileName);
return File(filePath);
}
}
}
四、项目结构
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
如果发现本文有什么问题和任何建议,也随时欢迎交流~
GFF高仿QQ客户端及服务器的更多相关文章
- 高仿QQ的即时通讯应用带服务端软件安装
Android 基于xmpp协议,smack包,openfire服务端(在下面)的高仿QQ的即时通讯实现.实现了注册,登录,读取好友列表,搜索好友,添加分组,添加好友,删除好友,修改心情,两个客户端之 ...
- 史上最简单,一步集成侧滑(删除)菜单,高仿QQ、IOS。
重要的话 开头说,not for the RecyclerView or ListView, for the Any ViewGroup. 本控件不依赖任何父布局,不是针对 RecyclerView. ...
- Android实现高仿QQ附近的人搜索展示
本文主要实现了高仿QQ附近的人搜索展示,用到了自定义控件的方法 最终效果如下 1.下面展示列表我们可以使用ViewPager来实现(当然如果你不觉得麻烦,你也可以用HorizontalScrollVi ...
- 高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框
上一篇高仿QQ即时聊天软件开发系列之二登录窗口界面写了一个大概的布局和原理 这一篇详细说下拉框的实现原理 先上最终效果图 一开始其实只是想给下拉框加一个placeholder效果,让下拉框在未选择未输 ...
- 高仿QQ即时聊天软件开发系列之二登录窗口界面
继上一篇高仿QQ即时聊天软件开发系列之一开端之后,开始做登录窗口 废话不多说,先看效果,只有界面 可能还有一些细节地方没有做,例如那个LOGO嘛,不要在意这些细节 GIF虽短,可是这做起来真难,好吧因 ...
- 高仿QQ即时聊天软件开发系列之一开端
前段时间在园子里看到一个大神做了一个GG2014IM软件,仿QQ的,那感觉···,赶快下载源码过来试试,还真能直接跑起来,效果也不错.但一看源码,全都给封装到了ESFramework里面了,音视频那部 ...
- 高仿qq聊天界面
高仿qq聊天界面,给有需要的人,界面效果如下: 真心觉得做界面非常痛苦,给有需要的朋友. chat.xml <?xml version="1.0" encoding=&quo ...
- WPF ”真正的“高仿QQ
时常可以在各种论坛 博客 看到 各种所谓的 高仿QQ. 说实话 越看越想笑呢.(PS:纯粹的 抨击 那些 不追求 UI 完美主义者) 例如: 本次模仿 采用 C# WPF XAML , 总 ...
- 安卓高仿QQ头像截取升级版
观看此篇文章前,请先阅读上篇文章:高仿QQ头像截取: 本篇之所以为升级版,是在截取头像界面添加了与qq类似的阴影层(裁剪区域以外的部分),且看效果图: 为了适应大家不同需求,这次打了两个包,及上图 ...
随机推荐
- Keystone, Start, Failed to Load Bson
If you have installed the Keystone.js, and properly installed mongodb, but when tried to start the k ...
- vue 构建项目遇到的请求本地json问题
在本地测试的json没有问题,但是打包后,发现json 的路径不对了,变成了绝对路径 解决方法: 建立的json文件需要放置 根目录/static下.如项目名/static/data.json,这边 ...
- SAP生产机该不该开放Debuger权限
前段时间公司定制系统在调用SAP RFC接口的时候报错了,看错误消息一时半会儿也不知道是哪里参数数据错误,就想着进到SAP系统里面对这个接口做远程Debuger,跟踪一下参数变量的变化,结果发现根本就 ...
- ELK环境配置+log4j日志记录
ELK环境配置+log4j日志记录 1. 背景介绍 在大数据时代,日志记录和管理变得尤为重要. 以往的文件记录日志的形式,既查询起来又不方便,又造成日志在服务器上分散存储,管理起来相当麻烦, 想根据一 ...
- Win10安装sqlserver2014打开显示黑色界面,mardown打开显示报错
问题描述: 我电脑从win7更新到win10以后就打开sqlserver2014显示黑色背景有问题,卸载了又装都是没有用 然后我又发现mardown也是有问题打开报告什么错误,忘记截图了,去网上找了个 ...
- KFCM算法的matlab程序(用FCM初始化聚类中心)
KFCM算法的matlab程序(用FCM初始化聚类中心) 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行实现,用FCM初始化聚类中心,并求其准确度与 ...
- java操作elasticsearch实现聚合查询
1.max 最大值 //max 求最大值 @Test public void test30() throws UnknownHostException{ //1.指定es集群 cluster.name ...
- S/4 HANA中的MATDOC和MATDOC_EXTRACT
最近做了销售和物料管理方面的一些需求,因此对S/4中的MM的数据模型有了一定的了解.目前网络已经有一些介绍物料凭证表MATDOC的文章,内容好像不是很详细,另外也没发现介绍库存变更数据表MATDOC_ ...
- Spring的AOP开发的相关术语
转载自 https://www.cnblogs.com/ltfxy/p/9873618.html SpringAOP简介: AOP思想最早是由AOP联盟组织提出的.Spring使用这种思想最好的框架. ...
- flex布局大讲解
http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html?utm_source=tuicool