You are on page 1of 18

1|Lp Trnh Mng _ ng dng lp trnh socket l p trnh phn mm chat

trong Mng LAN

Mc Lc
Tng Quan V Lp Trnh Socket ............................................................................................................3
M Hnh Client/Server .......................................................................................................... 3 Kt Ni Server - Client Vi TCP/IP ....................................................................................... 4 Gii Thiu V Sockets .......................................................................................................... 5 Giao Thc ...................................................................................................................... 6 Gii Thiu S Lc V Tr Chi C Caro: ............................................................................................... 8 Thit K Chng Trnh ................................................................................................................................ 10

2|Lp Trnh Mng _ ng dng lp trnh socket l p trnh phn mm chat


trong Mng LAN

Tng quan v Lp trnh Socket


M hnh client/server M hnh c ph bin nht v c chp nhn rng ri trong cc h thng phn tn l m hnh client/server. Trong m hnh ny s c mt tp cc tin trnh m mi tin trnh ng vai tr nh l mt trnh qun l ti nguyn cho mt tp hp cc ti nguyn cho trc v mt tp hp cc tin trnh client trong mi tin trnh thc hin mt tc v no cn truy xut ti ti nguyn phn cng hoc phn mm dng chung. Bn thn cc trnh qun l ti nguyn cn phi truy xut ti cc ti nguyn dng chung c qun l bi mt tin trnh khc, v vy mt s tin trnh va l tin trnh client va l tin trnh server. Cc tin trnh pht ra cc yu cu ti cc server bt k khi no chng cn truy xut ti mt trong cc ti nguyn ca cc server. Nu yu cu l ng n th server s thc hin hnh ng c yu cu v gi mt p ng tr li ti tin trnh client. M hnh client/server cung cp mt cch tip cn tng qut chia s ti nguyn trong cc h thng phn tn. M hnh ny c th c ci t bng rt nhiu mi trng phn cng v phn mm khc nhau. Cc my tnh c s dng chy cc tin trnh client/server c nhiu kiu khc nhau v khng cn thit phi phn bit gia chng; c tin trnh client v tin trnh server u c th chy trn cng mt my tnh. Mt tin trnh server c th s dng dch v ca mt server khc. M hnh truyn tin client/server hng ti vic cung cp dch v. Qu trnh trao i d liu bao gm: 1. Truyn mt yu cu t tin trnh client ti tin trnh server 2. Yu cu c server x l 3. Truyn p ng cho client M hnh truyn tin ny lin quan n vic truyn hai thng ip v mt dng ng b ha c th gia client v server. Tin trnh server phi nhn thc c thng ip c yu cu bc mt ngay khi n n v hnh ng pht ra yu cu trong client phi c tm dng (b phong ta) v buc tin trnh client trng thi ch cho t khi n nhn c p ng do server gi v bc ba. M hnh client/server thng c ci t da trn cc thao tc c bn l gi (send) v nhn (receive) Qu trnh giao tip client v server c th din ra theo mt t rong hai ch : b phong ta (blocked) v khng b phong ta (non-blocked). Ch b phong ta (blocked): Trong ch b phong ta, khi tin trnh client hoc server pht ra lnh gi d liu (send), vic thc thi ca tin trnh s b tm ngng cho ti khi tin trnh nhn pht ra lnh nhn d liu (receive). Tng t i vi tin trnh nhn d liu, nu tin trnh no (client hoc server) pht ra lnh nhn d liu, m ti thi im cha c d liu gi ti th vic thc thi ca tin trnh cng s b tm ngng cho ti khi c d liu gi ti. Ch khng b phong ta (non-blocked) Trong ch ny, khi tin trnh client hay server pht ra lnh gi d liu thc s, vic thc thi ca tin trnh vn c tin hnh m khng quan tm n vic c tin trnh no pht ra lnh nhn d liu hay khng. Tng t cho trng hp nhn d liu, khi tin trnh pht ra lnh nhn d liu, n s nhn d liu hin c, vic thc thi ca tin trnh vn c tin hnh m khng quan tm n vic c tin trnh no pht ra lnh gi d liu tip theo hay khng.

