// khi client kết nối đến server, server sẽ gửi lại toàn bộ thông tin các thuộc tính // của mình, client sẽ khởi tạo dựa theo các thuộc tính đó, gán lại hết luôn public void EventInit(InitData data) { col = data.col; row = data.row; WP = data.WP; HP = data.HP; map = data.map; map1 = data.map1; map2 = data.map2; indexPiece = data.indexPiece; pieces = data.pieces; selectedPiece = data.selectedPiece; image = data.image; frmRemote.index = data.remoteIndex; frmRemote.pieces = data.pieces; frmRemote.selectedPiece = data.selectedPiece; countPieces = data.pieces.Count; frmHelp.pictureBox.Image = image; mainPic.Enabled = true; frmRemote.remotePic.Enabled = true; Invoke((MethodInvoker) delegate() { frmRemote.Show(); }); mainPic.Invalidate(); frmRemote.remotePic.Invalidate(); cbHelp.Enabled = true; numCol.Value = data.col; numRow.Value = data.row; frmRemote.lblSelected.Text = data.remoteIndex.ToString(); }
// hàm tạo kết nối void Connect() { try { // khởi tạo một danh sách client clientList = new List <Socket>(); // mấy bước khởi tạo server, IPAddress.Any nghĩa là client IP nào cũng kết nối được // Port = 9999 thì chọn bừa cũng được, miễn là giống với Port bên client, kiểu // 2 thằng phải vào cùng một chỗ mới gặp nhau được IP = new IPEndPoint(IPAddress.Any, 9999); server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); server.Bind(IP); // khởi tạo xong thì tạo một luồng chạy ngầm liên tục lắng nghe mấy thằng kết nối đến Thread Listen = new Thread(() => { try { while (isActive) { // ở đây, server sẽ lắng nghe, đợi client kết nối đến // các lệnh bên dưới sẽ ko chạy cho đến khi nào có một client kết nối đến // nếu một client kết nối đến, các lệnh khởi tạo bên dưới sẽ được chạy và // vòng lặp lại quay về đây, server lại lắng nghe tiếp client khác // max 4 client server.Listen(4); // client kết nối thì chấp nhận và lưu client đó lại, thêm vào danh sách các client Socket client = server.Accept(); clientList.Add(client); // đồng thời gửi sự kiện khởi tạo cho client đó để client đó sao chép dữ liệu cho giống với server var data = new InitData(frmMain.row, frmMain.col, frmMain.WP, frmMain.HP, frmMain.map, frmMain.map1, frmMain.map2, frmMain.indexPiece, frmMain.pieces, frmMain.selectedPiece, frmMain.image, frmRemote.index, frmRemote.selectedPiece); client.Send(Serialize(new SendObject(SendObject.INIT, data))); // đồng thời tạo thêm một luồng để nhận dữ liệu từ client này // có bao nhiêu client thì phải tạo thêm bấy nhiêu luồng Thread receive = new Thread(Receive); receive.IsBackground = true; receive.Start(client); } } catch { IP = new IPEndPoint(IPAddress.Any, 9999); server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); } }); Listen.IsBackground = true; Listen.Start(); } catch { isActive = false; MessageBox.Show("Không thể tạo"); } }