Tải bản đầy đủ (.pdf) (117 trang)

Bài giảng lập trình mạng với C#

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.19 MB, 117 trang )

CHƯƠ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. ð1.6. ð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
1


3.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

2


CHƯƠ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 hố đư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 :

r
Chia nh† các hoEt ñIng ph,c tEp cba mEng thành các ph%n cơng vi[c đơn gi"n.
r
Cho phép các nhà thiXt kX có kh" năng phát trihn trên tnng modun ch,c năng.
r
Cung cgp các kh" năng ñ“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 ñ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
Application

Presentation

(Upper Layer)

Session
Transport Layer
Network Layer

Data Lower Layer

Data Link
Physical
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, ñ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
3


Application

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 ASSCII
hố d3 li[u và trình bày sJ li[u
EBCDIC
r Có ch,c năng đxc bi[t là mã hoá
JPEC
d3 li[u ngưyi sc dung

Session

r LWp phiên: thiXt lep, duy trì và NFS, SQL
huŒ b† mIt phiên làm vi[c

Transport Layer
Network Layer
Data Link

Physical
r
Application layer : ñây là lWp cao nhgt trong mơ hình. Nó là nơi mà ngưyi sc
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.
r
Presentation layer : LWp presentation cung cgp các mã và ch,c năng ñh chuyhn
ñ: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ã hố "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 dvà ñáp ,ng yêu c%u cba các ,ng dLng trên thiXt b< khác.
Các l4p dư4i.
4 lWp dưWi cba mơ hình OSI sc dLng ñh ñtruyCn ñi trong các dây nJi vet lý, các thiXt b< mEng và ñi ñXn trEm ñ%u cuJi cuJi cùng
là ñXn các lWp ,ng dLng. Qugn sách này ta ch= quan tâm đXn 4 lWp cuJi. Và s• xem xét
tnng lWp mIt cách chi tiXt giao thiXp gi3a các lWp trong mơ hình OSI:
Sc dLng phương pháp protocal stack đh kXt nJi gi3a hai thiXt b< trong mEng. Protocal
stack là mIt tep hkp các quy ñqua mEng.
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

4



và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
Upper Layer Data

Session

TCP Header

Upper Layer Data

Transport

Segment

IP Header

Data

Network

Packet

LLC Header

Data


FCS

Data Link

Frame

MAC Header

Data

FCS

Physical

Bits

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 dTransport: 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
5


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 OSI
+ LWp transport trong TCP/IP cung cgp cW chX UDP truyCn khơng tin cey, transport
trong OSI ln đ"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

6


1.4. CNng giao th(c

Là mIt sJ năm trong kho"ng 1..65535 dùng ñh phân bi[t gi3a 2 ,ng dLng mEng
vWi nhau g’n vWi ñ
MIt sJ c:ng và các giao th,c thông dLng:
+ FTP: 21
+ Telnet: 23
+ SMTP: 25
+ POP3: 110
+ HTTP:80
1.5. ðQa chR IP, các ñQa chR IP dành riêng

7


1.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
8


CHƯƠ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 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

9


ðh có thh thmc hi[n các cuIc giao tiXp, mIt trong hai q 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 đ
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 q trình khác.
Q trình cịn lEi cũng 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.
Có rgt nhiCu lWp đh lep trình
Ta quan tâm lWp IPAdress, IPEndPoint, DNS, …
LWp IPAdress
MIt sJ Field c%n chú ý:
Any: Cung cgp mIt ñ
tgt c" các Card mEng
Broadcast: Cung cgp mIt ñ
Loopback: Tr" vC mIt ñAdressFamily: Tr" vC h* ñLWp IPAddress
MIt sJ phương th,c c%n chú ý:
Phương th,c khKi tEo
IPAddress(Byte[])
IPAddress(Int64)

IsLoopback: Cho biXt ñ
Parse: Chuyhn IP dEng xâu vC IP chu~n
ToString: Tr" ñ
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 ñ
ToString : Tr" vC ñ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 ñ
IPHostEntry
10


GetHostName: 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

Dgram

Udp

Connectionless communication

Stream

Tcp

Raw

Icmp

Raw

Raw

Connectionroriented
communication
Internet Control Message
Protocol
Plain IP packet communication

using System.Net;
using System.Net.Sockets;
class SockProp {

public static void Main()
{
IPAddress ia = IPAddress.Parse("127.0.0.1");
IPEndPoint ie = new IPEndPoint(ia, 8000);
Socket test = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
Console.WriteLine("AddressFamily: {0}", test.AddressFamily);
Console.WriteLine("SocketType: {0}", test.SocketType);
Console.WriteLine("ProtocolType: {0}", test.ProtocolType);
Console.WriteLine("Blocking: {0}", test.Blocking);
test.Blocking = false;
Console.WriteLine("new Blocking: {0}", test.Blocking);
Console.WriteLine("Connected: {0}", test.Connected);
test.Bind(ie);
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
11



ðóng kXt nJi sau khi đã hồ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
……….
newsock.Close();
Chương trình Server:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
class Server{
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
if (s.ToUpper().Equals("QUIT")) break;
//Gui tra lai cho client chuoi s
s = s.ToUpper();
data = new byte[1024];
12


data = Encoding.ASCII.GetBytes(s);
client.Send(data, data.Length, SocketFlags.None);
}
client.Shutdown(SocketShutdown.Both);
client.Close();
server.Close();
}
}


2.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 đ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,
ProtocolType.Tcp);
server.Connect(ipep);
Chương trình Client:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
class Client {
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];
data = Encoding.ASCII.GetBytes(input);
client.Send(data, data.Length, SocketFlags.None);
if (input.ToUpper().Equals("QUIT")) break;
data = new byte[1024];
recv = client.Receive(data);
13


s = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine("Server gui:{0}", s);
}
client.Disconnect(true);
client.Close();
}
}

2.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
Property

Description

CanRead

Is true if the NetworkStream supports reading


CanSeek

Is always false for NetworkStreams

CanWrite

Is true if the NetworkStream supports writing

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:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
14


class 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];
while (true) {
string input = Console.ReadLine();
data = Encoding.ASCII.GetBytes(input);
ns.Write(data, 0, data.Length);
if (input.ToUpper().Equals("QUIT")) break;
data = new byte[1024];
int rec = ns.Read(data, 0, data.Length);
string s = Encoding.ASCII.GetString(data, 0, rec);
Console.WriteLine(s);
}
client.Close();
}
}
Chương trình Server sc dLng NetworkStream:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
class Program {
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();

byte[] data;
NetworkStream ns = new NetworkStream(client);
while (true) {
data = new byte[1024];
int rec = ns.Read(data, 0, data.Length);
string s = Encoding.ASCII.GetString(data, 0, rec);
Console.WriteLine(s);
data = new byte[1024];
s = s.ToUpper();
if (s.Equals("QUIT")) break;
data = Encoding.ASCII.GetBytes(s);
ns.Write(data, 0, data.Length);
}
15


client.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:
using System;
using System.Collections.Generic;

using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
class DateTimeClient {
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);
while (true) {
string input = Console.ReadLine();
sw.WriteLine(input);
sw.Flush();
if (input.ToUpper().Equals("QUIT")) break;
string kq = sr.ReadLine();
Console.WriteLine(kq);
}
sr.Close();
sw.Close();
ns.Close();
client.Close();
}
}
Chương trình phía Server:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
16