3|Lp Trnh Mng _ ng dng lp trnh socket l p trnh phn mm chat


trong Mng LAN

Kt ni Server - Client vi TCP/IP Khi c chy, server cn c xc nh r a ch IP v s lng nghe trn mt port c th. Server s nm trong trng thi ny cho n khi client gi n mt yu cu kt ni. Sau khi c server chp nhn, mt connection s hnh thnh cho php server v client giao tip vi nhau. C th hn, cc bc tin hnh trn server v client m ta cn thc hin s dng giao thc TCP/IP trong C# (c th chy server v client trn cng mt my): Server: 1. To mt i tng System.Net.Sockets.TcpListener bt u lng nghe trn mt cng cc b. 2. i v chp nhn kt ni t client vi phng thc AccepSocket(). Phng thc ny tr v mt i tng System.Net.Sockets.Socket dng gi v nhn d liu. 3. Thc hin giao tip vi client. 4. ng Socket. Thng thng quy trnh ny s c t trong mt vng lp (lp li bc 2) chp nhn nhiu kt ni cng lc (s dng Thread) hoc cc kt ni ln lt. Client: 1. 2. 3. 4. 5. To mt i tng System.Net.Sockets.TcpClient Kt ni n server vi a ch v port xc nh vi phng thc TcpClient.Connect() Ly lung (stream) giao tip bng phng thc TcpClient.GetStream(). Thc hin giao tip vi server. ng lung v socket.

Quy trnh ny c th c minh ha theo m hnh sau:

4|Lp Trnh Mng _ ng dng lp trnh socket l p trnh phn mm chat


trong Mng LAN

Gii thiu v Sockets Trong nm 60 cc nh nghin cu thuc vin nghin cu nhng d n cao cp (ARPA) M c yu cu t c quan b quc phng M (DoD nm 72 ARPA c st nhp vo DoD) pht trin mt h thng lu tr thng tin qun s quan trng phng trng hp sy ra chin tranh. V kt qu lm vic ca h l mng in t ARPAnet ra i. trong tt c nhng thng tin qun s c lu trn cc my tnh v chng lm mt phn ca mng. cc my tnh c t nhng ni khc nhau v vic chao i thng tin gia chng thng qua kh nhiu cch khc nhau. Khi cp nhp li d liu hay thm mi s ng b cc my ch din ra trong thi gian ngn. n m bo phng chnh cho trng hp mt my tnh b ph hy nhng thng tin trn khng b mt. T nhng nm 70 DoD cho php nhng vin nghin cu phi qun s c tip cn vo mng ARPAnet. V nhng nh nghin cu quan tm n vic kt ni my tnh hn l vic ng b d liu. h s dng n chuyn d liu v nhng sinh vin trong vin s dng vo nhng phn ca mng v n ch thnh Usenet mng s dng. Bt u t nm 80 mng qun s v mng dn dng ca ARPAnet c chia ra hnh thnh nhng khu vc mng usenet v nhng khu vc mng ny c ni li vi nhau th l INTERNET ra i Mt iu thc s cn thit l tiu chun ha nhng cch thc lin kt gia cc mng khc nhau v cc kiu my tnh khc nhau bi th TCP/Internet Protocol (TCP/IP) c pht trin bi ARPA ch thnh mt tiu chun rng ri trn ton mng Internet. TCP/IP l mt giao thc thn thin n cho php kt ni nhng my tnh chuyn thng v chia s ti nguyn suyn qua mng TCP v IP ch l 2 giao thc trong b giao thc ny cn c UDP v tt c nhng giao thc ny c h tr trong .NET bn c th xen lp System.NET.sockets.socket truy nhp vo IP c bn ca networks t tng ng dng chng ta phi s dng socket knh. Mt socket l mt giao lp trnh v truyn thng im cui n cho php thc hin kt ni n mt my tnh khc gi v nhn thng tin vi my tnh kin trc truyn thng gia 2 my tnh Thng thng tn ti 3 loi sockets Raw socket : l loi thc thi dng trn tng mng v d nh giao thc IP Datagram sockets : Datagram l mt gi d liu u l kiu sockets c thc thi trn tng transposts giao vn. tuy vy s chuyn giao n mt tng l khng cht ch Stream sockets : N i nghch li datagram socket l nhng sockets c cung cp cho dong d liu Kin trc truyn thng hin i s dng stack cho nhng tng giao thc khc nhau ni d liu c a ti l tng cao nht. mi mt tng cng thm nhng thng tin c trng giao thc vo d liu v a n cho tng k tip. tng thp nht thc hin vic gi d liu. ni tip nhn d liu, thng qua mi tng s b i nhng thng tin c thm vo trong cc tng ca bn gi cho n khi n ln n tng ng dng Tng ng dng c th b chia lm nhiu cc tng con. Bn c th ngh nh th ny tng ng dng s dng nn tng XML c bn giao thc try nhp i tng n gin (SOAP) dng giao thc HTTP gi nhng cu lnh iu khin SOAP trong XML n c gi l HTTP tunneling c s dng mt cch c bit i vi tng la khi m tng la c cu hnh khng cho php SOAP suyn qua n Mt socket c th thc hin by thao tc c bn: 1. Kt ni vi mt my xa (v d, chun b gi v nhn d liu) 2. Gi d liu 3. Nhn d liu 4. Ngt lin kt 5. Gn cng 6. Nghe d liu n 7. Chp nhn lin kt t cc my xa trn cng c gn a ch socket a ch ca mt socket trn mng TCP/IP gm c hai phn: a ch IP: mt s nguyn 32 bits mt card mng trn my tnh (host) Cng dch v: 16 bits xc nh im kt ni vi mt ng dng trn mt host.

