[原创]C#仿QQ聊天程序(点对点无服务端, P2P)
![]() ![]() 本程序是C#仿QQ程序的精简版,做了大量优化处理,包括全新界面设计及删除部分冗余代码。QQ程序涉及简单网络通信,也是网络基础编程的好教材,包括动态分配端口,对象加密传输,消息处理,在线列表管理,UI控制,系统配置,接口设计等技术值得学习。 对话窗体,可以显示和隐藏聊天记录。 打开了5个程序实例用于测试,模仿5个不同IP的客户端。当收到消息时任务栏图标志会闪烁。 下面介绍几个核心类及接口: 1.用户在线列表接口 /// <summary> /// 用户在线列表接口 /// </summary> public interface IConnectionList { /// <summary> /// 批量添加用户列表。 /// </summary> /// <param name="connList"></param> void AddConnection(IList connList); /// <summary> /// 添加一个用户连接 /// </summary> /// <param name="conn"></param> void AddConnection(ChatConnection conn); /// <summary> /// 在指定位置插入用户连接 /// </summary> /// <param name="position"></param> /// <param name="conn"></param> void AddConnection(int position, ChatConnection conn); /// <summary> /// 删除一个用户连接 /// </summary> /// <param name="account"></param> void RemoveConnection(string account); /// <summary> /// 检查该用户是否在用户列表之中 /// </summary> /// <param name="account"></param> /// <returns></returns> bool IsConnectionExists(string account); /// <summary> /// 设置指定用户状态 /// </summary> /// <param name="account"></param> /// <param name="state"></param> void SetConnectionState(string account, ChatState state); /// <summary> /// 当用户接受到消息,用户图标自动闪烁(如QQ那样跳动) /// </summary> /// <param name="account"></param> void FlashConnection(string account); /// <summary> /// 停止跳动 /// </summary> /// <param name="account"></param> void StopFlash(string account); /// <summary> /// 关闭所有用户 /// </summary> void CloseAll(); void CloseAll(bool removeUser); /// <summary> /// 增加接收到的消息,加入到聊天记录文件。 /// </summary> /// <param name="sender"></param> /// <param name="message"></param> /// <returns></returns> int AddReceivedMessage(string sender, string message); /// <summary> /// 返回所有连接 /// </summary> /// <returns></returns> IList GetConnections(); /// <summary> /// 返回选中的用户 /// </summary> /// <returns></returns> ChatConnection GetSelectedConnection(); /// <summary> /// 返回指定的用户连接 /// </summary> /// <param name="account"></param> /// <returns></returns> ChatConnection GetConnection(string account); /// <summary> /// 显示用户类型(按部门或显示所有用户) /// </summary> ShowUser ShowUserType { get; set; } } 2.发送消息窗体接口 /// <summary> /// 发送消息对话框接口 /// </summary> public interface ISendMsgProxy { /// <summary> /// 给发送消息窗体设置发送人和接收人 /// </summary> /// <param name="from"></param> /// <param name="to"></param> void SetConnection(ChatConnection from, ChatConnection to); /// <summary> /// 发送消息 /// </summary> /// <param name="msg"></param> void SendMessage(string msg); /// <summary> /// 接收人 /// </summary> ChatConnection TargetConnection { get; } /// <summary> /// 发送人 /// </summary> ChatConnection SenderConnection { get; } /// <summary> /// 显示消息 /// </summary> /// <param name="type"></param> /// <param name="msg"></param> void ShowMessage(ShowMessageType type, string msg); void ShowMessage(ShowMessageType type, ArrayList msgList); /// <summary> /// 显示窗体 /// </summary> void ShowMe(); } 3.用户资料及用户连线状态信息 /// <summary> /// 用户资料及用户连线状态信息 /// </summary> public class ChatConnection { private string _DisplayName = string.Empty; //DisplayName private string _Account = string.Empty; //Account private string _IP = string.Empty; //联系人地址 private int _Port = -1; private Image _PhotoIcon = null; //头像 private ChatState _State = ChatState.None; private ArrayList _receivedMsg = new ArrayList(); //收到的消息 private string _FactoryCode = string.Empty; /// <summary> /// 接受的信息 /// </summary> public ArrayList ReceivedMessage { get { return _receivedMsg; } } public ChatConnection() { } public ChatConnection(string displayName, string account, string factoryCode, string ip, int port, ChatState state) { _Account = account; _DisplayName = displayName; _IP = ip; _Port = port; _State = state; _FactoryCode = factoryCode; } /// <summary> /// 用户头像 /// </summary> public Image PhotoIcon { get { return _PhotoIcon; } set { _PhotoIcon = value; } } /// <summary> /// 连线状态 /// </summary> public ChatState ConnectionState { get { return _State; } set { _State = value; } } /// <summary> /// 端口 /// </summary> public int Port { get { return _Port; } set { _Port = value; } } /// <summary> /// 显示名称 /// </summary> public string DisplayName { get { return _DisplayName; } set { _DisplayName = value; } } /// <summary> /// 用户帐号 /// </summary> public string Account { get { return _Account; } set { _Account = value; } } public string FactoryCode { get { return _FactoryCode; } set { _FactoryCode = value; } } /// <summary> /// 用户IP地址 /// </summary> public string IP { get { return _IP; } set { _IP = value; } } public override string ToString() { return _DisplayName; } /// <summary> /// 更新连线资料 /// </summary> /// <param name="conn"></param> public void Update(ChatConnection conn) { this.Account = conn.Account; this.ConnectionState = conn.ConnectionState; this.DisplayName = conn.DisplayName; this.IP = conn.IP; this.PhotoIcon = conn.PhotoIcon; this.Port = conn.Port; } } 4. 消息定义(一个基类,及3个派生类) /// <summary> /// 消息定义基类 /// </summary> [Serializable] public class cmdBase { } //通知好友上线 [Serializable] public class cmdNotifyOnline : cmdBase { private string _sender = string.Empty; public string Sender { get { return _sender; } } private int _Port = -1; public int Port { get { return _Port; } } private string _IP = string.Empty; public string IP { get { return _IP; } } private string _FactoryCode = string.Empty; public string FactoryCode { get { return _FactoryCode; } } private string _NickName = string.Empty; public string NickName { get { return _NickName; } } public cmdNotifyOnline(string sender, string ip, int port, string factory, string nickName) { _sender = sender; _Port = port; _IP = ip; _FactoryCode = factory; _NickName = nickName; } } /// <summary> /// 用户登出时通知所有用户删除连接 /// </summary> [Serializable] public class cmdExit : cmdBase { private string _sender = string.Empty; public string Sender { get { return _sender; } } public cmdExit(string sender) { _sender = sender; } } /// <summary> /// 普通消息 /// </summary> [Serializable] public class cmdMessage : cmdBase { private string _Content = string.Empty;//消息内容 private string _Sender = string.Empty;//发送人 public string Content { get { return _Content; } } public string Sender { get { return _Sender; } } public cmdMessage(string sender, string msg) { _Sender = sender; _Content = msg; } } 程序:VS2008+DEV9.2X+SQL2005 版本v1.0 SQL连接配置: 修改debug\SystemSettings.xml 文件的ConnectionString ![]() 扫一扫加作者微信 ![]() ![]() C/S框架网原创作品,如转载请注明出处: by www.csframework.com Source Code for VIP:
参考文档:
C#实现QQ/MSN等客户端聊天软件从右下角弹出窗体(Popup Window) C#仿QQ聊天程序v1.0(IConnectionList接口实现) C#仿QQ聊天程序v1.0(客户端管理类) [原创]C#一键隐藏QQ/MSN,显示/隐藏系统托盘图标,获取托盘图标 C#.NET VS2015运行时调试Windows服务(宿主)承载的WCF程序 C#.NET VS2015运行时调试Windows服务承载的WCF程序(新) C# 阿里云ECS服务器SMTP发送邮件使用80端口 - 原创! .Net后端框架|WebApi服务端开发框架|C/S框架网原创作品 LianLian Pay 连连支付C#客户端测试程序-全网原创首发 原创产品-微信小程序APP服务端WebApi开发框架 WebApi后端框架服务端框架开发微信小程序订阅消息接口 WebApi服务端开发框架成功案例-对接三方支付平台连连支付C#.NET C#.NET IP端口绑定SSL证书支持HTTPS协议(用于Win服务自承载WebApi服务器) - C/S框架网原创 微信小程序后端框架 | C# ASP.NET服务端WebApi快速开发框架平台 CSFramework.COM原创:全球国家名称列表国旗图标库导入程序(C#+VS2015)
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 | |