//hàm chính trong tiểu trình nhận thông điệp public void bw_receive_DoWork(object sender, DoWorkEventArgs e) { DataTable dt_friend = null; while (socket.Connected) { try { //lưu thong tin tài khoản đăng kí string accountTemp; string usernameTemp; string passwordTemp; string emailTemp; //end byte[] buffer = new byte[4]; byte[] data;//lưu byte của tin nhắn dạng chữ byte[] dataPicture = new byte[10000]; int lengh; stream.Read(buffer, 0, 4); CommandType_ cmt; cmt = (CommandType_)BitConverter.ToInt32(buffer, 0); //if client vừa kết nối muốn đăng nhập if (cmt == CommandType_.Login) { buffer = new byte[4]; stream.Read(buffer, 0, 4); lengh = BitConverter.ToInt32(buffer, 0); data = new byte[lengh]; stream.Read(data, 0, lengh); accountTemp = Encoding.ASCII.GetString(data); stream.Read(buffer, 0, 4); lengh = BitConverter.ToInt32(buffer, 0); data = new byte[lengh]; stream.Read(data, 0, lengh); passwordTemp = Encoding.ASCII.GetString(data); //kiểm tra xem trong database có đúng tài khoản mật khẩu hay ko DataTable dt = new DataTable(); dt = Khachhang_BUS.Dangnhap(accountTemp, passwordTemp); if (dt.Rows.Count > 0) { //nếu đúng thì lấy username của tài khoản vừa đang nhâp this.userName = dt.Rows[0][1].ToString(); //kiểm tra client này đã có kết nối chưa if (IsOnline(this.userName) == null) { //đăng nhập thành công và gởi danh sách bạn Command cmd = new Command(CommandType_.LoginSuccess, dt); SendCommand(cmd); checkDangNhapSuccess = true; //nếu chưa kết nối5 Online(this.userName); ////lưu client vào List client Form1.listClient.Add(this); } else { //tài khoản này đã được đăng nhập bởi người khác Command cmd = new Command(CommandType_.NameExists); this.SendCommand(cmd); } } else { //đăng nhập thất bại.tài khoản hoặc mật khẩu không đúng Command cmd = new Command(CommandType_.Failure); this.SendCommand(cmd); } } //đăng kí 1 tài khoản mới if (cmt == CommandType_.Register) { //đọc username buffer = new byte[4]; stream.Read(buffer, 0, 4); lengh = BitConverter.ToInt32(buffer, 0); data = new byte[lengh]; stream.Read(data, 0, lengh); usernameTemp = Encoding.ASCII.GetString(data); //đọc account stream.Read(buffer, 0, 4); lengh = BitConverter.ToInt32(buffer, 0); data = new byte[lengh]; stream.Read(data, 0, lengh); accountTemp = Encoding.ASCII.GetString(data); //đọc password stream.Read(buffer, 0, 4); lengh = BitConverter.ToInt32(buffer, 0); data = new byte[lengh]; stream.Read(data, 0, lengh); passwordTemp = Encoding.ASCII.GetString(data); //đọc email stream.Read(buffer, 0, 4); lengh = BitConverter.ToInt32(buffer, 0); data = new byte[lengh]; stream.Read(data, 0, lengh); emailTemp = Encoding.ASCII.GetString(data); //kiểm tra tên người dùng và tài khoản có tồn tại chưa DataTable da = new DataTable(); da = Khachhang_BUS.Kiemtra_Dangki(accountTemp, usernameTemp); if (da.Rows.Count > 0) { Command cmd = new Command(CommandType_.RegisterFailure); this.SendCommand(cmd); } else { Image _imageTemp = (Image)Properties.Resources.ResourceManager.GetObject("_default"); MemoryStream ms = new MemoryStream(); ImageConverter imageConvert = new ImageConverter(); data = new byte[10000]; data = (byte[])imageConvert.ConvertTo(_imageTemp, typeof(byte[])); //data = ms.ToArray(); KhachHang_DTO kh_dto = new KhachHang_DTO(accountTemp, passwordTemp, usernameTemp, data, emailTemp); Khachhang_BUS.Add_kh(kh_dto); Command cmd = new Command(CommandType_.RegisterSuccess); this.SendCommand(cmd); _form1.AddShowClient(usernameTemp); } } if (cmt == CommandType_.LoadMessage) { buffer = new byte[4]; stream.Read(buffer, 0, 4); lengh = BitConverter.ToInt32(buffer, 0); data = new byte[lengh]; stream.Read(data, 0, lengh); usernameTemp = Encoding.ASCII.GetString(data); buffer = new byte[4]; stream.Read(buffer, 0, 4); int count = BitConverter.ToInt32(buffer, 0); DataTable dt = Khachhang_BUS.Load_message(count, this.userName, usernameTemp); Command cmd = new Command(CommandType_.LoadMessage, dt); this.SendCommand(cmd); } //nếu thông điệp nhận được là 1 tin nhắn trao đổi với server if (cmt == CommandType_.Message) { //đọc nội dung tin nhắn string cmdMetaData = ""; buffer = new byte[4]; if (stream.Read(buffer, 0, 4) == 0) { // nó read = 0 co' nghia~ la`ben kia da ngat ket noi int a = 5; //cái này là server //ko thấy lỗi đâu //bên client đọc } int lenght = BitConverter.ToInt32(buffer, 0); byte[] metaBuffer = new byte[lenght]; stream.Read(metaBuffer, 0, lenght); cmdMetaData = Encoding.ASCII.GetString(metaBuffer); //đọc font stream.Read(buffer, 0, 4); lenght = BitConverter.ToInt32(buffer, 0); metaBuffer = new byte[lenght]; stream.Read(metaBuffer, 0, lenght); //convert byte sang font MemoryStream s = new MemoryStream(metaBuffer); BinaryFormatter bf = new BinaryFormatter(); Font temp = new Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular); temp = (Font)bf.Deserialize(s); //gọi form chat thông qua delegate _form1.Invoke(new Action(delegate() { // nếu chưa tồn tại hoặc đã BỊ tắt thÌ khởi tạo lại if (chat == null || chat.IsDisposed) { chat = new Chat(this); chat.Show(); } })); //gởi yin nhắn đã nhận được cho form chat vừa khởi tạo để hiển thị lên form chat.Receive(cmdMetaData, temp); } //tin nhắn trao đổi giữa những người trong danh sách bạn if (cmt == CommandType_.MessageFriend) { buffer = new byte[4]; stream.Read(buffer, 0, 4); lengh = BitConverter.ToInt32(buffer, 0); data = new byte[lengh]; stream.Read(data, 0, lengh); usernameTemp = Encoding.ASCII.GetString(data); //đọc nội dung tin nhắn string cmdMetaData = ""; buffer = new byte[4]; stream.Read(buffer, 0, 4); int lenght = BitConverter.ToInt32(buffer, 0); byte[] metaBuffer = new byte[lenght]; stream.Read(metaBuffer, 0, lenght); byte[] _content = metaBuffer; cmdMetaData = Encoding.ASCII.GetString(metaBuffer); //đọc font stream.Read(buffer, 0, 4); lenght = BitConverter.ToInt32(buffer, 0); metaBuffer = new byte[lenght]; stream.Read(metaBuffer, 0, lenght); byte[] _font = metaBuffer; //convert byte sang font string _time = DateTime.Now.ToString(); Khachhang_BUS.Save_message(this.userName, usernameTemp, _content, metaBuffer, _time); MemoryStream s = new MemoryStream(metaBuffer); BinaryFormatter bf = new BinaryFormatter(); Font temp = new Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular); temp = (Font)bf.Deserialize(s); Command cmd = new Command(CommandType_.MessageFriend, this.userName, cmdMetaData, temp); ClientManager clm = null; for (int i = 0; i < Form1.listClient.Count; i++) { if (Form1.listClient[i].userName == usernameTemp) { clm = Form1.listClient[i]; break; } } if (clm != null) { clm.SendCommand(cmd); } } if (cmt == CommandType_.ListFriend) { dt_friend = Khachhang_BUS.Loadds_FRIEND(this.userName); Command cmd = new Command(CommandType_.ListFriend, dt_friend); this.SendCommand(cmd); } if (cmt == CommandType_.FindFriend) { buffer = new byte[4]; stream.Read(buffer, 0, 4); lengh = BitConverter.ToInt32(buffer, 0); data = new byte[lengh]; stream.Read(data, 0, lengh); usernameTemp = Encoding.ASCII.GetString(data); DataTable dt = Khachhang_BUS.FindFriend(usernameTemp); //có tồn tại username này trong danh sách --trả thông tin của username này về cho client if (dt.Rows.Count > 0) { Command cmd = new Command(CommandType_.Found, dt.Rows[0][1].ToString(), dt.Rows[0][4].ToString(), (byte[])dt.Rows[0][5]); this.SendCommand(cmd); } else { Command cmd = new Command(CommandType_.NotFound); this.SendCommand(cmd); } } if (cmt == CommandType_.LoadNotice) { DataTable dt = Khachhang_BUS.LoadNotice(this.userName); Command cmd = new Command(CommandType_.LoadNotice, dt); this.SendCommand(cmd); } if (cmt == CommandType_.AddNotice) { stream.Read(buffer, 0, 4); int lenght = BitConverter.ToInt32(buffer, 0); data = new byte[lenght]; stream.Read(data, 0, lenght); string _userPrimary = Encoding.ASCII.GetString(data); stream.Read(buffer, 0, 4); lenght = BitConverter.ToInt32(buffer, 0); data = new byte[lenght]; stream.Read(data, 0, lenght); string _userReference = Encoding.ASCII.GetString(data); stream.Read(buffer, 0, 4); lenght = BitConverter.ToInt32(buffer, 0); data = new byte[lenght]; stream.Read(data, 0, lenght); string _type = Encoding.ASCII.GetString(data); string _time = DateTime.Now.ToString(); NOTICE_DTO notice = new NOTICE_DTO(_userPrimary, _userReference, _type, "", _time); DataTable dt = Khachhang_BUS.AddNotice(notice); if (int.Parse(dt.Rows[0][0].ToString()) == 0) { Command cmd = new Command(CommandType_.AddFriendFailure); this.SendCommand(cmd); } if (int.Parse(dt.Rows[0][0].ToString()) == 1) { Command cmd = new Command(CommandType_.AddNoticeFailure); this.SendCommand(cmd); } if (int.Parse(dt.Rows[0][0].ToString()) == 2) { Command cmd = new Command(CommandType_.AddNoticeSuccess); this.SendCommand(cmd); } } if (cmt == CommandType_.ChangeInformation) { stream.Read(buffer, 0, 4); int lenght = BitConverter.ToInt32(buffer, 0); data = new byte[lenght]; stream.Read(data, 0, lenght); string _email = Encoding.ASCII.GetString(data); //đọc avatar Image image; stream.Read(buffer, 0, 4); lenght = BitConverter.ToInt32(buffer, 0); dataPicture = new byte[lenght]; ReadBigData(stream, lenght, ref dataPicture); //status stream.Read(buffer, 0, 4); lenght = BitConverter.ToInt32(buffer, 0); data = new byte[lenght]; stream.Read(data, 0, lenght); //string _status = Encoding.ASCII.GetString(data); Khachhang_BUS.Change_information(this.userName, _email, dataPicture, data); } if (cmt == CommandType_.AddFriend) { stream.Read(buffer, 0, 4); int lenght = BitConverter.ToInt32(buffer, 0); data = new byte[lenght]; stream.Read(data, 0, lenght); string _userPrimary = Encoding.ASCII.GetString(data); stream.Read(buffer, 0, 4); lenght = BitConverter.ToInt32(buffer, 0); data = new byte[lenght]; stream.Read(data, 0, lenght); string _userReference = Encoding.ASCII.GetString(data); string _time = DateTime.Now.ToString(); NOTICE_DTO notice = new NOTICE_DTO(_userReference, _userPrimary, "2", "", _time); Khachhang_BUS.AddNotice(notice); Khachhang_BUS.Add_Friend(_userPrimary, _userReference); Khachhang_BUS.DeleteNotice(_userPrimary, _userReference); Command cmd = new Command(CommandType_.DeleteNoticeSuccess); this.SendCommand(cmd); ClientManager cmTemp; //gởi trạng thái của friend if ((cmTemp = IsOnline(_userReference)) != null) { Command _cmd = new Command(CommandType_.ListFriend, Khachhang_BUS.Loadds_FRIEND(_userReference)); cmTemp.SendCommand(_cmd); } } if (cmt == CommandType_.DeleteNotice) { stream.Read(buffer, 0, 4); int lenght = BitConverter.ToInt32(buffer, 0); data = new byte[lenght]; stream.Read(data, 0, lenght); string _userPrimary = Encoding.ASCII.GetString(data); stream.Read(buffer, 0, 4); lenght = BitConverter.ToInt32(buffer, 0); data = new byte[lenght]; stream.Read(data, 0, lenght); string _userReference = Encoding.ASCII.GetString(data); Khachhang_BUS.DeleteNotice(_userPrimary, _userReference); Command cmd = new Command(CommandType_.DeleteNoticeSuccess); this.SendCommand(cmd); } } catch { //kết nối bên client bị đóng if (checkDangNhapSuccess) { Offline(this); if ((dt_friend = Khachhang_BUS.Loadds_FRIEND(this.userName)) != null) { int _CountTemp;//lưu số lượng friend của user _CountTemp = dt_friend.Rows.Count; for (int i = 0; i < _CountTemp; i++) { ClientManager cmTemp; //gởi trạng thái của friend if ((cmTemp = IsOnline(dt_friend.Rows[i][0].ToString())) != null) { Command _cmd = new Command(CommandType_.Offline, this.userName); cmTemp.SendCommand(_cmd); } } } } socket.Close(); } } //đóng kết nồi //Form1.listClient[1]._userName = "******"; }
//hàm chính trong tiểu trình nhận thông điệp public void bw_receive_DoWork(object sender, DoWorkEventArgs e) { while (socket.Connected) { try { string user;//lưu tên người dùng vừa đăng nhập //lưu thong tin tài khoản đăng kí string account; string username; string password; string email; //end byte[] buffer = new byte[4]; byte[] data;//lưu byte của tin nhắn dạng chữ byte[] dataPicture = new byte[10000]; NetworkStream stream; stream = new NetworkStream(socket); stream.Read(buffer, 0, 4); CommandType_ cmt; cmt = (CommandType_)BitConverter.ToInt32(buffer, 0); //if client vừa kết nối muốn đăng nhập if (cmt == CommandType_.Login) { buffer = new byte[4]; stream.Read(buffer, 0, 4); int lengh = BitConverter.ToInt32(buffer, 0); data = new byte[lengh]; stream.Read(data, 0, lengh); account = Encoding.ASCII.GetString(data); stream.Read(buffer, 0, 4); lengh = BitConverter.ToInt32(buffer, 0); data = new byte[lengh]; stream.Read(data, 0, lengh); password = Encoding.ASCII.GetString(data); //kiểm tra xem trong database có đúng tài khoản mật khẩu hay ko DataTable dt = new DataTable(); dt = Khachhang_BUS.Dangnhap(account, password); if (dt.Rows.Count > 0) { //nếu đúng thì lấy username của tài khoản vừa đang nhâp user = dt.Rows[0][1].ToString(); //kiểm tra client này đã có kết nối trước chưa if (!IsOnline(user)) { //nếu chưa từng kết nối this.userName = user; buffer = BitConverter.GetBytes((int)CommandType_.LoginSuccess);//gởi tin nhắn là đã chấp nhận kết nối stream.Write(buffer, 0, 4); stream.Flush(); //gởi tên user qua cho client data = new byte[user.Length]; buffer = BitConverter.GetBytes(user.Length); stream.Write(buffer, 0, 4); stream.Flush(); data = Encoding.ASCII.GetBytes(user); stream.Write(data, 0, user.Length); stream.Flush(); //gởi avatar cho user dataPicture = (byte[])dt.Rows[0][5]; lengh = dataPicture.Length; buffer = BitConverter.GetBytes(lengh); stream.Write(buffer, 0, 4); stream.Flush(); stream.Write(dataPicture, 0, lengh); stream.Flush(); Online(user); //gởi list danh sách bạn dt = Khachhang_BUS.Loadds_FRIEND(user); int _CountTemp;//lưu số lượng friend của user _CountTemp = dt.Rows.Count; buffer = BitConverter.GetBytes(_CountTemp); stream.Write(buffer, 0, 4); stream.Flush(); for (int i = 0; i < _CountTemp; i++) { //gởi tên userFriend buffer = BitConverter.GetBytes(dt.Rows[i][0].ToString().Length); stream.Write(buffer, 0, 4); stream.Flush(); data = new byte[dt.Rows[i][0].ToString().Length]; data = Encoding.ASCII.GetBytes(dt.Rows[i][0].ToString()); stream.Write(data, 0, dt.Rows[i][0].ToString().Length); stream.Flush(); //gởi avatar cho user dataPicture = (byte[])dt.Rows[i][1]; lengh = dataPicture.Length; buffer = BitConverter.GetBytes(lengh); stream.Write(buffer, 0, 4); stream.Flush(); stream.Write(dataPicture, 0, lengh); stream.Flush(); } ////lưu client vào List client Form1.listClient.Add(this); } else { //client này đã kết nối ,gởi tin nhắn đăng nhập đã tồn tại buffer = BitConverter.GetBytes((int)CommandType_.NameExists); stream.Write(buffer, 0, 4); stream.Flush(); } } else { //nếu tài khoản hoặc mật khẩu không đúng buffer = BitConverter.GetBytes((int)CommandType_.Failure);//gởi tin nhắn là kết nối ko thành công stream.Write(buffer, 0, 4); stream.Flush(); } } if (cmt == CommandType_.Register) { //đọc username buffer = new byte[4]; stream.Read(buffer, 0, 4); int lengh = BitConverter.ToInt32(buffer, 0); data = new byte[lengh]; stream.Read(data, 0, lengh); username = Encoding.ASCII.GetString(data); //đọc account stream.Read(buffer, 0, 4); lengh = BitConverter.ToInt32(buffer, 0); data = new byte[lengh]; stream.Read(data, 0, lengh); account = Encoding.ASCII.GetString(data); //đọc password stream.Read(buffer, 0, 4); lengh = BitConverter.ToInt32(buffer, 0); data = new byte[lengh]; stream.Read(data, 0, lengh); password = Encoding.ASCII.GetString(data); //đọc email stream.Read(buffer, 0, 4); lengh = BitConverter.ToInt32(buffer, 0); data = new byte[lengh]; stream.Read(data, 0, lengh); email = Encoding.ASCII.GetString(data); //kiểm tra tên người dùng và tài khoản có tồn tại chưa DataTable da = new DataTable(); da = Khachhang_BUS.Kiemtra_Dangki(account, username); if (da.Rows.Count > 0) { buffer = BitConverter.GetBytes((int)CommandType_.RegisterFailure);//gởi tin nhắn là đăng kí thất bại stream.Write(buffer, 0, 4); stream.Flush(); } else { Image _imageTemp = (Image)Properties.Resources.ResourceManager.GetObject("_default"); MemoryStream ms = new MemoryStream(); ImageConverter imageConvert = new ImageConverter(); data = new byte[10000]; data = (byte[])imageConvert.ConvertTo(_imageTemp, typeof(byte[])); //data = ms.ToArray(); KhachHang_DTO kh_dto = new KhachHang_DTO(account, password, username, data, email); Khachhang_BUS.Add_kh(kh_dto); buffer = BitConverter.GetBytes((int)CommandType_.RegisterSuccess);//gởi tin nhắn là đăng kí thành công stream.Write(buffer, 0, 4); stream.Flush(); _form1.AddShowClient(username); } } //nếu thông điệp nhận được là 1 tin nhắn if (cmt == CommandType_.Message) { //đọc nội dung tin nhắn string cmdMetaData = ""; buffer = new byte[4]; stream.Read(buffer, 0, 4); int lenght = BitConverter.ToInt32(buffer, 0); byte[] metaBuffer = new byte[lenght]; stream.Read(metaBuffer, 0, lenght); cmdMetaData = Encoding.ASCII.GetString(metaBuffer); //đọc font stream.Read(buffer, 0, 4); lenght = BitConverter.ToInt32(buffer, 0); metaBuffer = new byte[lenght]; stream.Read(metaBuffer, 0, lenght); //convert byte sang font MemoryStream s = new MemoryStream(metaBuffer); BinaryFormatter bf = new BinaryFormatter(); Font temp = new Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular); temp = (Font)bf.Deserialize(s); //gọi form chat thông qua delegate _form1.Invoke(new Action(delegate() { // nếu chưa tồn tại hoặc đã BỊ tắt thÌ khởi tạo lại if (chat == null || chat.IsDisposed) { chat = new Chat(this); chat.Show(); } })); //gởi yin nhắn đã nhận được cho form chat vừa khởi tạo để hiển thị lên form chat.Receive(cmdMetaData, temp); } } catch { //kết nối bên client bị đóng Offline(this._userName); } } //đóng kết nồi socket.Close(); //Form1.listClient[1]._userName = "******"; }