5|Lp Trnh Mng _ ng dng lp trnh socket l p trnh phn mm chat


trong Mng LAN

Giao Thc
Giao thc TCP (Transmission Control Protocol - "Giao thc iu khin truyn vn") l mt trong cc giao thc ct li ca b giao thc TCP/IP. S dng TCP, cc ng dng trn cc my ch c ni mng c th to cc "kt ni" vi nhau, m qua chng c th trao i d liu hoc cc gi tin. Giao thc ny m bo chuyn giao d liu ti ni nhn mt cch ng tin cy v ng th t. TCP cn phn bit gia d liu ca nhiu ng dng (chng hn, dch v Web v dch v th in t) ng thi chy trn cng mt my ch. TCP h tr nhiu giao thc ng dng ph bin nht trn Internet v cc ng dng kt qu, trong c WWW, th in t v Secure Shell. Trong b giao thc TCP/IP, TCP l tng trung gian gia giao thc IP bn di v mt ng dng bn trn. Cc ng dng thng cn cc kt ni ng tin cy kiung ng lin lc vi nhau, trong khi , giao thc IP khng cung cp nhng dng kiu , m ch cung cp dch v chuyn gi tin khng ng tin cy. TCP lm nhim v ca tng giao vn trong m hnh OSI n gin ca cc mng my tnh. Cc ng dng gi cc dng gm cc byte 8-bit ti TCP chuyn qua mng. TCP phn chia dng byte ny thnh cc on (segment) c kch thc thch hp (thng c quyt nh da theo kch thc ca n v truyn dn ti a (MTU) ca tng lin kt d liu ca mng m my tnh ang nm trong ). Sau , TCP chuyn cc gi tin thu c ti giao thc IP gi n qua mt lin mng ti m un TCP ti my tnh ch. TCP kim tra m bo khng c gi tin no b tht lc bng cch gn cho mi gi tin mt "s th t" (sequence number). S th t ny cn c s dng m bo d liu c trao cho ng dng ch theo ng th t. M un TCP ti u kia gi li "tin bo nhn" (acknowledgement) cho cc gi tin nhn c thnh cng; mt "ng h" (timer) ti ni gi s bo time-out nu khng nhn c tin bo nhn trong khong thi gian bng mt round-trip time (RTT), v d liu (c coi l b tht lc) s c gi li. TCP s dng checksum (gi tr kim tra) xem c byte no b hng trong qu trnh truyn hay khng; gi tr ny c tnh ton cho mi khi d liu ti ni gi trc khi n c gi, v c kim tra ti ni nhn. o TCP cung cp nhng chc nng chnh sau: o Thit lp, duy tr, gii phng lin kt gia 2 thc th TCP Phn pht gi tin ng tin cy To s th t (Squencing) cc gi d liu iu khin li Cung cp kh nng a kt ni cho cc qu trnh khc nhau gia thc th ngun v thc th ch thng qua vic s dng s hiu cng Truyn d liu theo ch song cng (Full_Duplex)

