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

lập trình mạng với Csharp

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.26 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
CuuDuongThanCong.com


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
CuuDuongThanCong.com


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 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 :
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
CuuDuongThanCong.com


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
hoá 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ã 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 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
CuuDuongThanCong.com


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
CuuDuongThanCong.com



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

6
CuuDuongThanCong.com


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
CuuDuongThanCong.com


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
CuuDuongThanCong.com


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

9
CuuDuongThanCong.com


ð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 ñ
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.
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
CuuDuongThanCong.com



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
CuuDuongThanCong.com


ðó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
……….
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

CuuDuongThanCong.com


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
CuuDuongThanCong.com


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
CuuDuongThanCong.com


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
CuuDuongThanCong.com



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
CuuDuongThanCong.com


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
CuuDuongThanCong.com


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
CuuDuongThanCong.com


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
CuuDuongThanCong.com


}
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
CuuDuongThanCong.com


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
CuuDuongThanCong.com


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 ñluôn thmc hi[n l’ng nghe và chgp nhen các kXt nJi ñXn tn Client.
22
CuuDuongThanCong.com


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
CuuDuongThanCong.com


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 nhng
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
CuuDuongThanCong.com


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 chng trỡnh Chat gi3a 2 mỏy:
Do chng trỡnh K 2 mỏy l nh nhau ta ch= c%n viXt mIt chng 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
CuuDuongThanCong.com


×