1: using EAS.Sockets;
2: using ChatRoom.Messages;
3: using System;
4: using System.Collections.Generic;
5: using System.Linq;
6: using System.Text;
7: using System.Runtime.CompilerServices;
8:
9: namespace ChatRoom.Socket
10: {
11: class ChatRoomContext
12: {
13: #region 单例模式
14:
15: private static object m_Lock = new object();
16: private static ChatRoomContext m_Instance = null;
17:
18: public static ChatRoomContext Instance
19: {
20: get
21: {
22: if (m_Instance == null)
23: {
24: lock (m_Lock)
25: {
26: if (m_Instance == null)
27: {
28: m_Instance = new ChatRoomContext();
29: }
30: }
31: }
32:
33: return m_Instance;
34:
35: }
36: }
37:
38: ChatRoomContext()
39: {
40: this.m_LoginInfos = new List<LoginInfo>();
41: this.m_OnLineMessage = new OnLineMessage();
42: }
43:
44: #endregion
45:
46: ISocketServerBase m_SocketServer = null;
47: List<LoginInfo> m_LoginInfos = null;
48: OnLineMessage m_OnLineMessage = null;
49:
50: /// <summary>
51: /// Socket服务器。
52: /// </summary>
53: public ISocketServerBase SocketServer
54: {
55: get
56: {
57: return this.m_SocketServer;
58: }
59: set
60: {
61: this.m_SocketServer = value;
62: }
63: }
64:
65: /// <summary>
66: /// 会话集合。
67: /// </summary>
68: public List<LoginInfo> LoginInfos
69: {
70: get
71: {
72: return this.m_LoginInfos;
73: }
74: }
75:
76: /// <summary>
77: /// 在线清单信息。
78: /// </summary>
79: public OnLineMessage OnLineMessage
80: {
81: get
82: {
83: return this.m_OnLineMessage;
84: }
85: }
86:
87: /// <summary>
88: /// 根据Socket会话求上下文信息。
89: /// </summary>
90: /// <param name="sessionID"></param>
91: /// <returns></returns>
92: public LoginInfo GetLoginInfo(Guid sessionID)
93: {
94: LoginInfo v = null;
95: lock (this.m_LoginInfos)
96: {
97: v = this.m_LoginInfos.Where(p => p.Session.SessionID == sessionID).FirstOrDefault();
98: }
99:
100: return v;
101: }
102:
103: /// <summary>
104: /// 根据账号求上下文信息。
105: /// </summary>
106: /// <param name="LoginID"></param>
107: /// <returns></returns>
108: public LoginInfo GetLoginInfo(string LoginID)
109: {
110: LoginInfo v = null;
111: lock (this.m_LoginInfos)
112: {
113: v = this.m_LoginInfos.Where(p => p.LoginID == LoginID).FirstOrDefault();
114: }
115:
116: return v;
117: }
118:
119: /// <summary>
120: /// 登录注册上下文。
121: /// </summary>
122: /// <param name="info"></param>
123: public void Add(LoginInfo info)
124: {
125: lock (this.m_LoginInfos)
126: {
127: int count = this.m_LoginInfos.Where
128: (p => p.Session.SessionID == info.Session.SessionID
129: && p.LoginID == info.LoginID
130: ).Count();
131:
132: if (count == 0)
133: {
134: this.m_LoginInfos.Add(info);
135: info.Session.ClientClosed += Session_ClientClosed;
136: }
137: }
138:
139: this.CreateOnLineMesssage();
140: }
141:
142: /// <summary>
143: /// 链接关机上下文。
144: /// </summary>
145: /// <param name="session"></param>
146: public void Remove(Guid session)
147: {
148: lock (this.m_LoginInfos)
149: {
150: LoginInfo info = this.m_LoginInfos.Where(p => p.Session.SessionID == session).FirstOrDefault();
151:
152: if (info != null)
153: {
154: this.m_LoginInfos.Remove(info);
155: info.Session.ClientClosed -= new EventHandler(Session_ClientClosed);
156: }
157: }
158: }
159:
160: /// <summary>
161: /// 生成在线清单信息。
162: /// </summary>
163: [MethodImpl(MethodImplOptions.Synchronized)]
164: void CreateOnLineMesssage()
165: {
166: this.m_OnLineMessage = new OnLineMessage();
167: lock (this.m_LoginInfos)
168: {
169: foreach (var item in this.m_LoginInfos)
170: {
171: OnLine onLine = new OnLine();
172: onLine.LoginID = item.LoginID;
173: onLine.Name = item.User.Name;
174: this.m_OnLineMessage.OnLines.Add(onLine);
175: }
176: }
177: }
178:
179: /// <summary>
180: /// 客户段连接断开,用户下线。
181: /// </summary>
182: /// <param name="sender"></param>
183: /// <param name="e"></param>
184: private void Session_ClientClosed(object sender, EventArgs e)
185: {
186: NetSession session = sender as NetSession;
187: LoginInfo loginInfo = this.GetLoginInfo(session.SessionID);
188: this.Remove(session.SessionID);
189: this.CreateOnLineMesssage();
190:
191: //向其他用户发生下线通稿。
192: UserStateMessage userState = new UserStateMessage();
193: userState.OnLine = false;
194: userState.User = loginInfo.User;
195:
196: lock (this.m_LoginInfos)
197: {
198: foreach (var item in this.m_LoginInfos)
199: {
200: ChatRoomContext.Instance.SocketServer.Send(item.Session.SessionID, userState);
201: }
202: }
203: }
204: }
205: }