TCP c nhng c tnh sau: Hng kt ni m bo tin cy trong qu trnh truyn d liu Phn on d liu truyn thnh cc gi tin n l D liu truyn c nh s th t Cung cp c ch phn hi sau khi nhn c d liu S dng c ch pht hin li checksums

Chc nng chnh client kt ni ti server (tcp) Xc nh a ch IP v cng dch v server To mt socket vi cng dch v cc b bt k do TCP ch nh Kt ni socket n server Gi yu cu v nhn thng tin phn hi t server ng kt ni

6|Lp Trnh Mng _ ng dng lp trnh socket l p trnh phn mm chat


trong Mng LAN

Chc nng chnh server chp nhn kt ni client (tcp) To mt socket v gn cho socket mt a ch c nh (IP v port) cung cp dch v t socket ch passive Chp nhn yu cu thit lp kt ni t client v nhn socket mi t h thng Thc hin qu trnh lp nhn yu cu v gi thng tin phn hi Khi client kt thc, ng kt ni v tr v trng thi ch chp nhn yu cu thit lp kt ni t cc client

Giao Thc UDP (User Datagram Protocol) l mt trong nhng giao thc ct li ca giao thc TCP/IP. Dng UDP, chng trnh trn mng my tnh c th gi nhng d liu ngn c gi l datagram ti my khc. UDP khng cung cp s tin cy v th t truyn nhn m TCP lm; cc gi d liu c th n khng ng th t hoc b mt m khng c thng bo. Tuy nhin UDP nhanh v hiu qu hn i vi cc mc tiu nh kch thc nh v yu cu kht khe v thi gian. Do bn cht khng trng thi ca n nn n hu dng i vi vic tr li cc truy vn nh vi s lng ln ngi yu cu. Nhng ng dng ph bin s dng UDP nh DNS (Domain Name System), ng dng streaming media, Voice over IP, Trivial File Transfer Protocol (TFTP), v game trc tuyn. o UDP c nhng c tnh sau: o Phi kt ni Khng phn on d liu truyn Nu c li xy ra, ng dng bt buc phi thc hin truyn li d liu Khng c c ch phn hi sau khi nhn d liu

UDP Client: Xc nh a ch IP v cng dch v server To mt socket vi cng dch v cc b bt k do UDP ch nh Ch nh server cn giao tip Gi yu cu v nhn thng tin phn hi t server ng socket UDP Server: To mt socket v gn cho socket mt a ch c nh (IP v port) cung cp dch v Thc hin qu trnh lp nhn yu cu v gi thng tin phn hi

7|Lp Trnh Mng _ ng dng lp trnh socket l p trnh phn mm chat


trong Mng LAN

Gii thiu s lc v tr chi c caro:


