1. Trang chủ
  2. » Cao đẳng - Đại học

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

117 71 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 117
Dung lượng 2,26 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

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

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

Trang 3

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 :

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

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

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

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 6

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

Trang 8

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

Trang 9

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

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 11

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

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 13

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

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

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 15

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

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 16

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:

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 17

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

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 18

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

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 19

data = 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 22

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:

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 23

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

cña giao thøc UDP

Trang 25

UdpClient (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 26

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

Mô 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 28

Cá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 29

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

sock.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 31

Chươ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 32

label2.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 33

client = (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 34

results = 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 35

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

Socket.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 37

Sau ñâ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 38

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

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

r 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

Ngày đăng: 16/12/2019, 17:02

w