[原创]C#仿QQ聊天程序(点对点无服务端, P2P)
[原创]C#仿QQ聊天程序(点对点无服务端, P2P)![[原创]C#仿QQ聊天程序(点对点无服务端, P2P) [原创]C#仿QQ聊天程序(点对点无服务端, P2P)](http://www.csframework.com/images/seo/SEO-%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91.jpg)
本程序是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; }
}
/// 用户在线列表接口
/// </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();
}
/// 发送消息对话框接口
/// </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;
}
}
/// 用户资料及用户连线状态信息
/// </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;
}
}
/// 消息定义基类
/// </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聊天程序v1.0(客户端管理类)
C#仿QQ聊天程序v1.0(IConnectionList接口实现)
[原创]C#一键隐藏QQ/MSN,显示/隐藏系统托盘图标,获取托盘图标
[原创]C# UDP穿越NAT,UDP打洞,UDP Hole Punching源代码(2)
[原创]C# UDP穿越NAT,UDP打洞,UDP Hole Punching源代码(1)
【原创】WCF开发框架 - 采用wsHttpBinding及basicHttpBinding连接https协议的WCF服务
CSFramework.COM原创:全球国家名称列表国旗图标库导入程序(C#+VS2015)
原创:SQLJOB作业自动备份数据库并自动清除备份历史记录
原创:C#源码 GridMovetor按回车自动跳到下一列或自动新增记录(www.csframework.com)
原创:C/S架构快速开发框架通用可配置的数据修改日志解决方案
【原创】WebApi开发框架:Token生成、Token缓存原理、Token验证、令牌机制与原理
【原创】C# Winform Dev自动下拉弹框筛选数据PopupContainerEdit组件
【原创】C# Dev用户自定义组件,自动下拉弹框表格过滤数据组件ucMyLookUpEdit
【原创】C# 深度拷贝对象 使用.NET反射+递归原理实现深度克隆
原创Winform快速开发框架平台Oracle版本(三层架构+C#.NET+Oracle数据库)
C#微信支付完成前端回调通知notify_url完整版源码|CSframework.com原创文章
C#仿QQ聊天程序v1.0(客户端管理类)
C#仿QQ聊天程序v1.0(IConnectionList接口实现)
[原创]C#一键隐藏QQ/MSN,显示/隐藏系统托盘图标,获取托盘图标
[原创]C# UDP穿越NAT,UDP打洞,UDP Hole Punching源代码(2)
[原创]C# UDP穿越NAT,UDP打洞,UDP Hole Punching源代码(1)
【原创】WCF开发框架 - 采用wsHttpBinding及basicHttpBinding连接https协议的WCF服务
CSFramework.COM原创:全球国家名称列表国旗图标库导入程序(C#+VS2015)
原创:SQLJOB作业自动备份数据库并自动清除备份历史记录
原创:C#源码 GridMovetor按回车自动跳到下一列或自动新增记录(www.csframework.com)
原创:C/S架构快速开发框架通用可配置的数据修改日志解决方案
【原创】WebApi开发框架:Token生成、Token缓存原理、Token验证、令牌机制与原理
【原创】C# Winform Dev自动下拉弹框筛选数据PopupContainerEdit组件
【原创】C# Dev用户自定义组件,自动下拉弹框表格过滤数据组件ucMyLookUpEdit
【原创】C# 深度拷贝对象 使用.NET反射+递归原理实现深度克隆
原创Winform快速开发框架平台Oracle版本(三层架构+C#.NET+Oracle数据库)
C#微信支付完成前端回调通知notify_url完整版源码|CSframework.com原创文章
其它资料:
什么是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内容管理系统 |
什么是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内容管理系统 |
在线客服