C caro l mt loi tr chi kh ph bin v lut chi n gin v khng i hi nhiu v cng c chi, bn ch cn mt t giy c k v bt l .Chnh v vy tr chi ny li cng ph bin trong gii hc sinh sinh vin. C caro l tr chi i khng 2 ngi: Tr chi i khng (two-agent, conflicting game ) : Gm 2 ngi chi, i th ny s tm cch dnh chin thng trc i th kia trong mt s hu hn nc i, mi nc i uc to ra da t 1 trng thi bt k ca trn u. Nu sau 1 s gii hn nc i, nu cha ai dnh chin thng th xem nh ho. Ngoi ra, thng tin v trn u l hon ton bit uc (perfect information) i vi c 2 i th. Tr chi c lut chi ht sc n gin nh sau: mi i th trong mi lt i ca mnh s chn 1 trng cn li trn bn c (k sn cc li ) sao cho to thnh n con lin tip chin thng ... Nu n = 3 th n c 1 tn khc l Tic Tac Toe, nhng y tr chi kt thc khi c mt ngi t c 5 con lin nhau cng trn mt hng ngang, hng dc hoc ng cho. Nu khi chi kn bn c nhng khng c ai t c 5 con lin nhau th tr chi kt thc v ho nhau. Tr chi c caro c ngun gc t rt lu, v l tr chi mang tnh quc t. cc nc khc nhau tr chi ny mang nhng ci tn khc nhau nhng u gn vi lut chi n gin ca n. V d nh: Nht tr chi c tn Gomoku, Gobang (Go trong ting Nht c ngha l 5, Gomoku c ngha l 5 im), Anh tr chi c tn l Connect 5. Sau y l mt hnh nh ca tr chi Gomoku trn bn c 15x15

Ta thy r, trn bn c, qun en l qun i trc, cc nc i theo th t c nh du nh trn Do thng thng qun en c i trc nn ngi chi thy r qun en c li th hn hn qun trng. Victor Allis chng minh c rng qun en hon ton c th chin thng c d dng. V v vy c mt s phin bn khc nhau ca tr chi cng vi s thay i nho nh trong lut chi nhm gim li th ca qun en i. Trong Vit Nam, tr chi c caro l mt phin bn nh vy vi s tng thm trong lut chi l ngi thng phi c 5 qun lin nhau v khng b chn 2 u. Lut chi lm cho tr chi Gomoku tr nn phc tp hn v tng thm sc mnh cho qun trng c th dnh chin thng.

8|Lp Trnh Mng _ ng dng lp trnh socket l p trnh phn mm chat


trong Mng LAN

Gii thiu s lc v ti: ti l xy dng mt chng trnh phc v chi c caro vi cc chc nng c bn nh sau: Chc nng Multi Player: Chi a ngi dng, chi online: Chng trnh h tr cho 2 ngi trn cng mng LAN c th chi v chat trc tip vi nhau trong lc chi. L do chn ti: Nh gii thiu trn, C caro l mt tr chi c t lu i nay, hin nay n rt ph bin trong gii hc ng. T nhu cu gii tr , c rt nhiu hng sn xut tr chi caro trn my tnh, gip cho vic chi c caro c d dng hn, v bn c th nh c vi my m khng cn mt ngi bn thc s. Trn cng mc ch mun em tr chi c caro n vi mi ngi, lm cho vic chi c tr nn d dng hn, c th h tr cho bn chi vi bn b, bn em chn chng trnh chi c caro lm ti ca mnh. Ni dung chng trnh: Xy dng chng trnh chi c caro ( 2 ngi chi vi nhau) gm cc ni dung sau: V bn c . Hin th 2 k hiu (v d O v X) ngi i trc chn. Nhp h tn ca tng ngi chi. Cho php ngi chi dng cc phm mi tn hoc dng chut di chuyn con tr n cc trn bn c. Cho php dng phm Enter chn rng ang cha con tr. nh du c chn bng 1 trong 2 k t chon trong mc 2. Cho php hon sau mt nc. Sau mi nc chng trnh kim tra xem ai thng cuc hay cha. Nu c ngi thng, chng trnh thng bo h tn ngi thng v kt thc mt vn, tri li tr chi c tip tc. Sau khi kt thc mt vn, chng trnh s cho ngi chi tip hay kt thc, ty theo s la chn ca ngi chi