using 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);
string kq="";
while (true) {
string s = sr.ReadLine();
s=s.ToUpper();
if (s.Equals("QUIT")) break;
if (s.Equals("GETDATE"))
kq = DateTime.Now.ToString("dd/MM/yyyy");
else
if (s.Equals("GETTIME"))

kq = DateTime.Now.ToString("hh:mm:ss");
else
kq = "Khong hieu lenh";
sw.WriteLine(kq);
sw.Flush();
}
sr.Close();
sw.Close();
client.Close();
}
}
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 đ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;
17


using System.Collections.Generic;
using System.Text;

using System.Net;
using System.Net.Sockets;
class Program {
static 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);
Console.WriteLine("nhan ve tu Client:{0}", s);
data = Encoding.ASCII.GetBytes("Chao client");
server.SendTo(data, remote);
while (true) {
data=new byte[1024];
recv = server.ReceiveFrom(data, ref remote);
s = Encoding.ASCII.GetString(data, 0, recv);
if (s.ToUpper().Equals("QUIT")) break;
Console.WriteLine(s);
data=new byte[1024];
data=Encoding.ASCII.GetBytes(s);
server.SendTo(data,0,data.Length,SocketFlags.None,remote);
}
server.Close();
}
}

2.2.2. Vi t chương trình cho phía máy khách
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
class Program {
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;
18


data = new byte[1024];
int recv = client.ReceiveFrom(data, ref remote);
s = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine("Nhan ve tu Server{0}",s);
while (true) {
s = Console.ReadLine();
data=new byte[1024];
data = Encoding.ASCII.GetBytes(s);
client.SendTo(data, remote);
if (s.ToUpper().Equals("QUIT")) break;
data = new byte[1024];

recv = client.ReceiveFrom(data, ref remote);
s = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(s);
}
client.Close();
}
}
Sc dLng Socket không hưWng kXt nJi viXt chương trình chat giưa 2 máy như
sau: (Sau này chúng ta có thh sc dLng lWp UdpClient)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
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,
ProtocolType.Udp);
iplocal = new IPEndPoint(IPAddress.Parse("127.0.0.1"),

int.Parse(txtLocalPort.Text));
udp1.Bind(iplocal);
ipremote = new IPEndPoint(IPAddress.Parse(txtIp.Text),
int.Parse(txtRemotePort.Text));
Thread tuyen = new Thread(new ThreadStart(NhanDL));
tuyen.Start();
19


}
private void btSend_Click(object sender, EventArgs e) {
byte[] data = new byte[1024];
data = Encoding.ASCII.GetBytes(txtSend.Text);
udp1.SendTo(data, ipremote);
}
private void NhanDL() {
while (true) {
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);
txtNoidung.Text += s + "\r\n";
}
}
private void button1_Click(object sender, EventArgs e) {
MessageBox.Show(txtSend.Text.Substring(0, txtSend.Text.IndexOf(" ")));
}
}


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
20


