Link: M,c OS hoxc các thiXt b< giao tiXp mEng trên mIt máy tính M>t s@ ñiBm khác nhau c+a TCP/IP và mô hình OSI + LWp ,ng dLng trong TCP/IP xc lý ch,c năng cba lWp 5,6,7 trong mô hình OS
Trang 1CHƯƠNG 1: CÁC KI N TH C CƠ B N V M NG MÁY TÍNH 3
1.1 Mô hình tham kh"o 7 t%ng OSI 3
1.2 H* giao th,c TCP/IP 5
1.3 So sánh gi3a hai giao th,c TCP và UDP 6
1.4 C:ng giao th,c 7
1.5 ð<a ch= IP, các ñ<a ch= IP dành riêng 7
1.6 ð<a ch= tên miCn: loEi A, loEi MX .8
1.7 MIt sJ giao th,c K t%ng ,ng dLng: HTTP, SMTP, POP3, FTP 8
CHƯƠNG 2: LOP TRÌNH M NG TRONG NET FRAMEWORK 9
2.1 Socket hưWng kXt nJi (TCP Socket) 9
2.1.1 GiWi thi[u vC NameSpace System.Net và System.Net.Sockets 10
2.1.2 ViXt chương trình cho phía máy chb 11
2.1.3 ViXt chương trình cho phía máy khách 13
2.1.4 Sc dLng các ludng nhep xugt vWi Socket 14
2.2 Socket không hưWng kXt nJi (UDP Socket) 17
2.2.1 ViXt chương trình cho phía máy chb 17
2.2.2 ViXt chương trình cho phía máy khách 18
2.2.3 Sc dLng lWp System.IO.MemoryStream ñh tEo vùng ñ[m nhep xugt 20
2.3 Sc dLng các lWp hj trk ñưkc xây dmng tn lWp Soket 20
2.3.1 LWp TCPClient 21
2.3.2 LWp TCPListener 22
2.3.3 LWp UDPClient 24
2.4 Socket không ñdng bI 26
2.4.1 Mô hình xc lý sm ki[n cba windows 26
2.4.2 Sc dLng Socket không ñdng bI 27
2.4.3 Ví dL vC Socket không ñdng bI 28
2.4.4 Sc dLng các phương th,c Nonrblocking 35
2.5 Sc dLng Thread trong các ,ng dLng mEng 39
2.5.1 Sc dLng Thread trong chương trình Net 40
2.5.2 Sc dLng Thread trong các chương trình Server 41
2.5.3 Sc dLng Thread ñh gci/nhen d3 li[u 41
2.5.4 Sc dLng ThreadPool trong các chương trình Net 43
2.5.5 Sc dLng ThreadPool trong các chương trình Server 47
2.6 Ks thuet IP Multicasting 48
2.6.1 Broadcasting là gì? 48
2.6.2 Sc dLng Broadcasting ñh gci d3 li[u ñXn nhiCu máy trong mEng cLc bI 48
2.6.3 Multicasting là gì? 49
2.6.4 Socket Multicasting trong Net 50
2.7 Bài tep áp dLng 53
CHƯƠNG 3: XÂY DvNG NG DwNG M NG 55
3.1 Giao th,c ICMP 55
3.1.1 Sc dLng Raw Socket 55
3.1.2 Sc dLng giao th,c ICMP và Raw Socket ñh xây dmng chương trình Ping 57
3.1.3 Sc dLng giao th,c ICMP và Raw Socket ñh xây dmng chương trình TraceRoute 58 3.2 Giao th,c SMTP, POP3 60
3.2.1 Cơ b"n vC h[ thJng Mail và giao th,c SMTP, POP3 60
3.2.2 Cài ñxt SMTP, POP3 Client/Server 60
3.3 Giao th,c HTTP 67
3.3.1 Cơ b"n vC giao th,c HTTP 67
3.3.2 Cài ñxt HTTP Client/Server 68
3.4 Giao th,c FTP 74
3.4.1 Cơ b"n vC giao th,c FTP 74
3.4.2 Cài ñxt FTP Client/Server 84
Trang 23.5 DNS (Domain Name Server) 88
3.5.1 Vgn ñC phân gi"i tên miCn 88
3.5.2 Trihn khai DNS MX (Mail Exchange) 89
3.6 Th"o luen vC các ,ng dLng khác thưyng gxp 93
3.7 Bài tep áp dLng 93
CHƯƠNG 4: XÂY DvNG NG DwNG NHI U LzP 94
4.1 Mô hình 2 lWp (two tier), 3 lWp (three tier) và n lWp .94
4.2 Remoting 98
4.2.1 GiWi thi[u vC Remoting 102
4.2.2 Khai báo, cài ñxt và ñăng ký giao di[n tn xa 102
4.2.3 Tri[u g*i phương th,c tn xa 107
4.3 Web Serive 107
4.3.1 GiWi thi[u vC Web Serives 107
4.3.2 Giao th,c SOAP 109
4.3.3 Xây dmng Web Services 112
4.3.4 Tri[u g*i Web Services tn ,ng dLng NET, Java và các ngôn ng3 khác 114
4.4 Th"o luen vC các ,ng dLng phân tán 116
4.5 Bài tep áp dLng 116
Trang 3CHƯƠNG 1: CÁC KI N TH C CƠ B N V M NG MÁY TÍNH
1.1 Mô hình tham kh!o 7 t$ng OSI
Mô hình kXt nJi h[ thJng mK ñưkc T: ch,c quJc tX vC tiêu chu~n hoá ISO (International Organizaiton for Standardization) ñưa ra nh•m cung cgp mIt mô hình chu~n cho các nhà s"n xugt và cung cgp s"n ph~m vi‚n thông áp dLng theo ñh phát trihn các s"n ph~m vi‚n thông Ý tưKng mô hình hoá ñưkc tEo ra còn nh•m hj trk cho vi[c kXt nJi gi3a các h[ thJng và modun hoá các thành ph%n phLc vL mEng viXn thông
a Ch(c năng c+a mô hình OSI:
r Cung cgp kiXn th,c vC hoEt ñIng cba kXt nJi liên mEng
r ðưa ra trình tm công vi[c ñh thiXt lep và thmc hi[n mIt giao th,c cho kXt nJi các thiXt b< trên mEng
Mô hình OSI còn có mIt sJ thuen lki sau :
“plug and play” và tích hkp nhiCu nhà cung cgp s"n ph~m
b C-u trúc mô hình OSI:
Mô hình OSI gdm 7 lWp (level), mji lWp thmc hi[n các ch,c năng riêng cho hoEt ñIng kXt nJi mEng
Hình 111 Mô t" b~y lWp OSI 4 lWp ñ%u ñ<nh nghĩa cách th,c cho ñ%u cuJi thiXt lep kXt nJi vWi nhau ñh trao ñ:i d3 li[u 3 lWp trên dùng ñh phát trihn các ,ng dLng ñh ñ%u cuJi kXt nJi vWi nhau và ngưyi dùng
Aplication Presentation Application
Transport Layer Network Layer Data Link Physical
Data Lower Layer
Các l4p trên
3 lWp trên cùng cba mô hình OSI thưyng ñưkc g*i là các lWp ,ng dLng (Application layers) hay còn g*i là các lWp cao Các lWp này thưyng liên quan tWi giao tiXp vWi ngưyi dùng, ñ<nh dEng cba d3 li[u và phương th,c truy nhep các ,ng dLng ñó
Hình 112 Mô t" các lWp trên và cung cgp thông tin vWi các ch,c năng cba nó qua ví dL:
r LWp ,ng dLng: ch,c năng giao Telnet, HTTP
Trang 4Application tiXp gi3a ngưyi sc dLng và các
chương trình ,ng dLng
Presentation
r LWp trình bày: cách th,c chu~n hoá d3 li[u và trình bày sJ li[u
r Có ch,c năng ñxc bi[t là mã hoá d3 li[u ngưyi sc dung
ASSCII EBCDIC JPEC
dLng hoxc kXt nJi các chương trình ,ng dLng vWi các thb tLc cho phép truy nhep vào mEng
ñ:i mà ñưkc cung cgp bKi lWp ,ng dLng Các ch,c năng ñó ñ"m b"o r•ng d3 li[u tn lWp ,ng dLng trong mIt h[ thJng có thh ñưkc ñ*c bKi lWp ,ng dLng cba mIt h[ thJng khác VD : dùng ñh mã hoá d3 li[u tn lWp ,ng dLng : như mã hoá "nh jpeg , gif Mã ñó cho phép ta có thh hi[n lên trang web
r Session layer : ñưkc sc dLng ñh thiXt lep, duy trì và kXt thúc phiên làm vi[c gi3a các lWp presentation Vi[c trao ñ:i thông tin K lWp này bao gdm yêu c%u d<ch vL
và ñáp ,ng yêu c%u cba các ,ng dLng trên thiXt b< khác
Ví dL vWi : TCP/IP mji Layer cho phép d3 li[u truyCn qua Các lWp ñó trao ñ:i các thông tin ñh cung cgp cuIc liên lEc gi3a hai thiXt b< trong mEng Các lWp giao tiXp vWi nhau sc dLng Protocal Data Unit (PDU) Thông tin ñihu khihn cba PDU ñưkc thêm
Trang 5vào vWi d3 li[u K lWp trên Và thông tin ñiCu khihn này n•m trong trưyng g*i là trưyng header và trailer
Hình 1r3 Data encapsulation
Application Presentation
0101110101001000010
1.2 H; giao th(c TCP/IP
Các t%ng cba giao th,c TCP/IP so vWi cgc t%ng cba mô hình OSI
Application: Xác nhen quyCn, nén d3 li[u và các d<ch vL cho ngưyi dùng
Transport: Xc lý d3 li[u gi3a các h[ thJng va cung cgp vi[c truy cep mEng cho các ,ng dLng
Network: Tìm ñưyng cho các packet
Trang 6Link: M,c OS hoxc các thiXt b< giao tiXp mEng trên mIt máy tính
M>t s@ ñiBm khác nhau c+a TCP/IP và mô hình OSI
+ LWp ,ng dLng trong TCP/IP xc lý ch,c năng cba lWp 5,6,7 trong mô hình OSI
+ LWp transport trong TCP/IP cung cgp cW chX UDP truyCn không tin cey, transport trong OSI luôn ñ"m b"o truyCn tin cey
+ TCP/IP là mIt tep cba các protocols (mIt bI giao th,c)
+ TCP/IP xây dmng trưWc OSI
Quy trình ñóng gói dH liIu trong mô hình TCP/IP như sau:
1.3 So sánh giHa hai giao th(c TCP và UDP
Trang 81.6 ðQa chR tên miUn: loVi A, loVi MX
1.7 M>t s@ giao th(c Y t$ng (ng dZng: HTTP, SMTP, POP3, FTP
r Chúng ta s• nghiên c,u chi tiXt các giao th,c này K chương 3
Trang 9CHƯƠNG 2: L]P TRÌNH M NG TRONG NET FRAMEWORK
2.1 Socket hư4ng kct n@i (TCP Socket)
Socket là mIt giao di[n lep trình ,ng dLng (API) mEng
Thông qua giao di[n này chúng ta có thh lep trình ñiCu khihn vi[c truyCn thông gi3a hai máy sc dLng các giao th,c m,c thgp là TCP, UDP…
Socket là sm trnu tưkng hoá K m,c cao, có thh tưKng tưkng nó như là thiXt b< truyCn thông hai chiCu gci – nhen d3 li[u gi3a hai máy tính vWi nhau
Các loEi Socket
Socket hưWng kXt nJi (TCP Socket) Socket không hưWng kXt nJi (UDP Socket) Raw Socket
ðxc ñihm cba Socket hưWng kXt nJi
Có 1 ñưyng kXt nJi "o gi3a 2 tiXn trình MIt trong 2 tiXn trình ph"i ñki tiXn trình kia yêu c%u kXt nJi
Có thh sc dLng ñh liên lEc theo mô hình Client/Server Trong mô hình Client/Server thì Server l’ng nghe và chgp nhen mIt yêu c%u kXt nJi
Mji thông ñi[p gci ñCu có xác nhen trK vC Các gói tin chuyhn ñi tu%n tm
ðfc ñiBm c+a Socket không hư4ng kct n@i
Hai ticn trình liên lVc v4i nhau không kct n@i trgc ticp Thông ñiIp ghi ñi ph!i kèm theo ñQa chR c+a ngưji nhkn Thông ñiIp có thB ghi nhiUu l$n
Ngưji ghi không chlc chln thông ñiIp t4i tay ngưji nhkn Thông ñiIp ghi sau có thB ñcn ñích trư4c thông ñiIp ghi trư4c ñó
SJ hi[u c:ng cba Socket
Trang 10ðh có thh thmc hi[n các cuIc giao tiXp, mIt trong hai quá trình ph"i công
bJ sJ hi[u c:ng cba socket mà mình sc dLng
Mji c:ng giao tiXp thh hi[n mIt ñ<a ch= xác ñ<nh trong h[ thJng Khi quá trình ñưkc gán mIt sJ hi[u c:ng, nó có thh nhen d3 li[u gKi ñXn c:ng này tn các quá trình khác
Quá trình còn lEi cũng yêu c%u tEo ra mIt socket
2.1.1 Gi i thi u v NameSpace System.Net và System.Net.Sockets
Cung cgp mIt giao di[n lep trình ñơn gi"n cho rgt nhiCu các giao th,c mEng
ToString: Tr" ñ<a ch= IP vC dEng xâu TryParse: Kihm tra IP K dEng xâu có hkp l[ không?
LWp IPEndPoint
MIt sJ phương th,c c%n chú ý:
Phương th,c khKi tEo
IPEndPoint (Int64, Int32) IPEndPoint (IPAddress, Int32)
Create: TEo mIt EndPoint tn mIt ñ<a ch= Socket
ToString : Tr" vC ñ<a ch= IP và sJ hi[u c:ng theo khuôn dEng ð<aCh=: C:ng, ví dL: 192.168.1.1:8080
LWp DNS
MIt sJ thành ph%n cba lWp:
HostName: Cho biXt tên cba máy ñưkc phân gi"i GetHostAddress: Tr" vC tgt c" IP cba mIt trEm GetHostEntry: Gi"i ñáp tên hoxc ñ<a ch= truyCn vào và tr" vC ñJi tưkng IPHostEntry
Trang 11GetHostName: Lgy vC tên cba máy tính cLc bI NameSpace System.Net.Sockets
MIt sJ lWp hay dùng: TcpClient, UdpClient, TcpListener, Socket, NetworkStream, …
ðh tEo ra Socket
Socket(AddressFamily af, SocketType st, ProtocolType pt)
SocketType Protocoltype Description
IPEndPoint ie = new IPEndPoint(ia, 8000);
Socket test = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iep = (IPEndPoint)test.LocalEndPoint;
Console.WriteLine("Local EndPoint: {0}", iep.ToString());
test.Close();
Console.ReadKey();
}
}
2.1.2 Vi t chương trình cho phía máy ch$
ViXt chương trình cho phía máy chb
TEo mIt Socket Liên kXt vWi mIt IPEndPoint cLc bI L’ng nghe kXt nJi
Chgp nhen kXt nJi Gci nhen d3 li[u theo giao th,c ñã thiXt kX
Trang 12đóng kXt nJi sau khi ựã hoàn thành và trK lEi trEng thái lỖng nghe chy kXt nJi mWi
ViXt chương trình cho phắa máy chb
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
Socket newsock = Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
newsock.Bind(ipep);
newsock.Listen(10);
Socket client = newsock.Accept();
//Gci nhen d3 li[u theo giao th,c ựã thiXt kX
static void Main(string[] args) {
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2008);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(iep);
server.Listen(10);
Console.WriteLine("Cho ket noi tu client");
Socket client = server.Accept();
Console.WriteLine("Chap nhan ket noi tu:{0}",
client.RemoteEndPoint.ToString());
string s = "Chao ban den voi Server";
//Chuyen chuoi s thanh mang byte
byte[] data = new byte[1024];
data = Encoding.ASCII.GetBytes(s);
//gui nhan du lieu theo giao thuc da thiet ke
client.Send(data,data.Length,SocketFlags.None);
while (true) {
data = new byte[1024];
int recv = client.Receive(data);
if (recv == 0) break;
//Chuyen mang byte Data thanh chuoi va in ra man hinh
s = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine("Clien gui len:{0}", s);
//Neu chuoi nhan duoc la Quit thi thoat
Trang 132.1.3 Vi t chương trình cho phắa máy khách
ViXt chương trình cho phắa máy khách
Xác ự<nh ự<a ch= cba Server TEo Socket
KXt nJi ựXn Server Gci nhen d3 li[u theo giao th,c ựã thiXt kX đóng Socket
ViXt chương trình cho phắa máy khách
IPEndPoint ipep = new IPEndPoint(Ipaddress.Parse("192.168.1.6"), 9050);
Socket server = new Socket(AddressFamily.InterNetwork,SocketType.Stream,
static void Main(string[] args) {
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2008);
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(iep);
byte[] data = new byte[1024];
int recv = client.Receive(data);
string s = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine("Server gui:{0}", s);
string input;
while (true) {
input = Console.ReadLine();
//Chuyen input thanh mang byte gui len cho server
data = new byte[1024];
Trang 142.1.4 S' d)ng các lu+ng nh,p xu.t v i Socket
Tn Socket ta có thh tEo ra ludng ñh nhep xugt vWi Socket ñó là sc dLng lWp NetworkStream
DataAvailable Is true if there is data available to be read
Ví dZ chương trình Client/Server sh dZng NetworkStream ñB ghi và nhkn dH liIu Chương trình Client sh dZng NetworkStream:
Trang 15class Program {
static void Main(string[] args) {
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2009);
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(iep);
NetworkStream ns = new NetworkStream(client);
byte[] data = new byte[1024];
data = new byte[1024];
int rec = ns.Read(data, 0, data.Length);
string s = Encoding.ASCII.GetString(data, 0, rec);
static void Main(string[] args) {
IPEndPoint iep=new IPEndPoint(IPAddress.Parse("127.0.0.1"),2009);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
data = new byte[1024];
int rec = ns.Read(data, 0, data.Length);
string s = Encoding.ASCII.GetString(data, 0, rec);
Trang 16client.Close();
server.Close();
}
}
Trên cK sK cba NetworkStream ta có thh nJi thêm các ludng ñh nhep xugt theo hưWng
ký tm như StreamReader, StreamWriter
Sau ñây là mIt ví dL vC chương trình Client/Server sc dLng ludng nhep xugt, chương trình Server chép phép Client gci lên yêu c%u, nXu yêu c%u là GetDate không phân bi[t ch3 hoa ch3 thưyng thì Server tr" vC cho Client ngày hi[n tEi, nXu yêu c%u là GetTime không phan bi[t hoa thưyng thì Server tr" vC giy hi[n tEi, nXu là Quit thì Server ng’t kXt nJi vWi Client, không ph"i các trưyng hkp trên thì thông báo không hihu lênh Chương trình phía Client:
static void Main(string[] args) {
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999);
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp); client.Connect(iep);
NetworkStream ns = new NetworkStream(client);
StreamReader sr = new StreamReader(ns);
StreamWriter sw = new StreamWriter(ns);
Trang 17using System.Net.Sockets;
using System.IO;
class DateTimeServer{
static void Main(string[] args) {
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2009);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp); server.Bind(iep);
server.Listen(10);
Socket client = server.Accept();
NetworkStream ns = new NetworkStream(client);
StreamReader sr = new StreamReader(ns
StreamWriter sw = new StreamWriter(ns);
2.2 Socket không hư4ng kct n@i (UDP Socket)
Chương trình phắa máy chb
TEo mIt Socket Liên kXt vWi mIt IPEndPoint cLc bI Gci nhen d3 li[u theo giao th,c ựã thiXt kX đóng Socket
Chương trình phắa máy khách
Xác ự<nh ự<a ch= Server TEo Socket
Gci nhen d3 li[u theo giao th,c ựã thiXt kX đóng Socket
2.2.1 Vi t chương trình cho phắa máy ch$
using System;
Trang 18static void Main(string[] args) {
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2008);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
server.Bind(iep);
//tao ra mot Endpot tu xa de nhan du lieu ve
IPEndPoint RemoteEp = new IPEndPoint(IPAddress.Any, 0);
EndPoint remote=(EndPoint)RemoteEp;
byte[] data = new byte[1024];
int recv = server.ReceiveFrom(data, ref remote);
string s = Encoding.ASCII.GetString(data, 0, recv);
static void Main(string[] args) {
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2008);
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
String s = "Chao server";
byte[] data = new byte[1024];
data = Encoding.ASCII.GetBytes(s);
client.SendTo(data, iep);
EndPoint remote = (EndPoint)iep;
Trang 19data = new byte[1024];
int recv = client.ReceiveFrom(data, ref remote);
data = new byte[1024];
recv = client.ReceiveFrom(data, ref remote);
public partial class Form1 : Form {
private Socket udp1;
private IPEndPoint ipremote, iplocal;
public Form1() {
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}
private void btStart_Click(object sender, EventArgs e) {
udp1 = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
Trang 20}
private void btSend_Click(object sender, EventArgs e) {
byte[] data = new byte[1024];
byte[] data = new byte[1024];
IPEndPoint ipe = new IPEndPoint(IPAddress.Any, 0);
EndPoint remote = (EndPoint)ipe;
int rec = udp1.ReceiveFrom(data, ref remote);
string s = Encoding.ASCII.GetString(data, 0, rec);
2.2.3 S' d)ng l p System.IO.MemoryStream ñ3 t4o vùng ñ m nh,p xu.t
2.3 Sh dZng các l4p hp trq ñưqc xây dgng tt l4p Soket
Trang 21+ MIt sJ thuIc tính:
ñ ñ c
Trang 22GetStream Tr# v NetworkStream ñ t ñó giúp ta
g>i hay nh n d? li)u (Thư@ng làm tham
s khi t o StreamReader và StreamWriter)
Khi ñã gBn vào StreamReader và StreamWriter rCi thì ta có th g>i và nh n d? li)u thông qua các phương th&c Readln, writeline tương &ng cGa các l'p này
Ta sc dLng lWp TcpClient viXt lEi chương trình DateTimeClient như sau:
static void Main(string[] args) {
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999);
TcpClient client = new TcpClient();
client.Connect(iep);
StreamReader sr = new StreamReader(client.GetStream());
StreamWriter sw = new StreamWriter(client.GetStream());
Trang 23dnng tEi l[nh này cho ñXn khi nào có mIt kXt nJi ñXn)
= có)
Stop Dnng vi[c nghe
Sh dZng l4p TcpListener ta vict lVi chương trình DateTime Server như sau: using System;
static void Main(string[] args) {
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2009);
TcpListener server = new TcpListener(iep);
server.Start();
TcpClient client = server.AcceptTcpClient();
StreamReader sr = new StreamReader(client.GetStream());
StreamWriter sw = new StreamWriter(client.GetStream());
string kq="";
while (true) {
Trang 24cña giao thøc UDP
Trang 25UdpClient (String, Int32)
Tạo một $ ! v) thiết lập với một trạm từ xa mặc định
%& #
BeginReceive Nhận dữ liệu Không đồng bộ từ máy ở xa
BeginSend Gửi không đồng bộ dữ liệu tới máy ở xa
đ−ợc – dù chỉ một chút – thì nó vẫn cứ chờ (blocking))
Vớ dL sc dLng UdpClient viXt chương trỡnh Chat gi3a 2 mỏy:
Do chương trỡnh K 2 mỏy là như nhau ta ch= c%n viXt mIt chương trỡnh copy ra ủh sc dLng
Hỡnh "nh cba nú như sau:
Trang 26private void btSend_Click(object sender, EventArgs e) {
UdpClient send = new UdpClient();
IPEndPoint iepRemote = new IPEndPoint(IPAddress.Parse(txtIp.Text),
int.Parse(txtRemotePort.Text));
byte[] data = new byte[1024];
data = Encoding.UTF8.GetBytes(txtSend.Text);
send.Send(data, data.Length, iepRemote);
txtReceive.Text += "Sender: "+txtSend.Text + "\r\n";
txtSend.Clear();
if (txtSend.Text.ToUpper().Equals("QUIT")) this.Dispose();
}
private void btConnect_Click(object sender, EventArgs e) {
Thread tuyen = new Thread(new ThreadStart(NhanDl));
tuyen.Start();
}
private void NhanDl() {
UdpClient receiver = new UdpClient(int.Parse(txtLocalPort.Text));
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);
while (true) {
byte[] data = new byte[1024];
data = receiver.Receive(ref iep);
2.4 Socket không ñung b>
2.4.1 Mô hình x' lý s> ki n c$a windows
Trang 27Mô hình xc lý sm ki[n cba Windows ñưkc thh hi[n qua hình sau:
Như vey thông qua mô hình này ta có thh by nhi[m cho mIt thb tLc nào ñó thmc hi[n khi sm ki[n s"y ra trên các Control
private void button1_Click(object sender, EventArgs e) {
MessageBox.Show("Bac da nhan em");
}
private void NhanTiep(object sender, EventArgs e) {
MessageBox.Show("Bac lai nhan em roi");
Trang 28Các phương th,c cho vi[c lep trình bgt ñdng bI ñưkc chia làm 2 lEi thưyng b’t ñ%u b•ng Begin và End:
Phương th,c b’t ñ%u b•ng Begin, b’t ñ%u mIt ch,c năng và ñưkc ñăng
ký vWi phương th,c AsyncCallback B’t ñ%u b•ng End ch= ch,c năng hoàn thành khi AsyncCallback ñưkc g*i
Requests Ended BY…Description of Request
Requests Started By… Description of Request Requests Ended BY…Requests Started By…
r ðh chgp nhen kXt nJi bgt ñdng bI ta sc dLng phương th,c BeginAccept() và EndAccept() như sau:
Phương th,c BeginAccept() và EndAccept()
IAsyncResult BeginAccept(AsyncCallback callback, object state)
Socket EndAccept(IAsyncResult iar);
Thưyng ñưkc dùng như sau:
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
sock.Bind(iep);
sock.Listen(5);
sock.BeginAccept(new AsyncCallback(CallAccept), sock);
Trong ñó phương th,c CallAccept thưyng ñưkc viXt như sau:
private static void CallAccept(IAsyncResult iar) {
Socket server = (Socket)iar.AsyncState;
Socket client = server.EndAccept(iar);
}
r ðh thiXt lep kXt nJi theo cách bgt ñdng bI chúng ta sc dLng phương th,c BeginConnect() và EndConnect() như sau:
Phương th,c BeginConnect() và EndConnect()
Trang 29Socket newsock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iep =new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock);
Trong ñó phương th,c Connected thưyng ñưkc viXt như sau:
public static void Connected(IAsyncResult iar) {
Socket sock = (Socket)iar.AsyncState;
r ðh gci d3 li[u bgt ñdng bI chúng ta làm như sau:
+ Phương th,c BeginSend() và EndSend()
+ BeginSend()
IAsyncResult BeginSend(byte[] buffer, int offset, int size, SocketFlags sockflag,
AsyncCallback callback, object state)
private static void SendData(IAsyncResult iar) {
Socket server = (Socket)iar.AsyncState;
int sent = server.EndSend(iar);
IPEndPoint iep = new EndPoint(IPAddress.Parse("192.168.1.6"), 9050);
sock.BeginSendTo(data, 0, data.Length, SocketFlags.None, iep, new
AsynCallback(SendDataTo), sock);
int EndSendTo(IAsyncResult iar)
r ðh nhen d3 li[u bgt ñdng bI ta thmc hi[n như sau:
+ Nhen d3 li[u vWi giao th,c hưWng kXt nJi:
Phương th,c BeginReceive và EndReceive()
Trang 30sock.BeginReceive(data, 0, data.Length, SocketFlags.None, new
AsyncCallback(ReceivedData), sock);
VWi ReceivedData ñưkc ñ<nh nghĩa như sau:
void ReceivedData(IAsyncResult iar) {
Socket remote = (Socket)iar.AsyncState;
int recv = remote.EndReceive(iar);
string receivedData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(receivedData);
}
+ Nhen d3 li[u bgt ñdng bI vWi giao th,c không hưWng kXt nJi
Phương th,c BeginReceiveFrom() and EndReceiveFrom() sock.BeginReceive(data, 0, data.Length, SocketFlags.None, ref iep, new
AsyncCallback(ReceiveData), sock);
void ReceiveData(IasyncResult iar){
Socket remote = (Socket)iar.AsyncState;
int recv = remote.EndReceiveFrom(iar);
string stringData = Encoding.ASCII.GetString(data, 0, recv);
Trang 31Chương trình phía Client:
private TextBox newText;
private TextBox conStatus;
private ListBox results;
private Socket client;
private byte[] data = new byte[1024];
private int size = 1024;
public AsyncTcpClient()
{
Text = "Asynchronous TCP Client";
Size = new Size(400, 380);
Label label1 = new Label();
label1.Parent = this;
label1.Text = "Enter text string:";
label1.AutoSize = true;
label1.Location = new Point(10, 30);
newText = new TextBox();
newText.Parent = this;
newText.Size = new Size(200, 2 * Font.Height);
newText.Location = new Point(10, 55);
results = new ListBox();
results.Parent = this;
results.Location = new Point(10, 85);
results.Size = new Size(360, 18 * Font.Height);
Label label2 = new Label();
label2.Parent = this;
Trang 32label2.Text = "Connection Status:";
label2.AutoSize = true;
label2.Location = new Point(10, 330);
conStatus = new TextBox();
conStatus.Parent = this;
conStatus.Text = "Disconnected";
conStatus.Size = new Size(200, 2 * Font.Height);
conStatus.Location = new Point(110, 325);
Button sendit = new Button();
sendit.Parent = this;
sendit.Text = "Send";
sendit.Location = new Point(220,52);
sendit.Size = new Size(5 * Font.Height, 2 * Font.Height);
sendit.Click += new EventHandler(ButtonSendOnClick);
Button connect = new Button();
connect.Parent = this;
connect.Text = "Connect";
connect.Location = new Point(295, 20);
connect.Size = new Size(6 * Font.Height, 2 * Font.Height);
connect.Click += new EventHandler(ButtonConnectOnClick);
Button discon = new Button();
discon.Parent = this;
discon.Text = "Disconnect";
discon.Location = new Point(295,52);
discon.Size = new Size(6 * Font.Height, 2 * Font.Height);
discon.Click += new EventHandler(ButtonDisconOnClick);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock);
client.BeginSend(message, 0, message.Length, SocketFlags.None,
new AsyncCallback(SendData), client);
Trang 33client = (Socket)iar.AsyncState;
try
{
client.EndConnect(iar);
conStatus.Text = "Connected to: " + client.RemoteEndPoint.ToString();
client.BeginReceive(data, 0, size, SocketFlags.None,
new AsyncCallback(ReceiveData), client);
Socket remote = (Socket)iar.AsyncState;
int recv = remote.EndReceive(iar);
string stringData = Encoding.ASCII.GetString(data, 0, recv);
results.Items.Add(stringData);
}
void SendData(IAsyncResult iar)
{
Socket remote = (Socket)iar.AsyncState;
int sent = remote.EndSend(iar);
remote.BeginReceive(data, 0, size, SocketFlags.None,
new AsyncCallback(ReceiveData), remote);
private TextBox conStatus;
private ListBox results;
private byte[] data = new byte[1024];
private int size = 1024;
private Socket server;
public AsyncTcpSrvr()
{
Text = "Asynchronous TCP Server";
Size = new Size(400, 380);
Trang 34results = new ListBox();
results.Parent = this;
results.Location = new Point(10, 65);
results.Size = new Size(350, 20 * Font.Height);
Label label1 = new Label();
label1.Parent = this;
label1.Text = "Text received from client:";
label1.AutoSize = true;
label1.Location = new Point(10, 45);
Label label2 = new Label();
label2.Parent = this;
label2.Text = "Connection Status:";
label2.AutoSize = true;
label2.Location = new Point(10, 330);
conStatus = new TextBox();
conStatus.Parent = this;
conStatus.Text = "Waiting for client ";
conStatus.Size = new Size(200, 2 * Font.Height);
conStatus.Location = new Point(110, 325);
Button stopServer = new Button();
stopServer.Parent = this;
stopServer.Text = "Stop Server";
stopServer.Location = new Point(260,32);
stopServer.Size = new Size(7 * Font.Height, 2 * Font.Height);
stopServer.Click += new EventHandler(ButtonStopOnClick);
server = new Socket(AddressFamily.InterNetwork,
Socket oldserver = (Socket)iar.AsyncState;
Socket client = oldserver.EndAccept(iar);
conStatus.Text = "Connected to: " + client.RemoteEndPoint.ToString();
string stringData = "Welcome to my server";
byte[] message1 = Encoding.ASCII.GetBytes(stringData);
client.BeginSend(message1, 0, message1.Length, SocketFlags.None,
new AsyncCallback(SendData), client);
Trang 35int sent = client.EndSend(iar);
client.BeginReceive(data, 0, size, SocketFlags.None,
new AsyncCallback(ReceiveData), client);
}
void ReceiveData(IAsyncResult iar)
{
Socket client = (Socket)iar.AsyncState;
int recv = client.EndReceive(iar);
if (recv == 0)
{
client.Close();
conStatus.Text = "Waiting for client ";
server.BeginAccept(new AsyncCallback(AcceptConn), server);
return;
}
string receivedData = Encoding.ASCII.GetString(data, 0, recv);
results.Items.Add(receivedData);
byte[] message2 = Encoding.ASCII.GetBytes(receivedData);
client.BeginSend(message2, 0, message2.Length, SocketFlags.None,
new AsyncCallback(SendData), client);
ðh lep trình bgt ñdng bI chúng ta có thh sc dLng các phương th,c Non –
bloking như phương th,c Poll() và phương th,c Select:
+ Phương th,c Poll()
bool Poll(int microseconds, SelectMode mode);
SelectRead: Poll() tr" vC true nXu mIt trong nh3ng ñiCu ki[n sau ñưkc tho":
NXu phương th,c Accept() thành công NXu có d3 li[u trên Socket
NXu kXt nJi ñã ñóng SelectWrite: Poll() tr" vC true nXu tho" mIt trong nh3ng ñiCu ki[n sau:
Phương th,c Connect() thành công NXu có d3 li[u trên Socket ñh gci SelectError: Poll() tr" vC true nXu mIt trong nh3ng ñiCu ki[n sau ñưkc tho":
NXu phương th,c Connect() thgt bEi NXu có d3 li[u ngoài băng thông chu~n gci ñXn nhưng thuIc tính OutOfBandInline không ñưkc thiXt lep là true
+ Phương th,c Select():
Trang 36Socket.Select(IList checkRead, IList checkWrite, IList checkError, int
• checkError monitors the specified sockets for error conditions
Ví dZ (ng dZng Server sh dZng phương th(c Poll()
byte[] data = new byte[1024];
IPEndPoint ipep = new IPEndPoint(IPAddress.Any,
Console.WriteLine("polling for accept#{0} ", i);
result = newsock.Poll(1000000, SelectMode.SelectRead);
Trang 37Sau ñây chúng ta s• viXt mIt chương trình Server sc dLng phương th,c Select()
ñh chgp nhen 2 kXt nJi ñXn tn client và xc lý tnng kXt nJi
Chương trình Select Server:
ArrayList sockList = new ArrayList(2);
ArrayList copyList = new ArrayList(2);
Socket main = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
byte[] data = new byte[1024];
string stringData;
Trang 38int recv;
main.Bind(iep);
main.Listen(2);
Console.WriteLine("Waiting for 2 clients ");
Socket client1 = main.Accept();
IPEndPoint iep1 = (IPEndPoint)client1.RemoteEndPoint;
client1.Send(Encoding.ASCII.GetBytes("Welcome to my server"));
Console.WriteLine("Connected to {0}", iep1.ToString());
sockList.Add(client1);
Console.WriteLine("Waiting for 1 more client ");
Socket client2 = main.Accept();
IPEndPoint iep2 = (IPEndPoint)client2.RemoteEndPoint;
copyList = new ArrayList(sockList);
Console.WriteLine("Monitoring {0} sockets ", copyList.Count);
Socket.Select(copyList, null, null, 10000000);
foreach (Socket client in copyList)
Trang 39IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
byte[] data = new byte[1024];
sock.Send(data, data.Length, SocketFlags.None);
data = new byte[1024];
Trang 40r TuyXn (Thread): Trong h[ thJng, mIt tiXn trình có thh có mIt hoxc nhiCu chuji thmc hi[n tách bi[t nhau và có thh chEy ñdng thyi Mji chuji thmc hi[n này ñưkc g*i là mIt tuyXn (Thread) Trong mIt ,ng dLng, Thread khKi tEo ñ%u tiên g*i là Thread sơ cgp hay Thread chính
2.5.1 S' d)ng Thread trong chương trình Net
ðh sc dLng Thread trong Net ta sc dLng NameSpace System.Threading
r MIt sJ phương th,c thưyng dùng
Public Method
Name
Mô t!
Abort() KXt thúc Thread
Join() BuIc chương trình ph"i chy cho thread kXt thúc (Block) thì mWi thmc hi[n
tiXp (các câu l[nh ñ,ng sau Join)
Resume() TiXp tLc chEy thread ñã b< tEm ngưng r suspended
Sleep() Static method : TEm dnng thread trong mIt kho"ng thyi gian
Start() B’t ñ%u chEy (khKi ñIng) mIt thread Sau khi g*i phương th,c này, trEng
thái cba thread chuyhn tn trEng thái hi[n hành sang Running
Suspend() TEm ngưng (ngh=) thread (Phương th,c này ñã b< loEi kh†i phiên b"n
CurrentThread This static property: Tr" vC thread hi[n hành ñang chEy
IsAlive Tr" vC giá tr< cho biXt trEng thái thmc thi cba thread hi[n hành
IsBackground Sets or gets giá tr< cho biXt là thread là background hay foreground
thread
IsThreadPoolThread Gets a value indicating whether a thread is part of a thread pool Priority Sets or gets giá tr< ñh ch= ñ<nh ñI ưu tiên (dành nhiCu hay ít CPU cho
thread) Cao nhgt là 4, thgp nhgt là 0