Bi Ton. Vit chng trnh thc hin tr chi nh c caro (TicTacToe) trn mng: Cho php nhiu ngi chi nhng my khc nhau mi ni trn internet. My server to ra mt Socket phc v kt ni tng cp ngi tham gia chi c caro. Theo tng vn c. Mi phin l mt lung m bo s trao i gia 2 ngi chi v xc nh trng thi ( thng/ thua) ca vn c. Trong mi vn c ngi u kt ni vi server c gi l ngi th nht c gn vi k hiu X cn ngi th 2 c gn vi k hiu l O. H thay phin nhau nh vo nhng d kin ( nhn vo m mnh nh nh) nhanh chng t c s (v d 4, hay 5) thng hang theo hng ngang, hng dc v ng cho. Ngi no nh c s trc, ngi thng c. S vn c c to trn server l khng hn ch. Phn Tch Bi Ton. Da vo bi ton ta phi thc hin nhng cng vic sau: - To ra 1 Server cho game caro. - To ra 1 Client cho game caro - My Server to ra 1 Socket phc v kt ni tng cp Client chi. Lut chi ca game c thit lp nh sau: - Client kt ni trc th c gi l ngi chi 1 v c nh trc. - Client kt ni sau th c gi l ngi chi 2 v nh sau. - Client no nh c s trn hng dc, hng ngang v ng cho ln hn hoc bng 5 th thng cuc.

9|Lp Trnh Mng _ ng dng lp trnh socket l p trnh phn mm chat


trong Mng LAN

THIT K CHNG TRNH


Giao Din
Giao din chnh

Code:
Hm V Bn C public void DrawTable(Graphics dc) { cellC = 0; cellR = 0; try { for (int i = 0; i < m_Columns * 30; i += 30) { cellR = 0; for (int j = 34; j < m_Rows * 30 + 30; j += 30) { Rectangle rect = new Rectangle(i, j, 30, 30); arrRect[cellR, cellC] = rect; dc.DrawRectangle(Pens.Blue, rect); if (Cells[cellR, cellC] == 1) { dc.DrawImage(imageList.Images[0],rect); } else if (Cells[cellR, cellC] == 2) { dc.DrawImage(imageList.Images[1], rect); } cellR++; } cellC++; } } catch { } dc.Dispose(); }

10 | L p T r n h M n g _ n g d n g l p t r n h s o c k e t l p t r n h p h n m m c h a t
trong Mng LAN

