/// <summary> /// 应客户端要求建立连接后的处理线程 /// </summary> /// <param name="ia"></param> private void AcceptCallBack(IAsyncResult ar) { try { //定义一个新的客户端对象 Session state = (Session)ar.AsyncState; Socket client = state._workSocket; #region === 消息处理 === //登录成功,则进入消息等待中 int RevNumber = 0; if (client.Connected) { #region === 正常或非正常的断线处理 === try { RevNumber = client.EndReceive(ar); } catch { if (ChatEvent != null) { ChatEvent(this, new ChatEventArgs() { CmdId = "OUT", From = this._id, To = 0, Content = this._name }); } return; } if (RevNumber == 0) { if (ChatEvent != null) { ChatEvent(this, new ChatEventArgs() { CmdId = "OUT", From = this._id, To = 0, Content = this._name }); } return; } #endregion DataFrame dr = new DataFrame(RecvDataBuffer); string content = dr.Text; string[] msgs = content.Split(','); if (msgs[0] == "LIN") { this._name = content.Substring(8); //通知其他客户端有人上线了 if (ChatEvent != null) { ChatEventArgs args = new ChatEventArgs(); args.CmdId = "LIN"; args.From = this._id; args.To = 0; args.Content = this._name; ChatEvent(this, new ChatEventArgs() { CmdId = "LIN", From = this._id, To = 0, Content = this._name }); } } else if (msgs[0] == "MSG") { //聊天 if (ChatEvent != null) { ChatEvent(this, new ChatEventArgs() { CmdId = "MSG", From = Convert.ToInt32(msgs[1]), To = Convert.ToInt32(msgs[2]), Content = content.Substring(msgs[0].Length + msgs[1].Length + msgs[2].Length + 3) }); } } else { //下线 if (ChatEvent != null) { ChatEvent(this, new ChatEventArgs() { CmdId = "OUT", From = this._id, To = 0, Content = this._name }); } } //继续接收来自来客户端的数据 client.BeginReceive(RecvDataBuffer, 0, RecvDataBuffer.Length, SocketFlags.None, new AsyncCallback(AcceptCallBack), state); } #endregion } catch { } }
/// <summary> /// 往关联的客户端发送数据 /// </summary> public void Send(string message) { DataFrame dr = new DataFrame(message); _workSocket.Send(dr.GetBytes()); }
void state_ChatEvent(object sender, ChatEventArgs e) { if (e.CmdId == "LIN") { Session ss = (Session)sender; DataFrame dr = new DataFrame(OnlineClients); ss.Send("OLN,0," + e.From + "," + dr.Text); SendToAll(e.From, e.ToString()); } else if (e.CmdId == "MSG") { if (e.To == 0) { SendToAll(e.From, e.ToString()); } else { SendToOne(e.To, e.ToString()); } } else { m_clients.Remove(e.From); SendToAll(e.From, e.ToString()); } }