2.3.1. L p TCPClient
MLc đích cba lWp UDPClient K trên là dùng cho lep trình vWi giao th,c UDP,
vWi giao th,c này thì hai bên khơng c%n ph"i thiXt lep kXt nJi trưWc khi gci do vey m,c
ñI tin cey khơng cao. ðh đ"m b"o đI tin cey trong các ,ng dLng mEng, ngưyi ta còn
dùng mIt giao th,c khác, g*i là giao th,c có kXt nJi : TCP (Transport Control
Protocol). Trên Internet chb yXu là dùng loEi giao th,c này, ví dL như Telnet, HTTP,
SMTP, POP3… ðh lep trình theo giao th,c TCP, MS.NET cung cgp hai lWp có tên là
TCPClient và TCPListener.
r Các thành ph%n cba lWp TcpClient
+ Phương th,c khKi tEo:

Constructor Method
Name

Description

TcpClient ()

TEo mIt ñJi tưkng TcpClient. Chưa đxt thơng sJ gì.

TcpClient
(IPEndPoint)

TEo mIt TcpClient và g’n cho nó mIt EndPoint cLc bI.


TcpClient
(RemoteHost: String,
Int32)

TEo mIt đJi tưkng TcpClient và kXt nJi đXn mIt máy có
đ
thh là đ
(Gán ñ
đ:i thơng tin vC sau)

+ MIt sJ thuIc tính:

Available

Cho bi t s byte ñã nh n v t
ñ ñ c.

m ng và có s n

Client

Tr# v Socket &ng v'i TCPClient hi)n hành.

Connected TrEng thái cho biXt ñã kXt nJi ñưkc ñXn Server hay chưa ?
+ MIt sJ phương th,c:

Close

Gi#i phóng đ i tư.ng

khơng ñóng k t n i.

nhưng

Connect
(RemoteHost,
Port)

K t n i ñ n m6t máy TCP khác có Tên và
s hi)u c:ng.

21


GetStream

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:
using System;
using System.Collections.Generic;
using System.Linq;