Hm Di Chuyn Chut Khi Chi C void Caro_MouseDown(object sender, MouseEventArgs e) { Graphics g = this.CreateGraphics(); if (e.Button == MouseButtons.Left) { Point p = new Point(e.X, e.Y); #region for for (int i = 0; i < m_Rows; i++) { for (int j = 0; j < m_Columns; j++) { switch (player) { case NCHOI.Player1:// A di { if (arrRect[i, j].Contains(p) && Cells[i, j] == 0) { float top = arrRect[i, j].Top; float left = arrRect[i, j].Left; sendPacket(left + "," + top + "," + "1," + i + "," + j); g.DrawImage(imageList.Images[0], arrRect[i, j]); Cells[i, j] = (int)NCHOI.Player1; player = NCHOI.None; rect = arrRect[i, j]; if (KIEMTRA.CheckForWin(Cells, i, j, NCHOI.Player1) == NCHOI.Player1) { g.DrawString("YOU WIN", new Font("Arial", 25, FontStyle.Italic), Brushes.Red, new PointF(10, 30)); F_THANG ft = new F_THANG(); ft.ShowDialog(); SetStatusMessage("O Win."); sendPacket("O"); } return; } } break; case NCHOI.Player2: //B di { if (arrRect[i, j].Contains(p) && Cells[i, j] == 0) { float top = arrRect[i, j].Top; float left = arrRect[i, j].Left; sendPacket(left + "," + top + "," + "2," + i + "," + j); g.DrawImage(imageList.Images[1], arrRect[i, j]); Cells[i, j] = (int)NCHOI.Player2; player = NCHOI.None; rect = arrRect[i, j]; if (KIEMTRA.CheckForWin(Cells, i, j, NCHOI.Player2) == NCHOI.Player2) { g.DrawString("YOU WIN", new Font("Arial", 25, FontStyle.Italic), Brushes.Red, new PointF(10, 30)); F_THANG ft = new F_THANG();

11 | L p T r n h M n g _ n g d n g l p t r n h s o c k e t l p t r n h p h n m m c h a t
trong Mng LAN

ft.ShowDialog(); SetStatusMessage("X Win."); sendPacket("X"); } return; } } break; } } #endregion } g.Dispose(); } Lp Kim Tra namespace CaroGame { public class KIEMTRA { static NCHOI curPlayer = NCHOI.None; static int curRow = 0, curColumn = 0; static int Rows = Caro.Rows; static int Columns = Caro.Columns; static int[,] Board = new int[Rows, Columns]; public KIEMTRA() { }
public static NCHOI CheckForWin(int [,]Cells,int h, int c,NCHOI player) { curRow = h; curColumn = c; curPlayer = player; Board = Cells; //Kiem tra Hang thu 'h' if (KiemTraHangThuI() || KiemTraCotThuI() || TopLeft_To_ButtomRight() || TopRight_To_ButtomLeft()) return player; return NCHOI.None; } #region Kiem tra Hang va cot thu I private static bool KiemTraHangThuI() { int count = 0; for (int i = 0; i < Columns; i++) { if (Board[curRow, i] == Board[curRow, curColumn]) { count++; } else { count = 0; } if (count > 4) return true; } return false;

12 | L p T r n h M n g _ n g d n g l p t r n h s o c k e t l p t r n h p h n m m c h a t
trong Mng LAN

} private static bool KiemTraCotThuI() { int count = 0; for (int i = 0; i < Rows; i++) { if (Board[i, curColumn] == Board[curRow, curColumn]) { count++; } else { count = 0; } if (count > 4) return true; } return false; } #endregion #region Kiem tra 2 duong cheo #region Kiem tra duong cheo \(top-left --> buttom-right) private static bool TopLeft_To_ButtomRight() { if ((curColumn - curRow) >= 0) return KiemTraTren(true); else return KiemTraDuoi(true); } private static bool KiemTraTren(bool b) { int c = curColumn - curRow; int r = 0; int count = 0; for (int i = c; i < Columns; i++) { if (Board[r, i] == Board[curRow, curColumn]) { count++; if (count > 4) return true; } else { count = 0; } r++; } return false; } private static bool KiemTraDuoi(bool b) { int r = curRow - curColumn; int count = 0; int c = 0;

13 | L p T r n h M n g _ n g d n g l p t r n h s o c k e t l p t r n h p h n m m c h a t
trong Mng LAN

for (int i = r; i <= Rows - 1; i++) { if (Board[i, c] == Board[curRow, curColumn]) { count++; if (count > 4) return true; } else { count = 0; } c++; } return false; } #endregion #region Kiem tra duong cheo \(top-right --> buttom-left) private static bool TopRight_To_ButtomLeft() { if (curRow + curColumn <= Rows - 1) return KiemTraTren(); else return KiemTraDuoi(); } private static bool KiemTraTren() { int newRow = curColumn + curRow; int c = 0; int count = 0; for (int i = newRow; i >= 0; i--) { if (Board[i, c] == Board[curRow, curColumn]) { count++; if (count > 4) return true; } else { count = 0; } c++; } return false; } private static bool KiemTraDuoi() { int newColumn = (curRow + curColumn) - Rows + 1; int count = 0; int r = Rows - 1; for (int i = newColumn; i <= Rows; i++) { if (Board[r, i] == Board[curRow, curColumn]) { count++; if (count > 4)

14 | L p T r n h M n g _ n g d n g l p t r n h s o c k e t l p t r n h p h n m m c h a t
trong Mng LAN

return true; } else { count = 0; } r--; } return false; } #endregion #endregion } }

