Nguyễn Vũ – IT Faculty, Viet Han Friendship IT College 6 Sử dụng Thread trong ứng dụng mạng Một số khái niệm: Đa nhiệm multitasking: là khả năng hệ điều hành làm nhiều công việc tại
Trang 1XỬ LÝ SỰ KIỆN (EVENT)
LẬP TRÌNH MẠNG NÂNG CAO
Trang 2Nguyễn Vũ – IT Faculty, Viet Han Friendship
IT College
2
Mô hình xử lý sự kiện trong Windows
Được thể hiện như sau:
Trang 3 Trong mô hình xử lý sự kiện, hai từ khoá hay được dùng đó là event và delegate.
Sự kiện Sender và
Receiver trong
windows được mô tả
trong mô hình sau:
Mô hình xử lý sự kiện trong Windows
Trang 4Nguyễn Vũ – IT Faculty, Viet Han Friendship
IT College
4
Ví dụ:
button1.Click += new EventHandler(Thongbao);
private void button1_Click(object sender, EventArgs e) {
Trang 5THREAD
Trang 6Nguyễn Vũ – IT Faculty, Viet Han Friendship
IT College
6
Sử dụng Thread trong ứng dụng mạng
Một số khái niệm:
Đa nhiệm (multitasking): là khả năng hệ điều hành làm
nhiều công việc tại 1 thời điểm
Tiến trình (process): HĐH cấp phát bộ nhớ và tài nguyên
riêng biệt để chạy 1 ứng dụng nào đó
Luồng (Thread): Trong hệ thống, một
tiến trình có thể có 1 hoặc nhiều chuỗi
thực hiện tách biệt nhau và có thể chạy
đồng thời Mỗi chuỗi thực hiện này gọi
là 1 thread
Nhờ luồng ta có thể thiết kế các Server
đáp ứng các yêu cầu một cách đồng
thời
Trang 7Sử dụng Thread trong chương trình Net
Để sử dụng Thread trong Net ta sử dụng NameSpace
System.Threading
Một số phương thức thường dùng:
Tên phương thức Ý nghĩa
Abort() Kết thúc Thread
Join() Buộc chương trình phải chờ cho Thread kết thúc
thì mới thực hiện tiếp các câu lệnh sau Join Resume() Tiếp tục chạy Thread đã bị tạm ngưng
Sleep() Static method: tạm dừng thread trong một khoảng
thời gian Start() Bắt đầu chạy Thread
Trang 8Nguyễn Vũ – IT Faculty, Viet Han Friendship
IT College
8
Sử dụng Thread trong chương trình Net
Sau khi Thread bắt đầu, các phương thức: Abort(), Join(),
Resume(), Sleep() mới có thể được thực hiện.
Một số thuộc tính thường dùng:
Tên phương thức Ý nghĩa
CurrentThread Đây là phương thức tĩnh Trả vể Thread
hiện hành đang chạy
IsAlive Trả về giá trị cho biết trạng thái thực thi của
Thread hiện hành
ThreadState Lấy về trạng thái của Thread (đang dừng hay
chạy)
Trang 9 Tạo một luồng trong C#:
Trang 10Nguyễn Vũ – IT Faculty, Viet Han Friendship
int i;
for (i = 0; i < 10; i++) {
Console.WriteLine(" thread 1: {0}", i); Thread.Sleep(2000); }
} void Counter2() {
int i;
for (i = 0; i < 10; i++) {
Console.WriteLine("thread 2: {0}", i); Thread.Sleep(3000);
} } }
Trang 11 Đa luồng hay được sử dụng trong các chương trình Server, tại 1 thời điểm Server chấp nhận nhiều kết nối đến Client
Mô hình ứng dụng đa luồng:
Sử dụng Thread trong chương trình Server
Receive data Send data }
Close socket
Server
Client
Trang 12Nguyễn Vũ – IT Faculty, Viet Han Friendship
Trang 13Sử dụng Thread để gửi nhận dữ liệu
Trang 14Nguyễn Vũ – IT Faculty, Viet Han Friendship
IT College
14
SOCKET KHÔNG ĐỒNG BỘ
LẬP TRÌNH MẠNG NÂNG CAO
Trang 15 Socket không đồng bộ tức là lời gọi hàm sẽ trở về ngay
bất chấp dữ liệu gửi/nhận hoặc yêu cầu kết nối đã hoàn tất hay chưa.
Mô hình Client-Server cho phương thức không đồng bộ
như sau:
Socket không đồng bộ - ví dụ
Trang 16Nguyễn Vũ – IT Faculty, Viet Han Friendship
Trang 17 Lớp AsyncCallback:
Lớp này cho phép các phương thức bắt đầu 1
hàm không đồng bộ và thay thế 1 phương thức uỷ
quyền khi hàm không đồng bộ hoàn thành
Những phương thức Socket ko đồng bộ tách những hàm phổ biến của lập trình mạng thành 2 phần:
Phương thức Begin để bắt đầu 1 hàm và đăng ký
với phương thức AsyncCallback
Phương thức End kết thúc 1 hàm khi phương thức
AsyncCallback được gọi
Socket không đồng bộ
Trang 18Nguyễn Vũ – IT Faculty, Viet Han Friendship
BeginAccept() To accept an incoming connection EndAccept()
BeginConnect() To connect to a remote host EndConnect()
BeginReceive() To retrieve data from a socket EndReceive()
BeginReceiveFrom() To retrieve data from a specific
remote host EndReceiveFrom() BeginSend() To send data from a socket EndSend()
BeginSendTo() To send data to a specific remote host EndSendTo()
Socket không đồng bộ
Trang 19Socket không đồng bộ
Để chấp nhận 1 kết nối đến từ 1 client ở xa, ta dùng
phương thức BeginAccept() Theo dạng như sau:
IAsyncResult BeginAccept(AsyncCallback callback, object state)
Trang 20Nguyễn Vũ – IT Faculty, Viet Han Friendship
IT College
20
Sau khi phương thức BeginAccept() kết thúc và 1 kết nối xảy
ra thì phương thức AsyncCallback được gọi
Phương thức AsyncCallback bao gồm phương thức
EndAccept() để kết thúc việc chấp nhận 1 socket
Đây là cú pháp của phương thức EndAccept():
Socket EndAccept(IAsyncResult iar);
Phương thức End thường được viết theo dạng sau:
private static void CallAccept(IAsyncResult iar)
{
Socket server = (Socket)iar.AsyncState;
Socket client = server.EndAccept(iar);
}
Socket không đồng bộ
Sau khi phương thức BeginAccept() kết thúc và 1 kết nối xảy
ra thì phương thức AsyncCallback được gọi
Phương thức AsyncCallback bao gồm phương thức
EndAccept() để kết thúc việc chấp nhận 1 socket
Đây là cú pháp của phương thức EndAccept():
Socket EndAccept(IAsyncResult iar);
Phương thức End thường được viết theo dạng sau:
private static void CallAccept(IAsyncResult iar)
{
Socket server = (Socket)iar.AsyncState;
Socket client = server.EndAccept(iar);
}
Trang 21 The BeginConnect() and EndConnect() Methods:
Trang 22Nguyễn Vũ – IT Faculty, Viet Han Friendship
public static void Connected(IAsyncResult iar){
Socket sock = (Socket)iar.AsyncState;
Socket không đồng bộ
Trang 23 The BeginSend() and EndSend() Methods:
Dạng của 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);
Socket không đồng bộ
Trang 24Nguyễn Vũ – IT Faculty, Viet Han Friendship
IT College
24
The BeginSendTo() and EndSendTo() Methods
Dùng cho Socket không hướng kết nối
Trang 25 The BeginSendTo() and EndSendTo() Methods
Dạng của EndSendTo():
int EndSendTo(IAsyncResult iar)
The BeginReceive() and EndReceive() Methods:
Trang 26Nguyễn Vũ – IT Faculty, Viet Han Friendship
Socket remote = (Socket)iar.AsyncState;
int recv = remote.EndReceive(iar);
string receivedData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);
}
Socket không đồng bộ
Trang 27 The BeginReceiveFrom() and EndReceiveFrom() Methods:
Dùng cho Socket không hướng kết nối
Dạng của BeginReceiveFrom():
IAsyncResult BeginReceiveFrom(byte[] buffer, int offset, int size, SocketFlags sockflag, ref EndPoint ep, AsyncCallback callback, object state)
Ví dụ:
sock.BeginReceive(data, 0, data.Length, SocketFlags.None, ref iep, new AsyncCallback(ReceiveData), sock);
Socket không đồng bộ
Trang 28Nguyễn Vũ – IT Faculty, Viet Han Friendship
Socket remote = (Socket)iar.AsyncState;
int recv = remote.EndReceiveFrom(iar);
string stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);
}
Socket không đồng bộ
Trang 30Nguyễn Vũ – IT Faculty, Viet Han Friendship
sock.Close();
}
}
Trang 31Kỹ thuật IP Multicasting
Dùng kỹ thuật BroadCasting để gửi dữ liệu đến nhiều máy trong mạng cục bộ
Đối với một ứng dụng C # để gửi các gói dữ liệu
Broadcast, ta dùng phương thức SetSocketOption() của
Trang 32Nguyễn Vũ – IT Faculty, Viet Han Friendship
public static void Main() {
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
IPEndPoint iep1 = new IPEndPoint(IPAddress.Broadcast, 9050);
IPEndPoint iep2 = new IPEndPoint(IPAddress.Parse("192.168.1.255"), 9050);
string hostname = Dns.GetHostName();
byte[] data = Encoding.ASCII.GetBytes(hostname);
sock SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.Broadcast, 1);
sock SendTo( data , iep1 );
sock SendTo( data , iep2 );
sock Close();
}
}
Trang 33Kỹ thuật IP Multicasting
Nhận gói dữ liệu:
class RecvBroadcst {
public static void Main() {
Socket sock = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
sock.Bind( iep );
EndPoint ep = (EndPoint) iep ;
Console.WriteLine("Ready to receiye…");
byte[] data = new byte[1024];
int recv = sock ReceiveFrom( data , ref ep );
string stringData = Encoding.ASCII.GetString( data , 0, recv );
Console.WriteLine("received: {0} from: {1}", stringData, ep.ToString());
data = new byte[1024];
recv = sock ReceiveFrom( data , ref ep );
stringData = Encoding.ASCII.GetString( data , 0, recy );
Console.WriteLine("received: {0} from: {1}",stringData, ep ToString());
sock Close();
}
Trang 34Nguyễn Vũ – IT Faculty, Viet Han Friendship
Console.Write("Press Enter to stop");
string data = Console.ReadLine();
}
Trang 35IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, 9050);
string hostname = Dns.GetHostName();
byte[] data = Encoding.ASCII.GetBytes(hostname);
Trang 36Nguyễn Vũ – IT Faculty, Viet Han Friendship
IT College
36
Kỹ thuật IP Multicasting
Multicasting là gì?
Một địa chỉ Multicasting cho phép thiết bị gửi dữ liệu tới một tập
xác định trước các host, được biết đến như các nhóm Multicast, trong các mạng con khác nhau.
224.0.0.0–224.0.0.255 Local network control block
224.0.1.0–224.0.1.255 Internetwork control block
Trang 37 Một số địa chỉ Multicast:
Kỹ thuật IP Multicasting
Trang 38Nguyễn Vũ – IT Faculty, Viet Han Friendship
Trang 39Kỹ thuật IP Multicasting
Có hai kỹ thuật Multicast được sử dụng:
Central Server:
Trang 40Nguyễn Vũ – IT Faculty, Viet Han Friendship
Trang 41Socket Multicasting trong Net
Phương thức SocketOption() dùng để:
Thêm một socket vào nhóm Multicast
Loại bỏ một socket khỏi nhóm Multicast
SetSocketOption(SocketOptionLevel,SocketOption Name, optionValue)
SocketOptionName:
AddMembership
DropMembership
Trang 42Nguyễn Vũ – IT Faculty, Viet Han Friendship
IT College
42
Socket Multicasting trong Net
Sử dụng phương thức SocketOption():
Ví dụ thêm một Socket vào nhóm Multicast
224.100.0.1 ta viết như sau:
sock.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.AddMembership, new
MulticastOption(IPAddress.Parse("224.100.0.1"));
Trang 43Socket Multicasting trong Net
Gửi dữ liệu Multicast
Trang 44Nguyễn Vũ – IT Faculty, Viet Han Friendship
public static void Main() {
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
byte[] data = new byte[1024];
int recv = sock.ReceiveFrom(data, ref ep);
string stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine("received: {0} from: {1}", stringData, ep.ToString());
sock.Close();
}
}
Trang 45Socket Multicasting trong Net
Multicast với lớp UdpClient:
Trang 46Nguyễn Vũ – IT Faculty, Viet Han Friendship
IT College
46
Socket Multicasting trong Net
UdpClient Multicast Receiver
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);
byte[] data = sock.Receive(ref iep);
string stringData = Encoding.ASCII.GetString(data, 0, data.Length); Console.WriteLine("received: {0} from: {1}", stringData, iep.ToString()); sock.Close();
}
}
Trang 47Socket Multicasting trong Net
UdpClient Multicast Sender
class UdpClientMultiSend
{
public static void Main()
{
UdpClient sock = new UdpClient();
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("224.100.0.1"), 9050); byte[] data = Encoding.ASCII.GetBytes("This is a test message");
sock.Send(data, data.Length, iep);
sock.Close();
}