using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
class DateTimeClient {
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());
while (true) {
string input = Console.ReadLine();
sw.WriteLine(input);
sw.Flush();
if (input.ToUpper().Equals("QUIT")) break;
string kq = sr.ReadLine();
Console.WriteLine(kq);
}
sr.Close();
sw.Close();
client.Close();
}
}
2.3.2. L p TCPListener
TCPListerner là mIt lWp cho phép ngưyi lep trình có thh xây dmng các ,ng
dLng Server (Ví dL như SMTP Server, FTP Server, DNS Server, POP3 Server hay
server tm ñln thmc hi[n l’ng nghe và chgp nhen các kXt nJi ñXn tn Client.

22


Các thành ph%n cba lWp TcpListener:
+ Phương th,c khKi tEo:

Constructor method
Name

Description

TcpListener (Port:
Int32)

TEo mIt TcpListener và l’ng nghe tEi c:ng ch= ñ
TcpListener
(IPEndPoint)

TEo mIt TcpListener vWi giá tr< Endpoint truyCn vào.

TcpListener
(IPAddress, Int32)

TEo mIt TcpListener và l’ng nghe các kXt nJi ñXn tEi
ñ

+ Các phương th,c khác

Name


Description

AcceptSocket

Chgp nhen mIt yêu c%u kXt nJi ñang chy.

AcceptTcpClient Chgp nhen mIt yêu c%u kXt nJi ñang chy. ( ng dLng s•
dnng tEi l[nh này cho đXn khi nào có mIt kXt nJi đXn)
Pending

Cho biXt li[u có kXt nJi nào đang chy đki khơng ? (True
= có).

Start

B’t đ%u l’ng nghe các yêu c%u kXt nJi.

Stop

Dnng vi[c nghe.

Sh dZng l4p TcpListener ta vict lVi chương trình DateTime Server như sau:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;

class DateTimeServer{
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) {
23


string s = sr.ReadLine();
s=s.ToUpper();
if (s.Equals("QUIT")) break;
if (s.Equals("GETDATE"))
kq = DateTime.Now.ToString("dd/MM/yyyy");
else
if (s.Equals("GETTIME"))
kq = DateTime.Now.ToString("hh:mm:ss");
else
kq = "Khong hieu lenh";
sw.WriteLine(kq);
sw.Flush();
}
sr.Close();
sw.Close();
client.Close();
}

}
2.3.3. L p UDPClient
Giao thøc UDP (User Datagram Protocol hay User Define Protocol) l) mét giao thøc
phi kÕt nèi (Connectionless) cã nghÜa l) mét bªn có thể gửi dữ liệu cho bên kia m) không cần
biết l) bên đó đ9 sẵn s)ng hay cha ? (Nói cách khác l) không cần thiết lập kết nối giữa hai
bên khi tiến h)nh trao đổi thông tin). Giao thøc n)y kh«ng tin cËy b»ng giao thøc TCP nh−ng
tèc độ lại nhanh v) dễ c)i đặt. Ngo)i ra, với giao thức UDP ta còn có thể gửi các gói tin quảng
bá (Broadcast) cho đồng thời nhiều máy.
Trong .NET, lớp
của giao thøc UDP.
!

! (n»m trong

" #

UdpClient ()

UdpClient (AddressFamily)

UdpClient (Int32)
UdpClient (IPEndPoint)

UdpClient (Int32, AddressFamily)

) đóng gói các chức năng

$

!


Tạo một đối tợng (thể hiện) mới của lớp
UDPClient.
Tạo một đối tợng (thể hiện) mới của lớp
UDPClient. Thuộc một dòng địa chỉ
(AddressFamily) đợc chỉ định.
Tạo một

$

! v) gắn (bind) một cổng cho nó.

Tạo một
$
! v) gắn (bind) một IPEndpoint
(gán địa chỉ IP v) cổng) cho nó.
Tạo một
$
AddressFamily

! v) gán số hiệu cổng,

24


UdpClient (String, Int32)

%&

Tạo một

$
mặc định.

! v) thiết lập với một trạm từ xa

#
"

$

!

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

Close

§ãng kÕt nèi.

Connect

ThiÕt lËp mét Default remote host.

EndReceive


KÕt thóc nhËn dữ liệu không đồng bộ ở trên

EndSend

Kết thúc việc gửi dữ liệu không đồng bộ ở trên
#'! ( ) *+,!- ./0
"12 3 4 -5 6 (Đồng bộ có
nghĩa l) các lệnh ngay sau lệnh Receive chỉ đợc thực thi nếu
Receive đ9 nhận đợc dữ liệu về . Còn nếu nó cha nhận
đợc dù chỉ một chút thì nó vÉn cø chê (blocking))

7 !

85

( ) *+,!- ./0 # "12 3 4 6

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:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
25



×