Kt ni Sockets private static Socket client; private static byte[] data = new byte[1024]; private Thread receiver;
private void ConnectTo(string ipServer) { SetStatusMessage("Connecting..."); client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { IPEndPoint iep = new IPEndPoint(IPAddress.Parse(ipServer), 9050); client.BeginConnect(iep, new AsyncCallback(Connected), client); } catch { SetStatusMessage("IP Invalid..."); } } private void Listen() { SetStatusMessage("Waiting..."); Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050); newsock.Bind(iep); newsock.Listen(2); newsock.BeginAccept(new AsyncCallback(AcceptConn), newsock); } void AcceptConn(IAsyncResult iar) { Socket oldserver = (Socket)iar.AsyncState; client = oldserver.EndAccept(iar); SetStatusMessage("Connected"); receiver = new Thread(new ThreadStart(ReceiveData)); receiver.Start(); } void Connected(IAsyncResult iar) { try

15 | L p T r n h M n g _ n g d n g l p t r n h s o c k e t l p t r n h p h n m m c h a t
trong Mng LAN

{ client.EndConnect(iar); SetStatusMessage("Connected"); Thread receiver = new Thread(new ThreadStart(ReceiveData)); receiver.Start(); } catch (SocketException) { MessageBox.Show("Khng tm thy my ch. Th kt ni li","Thng Bo",MessageBoxButtons.OK,MessageBoxIcon.Error); } } void SendData(IAsyncResult iar) { Socket remote = (Socket)iar.AsyncState; int sent = remote.EndSend(iar); } void ReceiveData() { int recv; string packData; while (true) { recv = client.Receive(data); packData = Encoding.ASCII.GetString(data, 0, recv); if (packData == "Exit") { client.Close(); } Graphics dc = this.CreateGraphics(); dc.SmoothingMode = SmoothingMode.AntiAlias; switch (packData.ToString()) { case "R"://Restart Game NewGame(); break; case "O"://Bao O Win this.SetStatusMessage("O Win"); F_THUA fth1 = new F_THUA(); fth1.ShowDialog(); player = NCHOI.None; break; case "X"://Bao X Win this.SetStatusMessage("X Win"); F_THUA fth2 = new F_THUA(); fth2.ShowDialog(); player = NCHOI.None; break; default: { string[] point = packData.Split(','); int x = Convert.ToInt16(point[0]); int y = Convert.ToInt16(point[1]); int user = Convert.ToInt16(point[2]); int i = Convert.ToInt16(point[3]); int j = Convert.ToInt16(point[4]); if (user == 1) { dc.DrawImage(imageList.Images[0], new RectangleF(x, y, 30, 30)); player = NCHOI.Player2;

16 | L p T r n h M n g _ n g d n g l p t r n h s o c k e t l p t r n h p h n m m c h a t
trong Mng LAN

this.Cells[i, j] = user; } else { dc.DrawImage(imageList.Images[1], new RectangleF(x, y, 30, 30)); player = NCHOI.Player1; this.Cells[i, j] = user; } this.DrawTable(dc); } break; } dc.Dispose(); } client.Close(); return; } void sendPacket(string packet) { byte[] Sent = Encoding.ASCII.GetBytes(packet); client.BeginSend(Sent, 0, Sent.Length, 0, new AsyncCallback(SendData), client); } #endregion

Phng thc to chi mi


public void NewGame() { Invalidate(); //player = Players.Player1; Cells = new int[m_Rows * 2, m_Columns * 2]; arrRect = new RectangleF[m_Rows, m_Columns]; for (int i = 0; i < m_Rows; i++) { for (int j = 0; j < m_Columns; j++) { Cells[i, j] = (int)NCHOI.None; } } Random rdm = new Random(); int p = rdm.Next(1, 3); if (p == 1) { player = NCHOI.Player1; SetStatusMessage("(O) i trc"); } else { player = NCHOI.Player2; SetStatusMessage("(X) i trc"); } messThis = ""; }

17 | L p T r n h M n g _ n g d n g l p t r n h s o c k e t l p t r n h p h n m m c h a t
trong Mng LAN

18 | L p T r n h M n g _ n g d n g l p t r n h s o c k e t l p t r n h p h n m m
chat trong Mng LAN

You might also like