void Process(SendObject obj) { //Console.WriteLine("Receive: " + obj.type); switch (obj.type) { case SendObject.INIT: frmMain.EventInit((InitData)obj.data); break; case SendObject.SELECT_REMOTE: frmMain.EventSelectRemote((SelectData)obj.data); break; case SendObject.TRANSLATE_REMOTE: frmMain.EventTranslateRemote((TranslateData)obj.data); break; case SendObject.ROTATE_REMOTE: frmMain.EventRotateRemote(); break; case SendObject.APPEND_MAIN: frmMain.EventAppendMain(); break; case SendObject.SELECT_MAIN: frmMain.EventSelectMain((SelectData)obj.data); break; case SendObject.TRANSLATE_MAIN: frmMain.EventTranslateMain((TranslateData)obj.data); break; case SendObject.ROTATE_MAIN: frmMain.EventRotateMain(); break; case SendObject.WIN: frmMain.EventWin(); break; case SendObject.LOCK_REMOTE: frmMain.EventLockRemote((SelectData)obj.data); break; case SendObject.UNLOCK_REMOTE: frmMain.EventUnlockRemote(); break; case SendObject.LOCK_MAIN: frmMain.EventLockMain((SelectData)obj.data); break; case SendObject.UNLOCK_MAIN: frmMain.EventUnlockMain((TranslateData)obj.data); break; } }
private void timer_Tick(object sender, EventArgs e) { if (isDragging) { var data = new TranslateData(selectedPiece.mainPiece.rect.Left, selectedPiece.mainPiece.rect.Top, selectedPiece.x, selectedPiece.y); Send(new SendObject(SendObject.TRANSLATE_MAIN, data)); } else if (frmRemote.isDragging) { var data = new TranslateData(frmRemote.selectedPiece.remotePiece.rect.Left, frmRemote.selectedPiece.remotePiece.rect.Top); Send(new SendObject(SendObject.TRANSLATE_REMOTE, data)); } if (sendObjects.Count > 0) { SendObject obj = sendObjects.Dequeue(); if (isServer) { server.Send(obj); } else { client.Send(obj); } } }
// hàm xử lý các sự kiện nhận được, swich case luôn cho đơn giản void Process(SendObject obj) { // ngoài switch case có thể tối ưu hóa bằng delegate (một mảng các hàm) // delegate [] func, func[0] = frmMain.EventInit, func[1] = frmMain.EventSelectRemote ... //Console.WriteLine("Receive: " + obj.type); switch (obj.type) { case SendObject.INIT: frmMain.EventInit((InitData)obj.data); break; case SendObject.SELECT_REMOTE: frmMain.EventSelectRemote((SelectData)obj.data); break; case SendObject.TRANSLATE_REMOTE: frmMain.EventTranslateRemote((TranslateData)obj.data); break; case SendObject.ROTATE_REMOTE: frmMain.EventRotateRemote(); break; case SendObject.APPEND_MAIN: frmMain.EventAppendMain(); break; case SendObject.SELECT_MAIN: frmMain.EventSelectMain((SelectData)obj.data); break; case SendObject.TRANSLATE_MAIN: frmMain.EventTranslateMain((TranslateData)obj.data); break; case SendObject.ROTATE_MAIN: frmMain.EventRotateMain(); break; case SendObject.WIN: frmMain.EventWin(); break; case SendObject.LOCK_REMOTE: frmMain.EventLockRemote((SelectData)obj.data); break; case SendObject.UNLOCK_REMOTE: frmMain.EventUnlockRemote(); break; case SendObject.LOCK_MAIN: frmMain.EventLockMain((SelectData)obj.data); break; case SendObject.UNLOCK_MAIN: frmMain.EventUnlockMain((TranslateData)obj.data); break; } }
byte[] Serialize(SendObject obj) { MemoryStream stream = new MemoryStream(); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, obj); return(stream.ToArray()); }
// gửi dữ liệu, chỉ cần gửi cho một thằng, chính là server, ở đây client // chính là thằng server đã kết nối đến public void Send(SendObject obj) { //Console.WriteLine("Send: " + obj.type); try { if (client != null) { client.Send(Serialize(obj)); } } catch { } }
// hàm gửi sự kiện public void Send(SendObject obj) { //Console.WriteLine("Send: " + obj.type); // khi gửi thì phải gửi cho tất cả các client try { foreach (Socket item in clientList) { if (item != null) { // mã hóa xong mới được gửi item.Send(Serialize(obj)); } } } catch { } }
// hàm lắng nghe nhận dữ liệu, giống với bên server, cũng nhận, giải mã, xử lý, lỗi thì đóng kết nối void Receive() { try { while (isActive) { byte[] data = new byte[Size]; Size = SIZE; client.Receive(data); SendObject o = Deserialize(data); Process(o); } } catch { MessageBox.Show("Mất kết nối đến máy chủ"); Close(); } }
// hàm nhận sự kiện void Receive(Object obj) { Socket client = obj as Socket; try { while (isActive) { // khởi tạo mảng data, đồng thời hàm Receive là lắng nghe client đó bắn dữ liệu // nếu client đó bắn dữ liệu, server nhận được thì sẽ đưa dữ liệu đó vào mảng data, chương trình // sẽ chạy tiếp xuống lệnh bên dưới, chạy xong lại quay lại một vòng lặp, lắng nghe tiếp byte[] data = new byte[SIZE]; client.Receive(data); // giải mã mảng data vừa nhận để đưa nó về SendObject SendObject o = Deserialize(data); // và xử lý nó Process(o); foreach (Socket item in clientList) { if (item != null && item != client) { // đồng thời server phải gửi dữ liệu cho tất cả các client mà ko phải thằng client đã gửi // để tất cả các máy đồng bộ item.Send(Serialize(o)); } } } } catch { // client lỗi thì xóa nó luôn clientList.Remove(client); client.Close(); } }
/* Mạng LAN */ // mỗi form có thể là server hoặc client, chức năng của mình là gì thì làm việc đấy public void Send(SendObject obj) { sendObjects.Enqueue(obj); }