Tải bản đầy đủ (.ppt) (47 trang)

Lập Trình Mạng Nâng Cao - Xử Lý Sự Kiện (Event)

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 (1.57 MB, 47 trang )

LẬP TRÌNH MẠNG NÂNG CAO

XỬ LÝ SỰ KIỆN (EVENT)

Nguyễn Vũ – IT Faculty, Viet Han Friendship 1


Mô hình xử lý sự kiện trong Windows
 Được thể hiện như sau:

Nguyễn Vũ – IT Faculty, Viet Han Friendship 2


Mô hình xử lý sự kiện trong Windows

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

Nguyễn Vũ – IT Faculty, Viet Han Friendship 3


Mô hình xử lý sự kiện trong Windows
 Ví dụ:
button1.Click += new EventHandler(Thongbao);
private void button1_Click(object sender, EventArgs e)
{
int a = Convert.ToInt32(textBox1.Text);


int b = Convert.ToInt32(textBox2.Text);
c = a + b;
textBox3.Text = c.ToString();
}
private void Thongbao(object sender, EventArgs e)
{
MessageBox.Show("Tong cua hai so la:" + c.ToString());
}
Nguyễn Vũ – IT Faculty, Viet Han Friendship 4


THREAD

Nguyễn Vũ – IT Faculty, Viet Han Friendship 5


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.

Nguyễn Vũ – IT Faculty, Viet Han Friendship 6


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

Suspend()

Tạm ngưng Thread
Nguyễn Vũ – IT Faculty, Viet Han Friendship 7


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)

Nguyễn Vũ – IT Faculty, Viet Han Friendship 8


Sử dụng Thread trong chương trình .Net
 Tạo một luồng trong C#:
{
……
Thread newThread=new Thread(new
ThreadStart(newMethod));
newThread.Start();
…….
}
void newMethod()
{
...
}
Nguyễn Vũ – IT Faculty, Viet Han Friendship 9


Sử dụng Thread trong chương trình .Net
void Counter1()
using System;
{
using System.Threading;
int i;
class ThreadSample
for (i = 0; i < 10; i++)

{
{
public static void Main()
Console.WriteLine(" thread 1: {0}", i);
{
Thread.Sleep(2000); }
ThreadSample ts = new
}
ThreadSample();
void Counter2()
}
{
public ThreadSample()
int i;
{
for (i = 0; i < 10; i++)
int i;
{
Thread newCounter1 = new
Console.WriteLine("thread 2: {0}", i);
Thread(new ThreadStart(Counter1));
Thread.Sleep(3000);
Thread newCounter2 = new
}
Thread(new ThreadStart(Counter2));
newCounter1.Start();
}
newCounter2.Start();
}
}



Ví dụ:

Nguyễn Vũ – IT Faculty, Viet Han Friendship 10


Sử dụng Thread trong chương trình Server
 Đ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:
Create Socket
Bind Socket
Listen on Socket
While {
Accept connect
Create Thread
}

Server

Client
Send Wellcome
While {
Receive data
Send data
}
Close socket

Nguyễn Vũ – IT Faculty, Viet Han Friendship 11



Sử dụng Thread trong chương trình Server
 Ví dụ: Chương trình Client-Server để trả về ngày, giờ
của Server?

Nguyễn Vũ – IT Faculty, Viet Han Friendship 12


Sử dụng Thread để gửi nhận dữ liệu

Nguyễn Vũ – IT Faculty, Viet Han Friendship 13


LẬP TRÌNH MẠNG NÂNG CAO

SOCKET KHÔNG ĐỒNG BỘ

Nguyễn Vũ – IT Faculty, Viet Han Friendship 14


Socket không đồng bộ - ví dụ
 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:

Nguyễn Vũ – IT Faculty, Viet Han Friendship 15



Socket không đồng bộ - ví dụ
 Mô hình Client/Server cho phương thức không đồng bộ
như sau:

Nguyễn Vũ – IT Faculty, Viet Han Friendship 16


Socket không đồng bộ
 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

Nguyễn Vũ – IT Faculty, Viet Han Friendship 17


Socket không đồng bộ
 Mỗi phương thức Begin có 1 phương thức End được kết hợp để hoàn
thành 1 hàm, các phương thức được liệt kê trong bảng sau:
Requests Started By… Description of Request

Requests Ended
BY…


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

Nguyễn Vũ – IT Faculty, Viet Han Friendship 18


Socket 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)
 Ví dụ:
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);
Nguyễn Vũ – IT Faculty, Viet Han Friendship 19


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);
. . .
}
Nguyễn Vũ – IT Faculty, Viet Han Friendship 20


Socket không đồng bộ
 The BeginConnect() and EndConnect() Methods:
 Dạng của BeginConnect():
IAsyncResult BeginConnect(EndPoint ep, AsyncCallback
callback, Object state)
 Ví dụ về BeginConnect():
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);

Nguyễn Vũ – IT Faculty, Viet Han Friendship 21


Socket không đồng bộ

 The BeginConnect() and EndConnect() Methods:
 Dạng của EndConnect():
EndConnect(IAsyncResult iar)

 Ví dụ về EndConnect():
public static void Connected(IAsyncResult iar){
Socket sock = (Socket)iar.AsyncState;
try {
sock.EndConnect(iar);
}
catch (SocketException) {
Console.WriteLine("Unable to connect to host");
}
}
Nguyễn Vũ – IT Faculty, Viet Han Friendship 22


Socket không đồng bộ
 The BeginSend() and EndSend() Methods:
 Dạng của BeginSend():
IAsyncResult BeginSend(byte[] buffer, int offset, int size,
SocketFlags sockflag, AsyncCallback callback, object state)
 Ví dụ:
sock.BeginSend(data,0, data.Length, SocketFlags.None, new
AsyncCallback(SendData), sock);
 Dạng của EndSend():
int EndSend(IAsyncResult iar)
 Ví dụ:
private static void SendData(IAsyncResult iar)
{ Socket server = (Socket)iar.AsyncState;

int sent = server.EndSend(iar);
}
Nguyễn Vũ – IT Faculty, Viet Han Friendship 23


Socket không đồng bộ
 The BeginSendTo() and EndSendTo() Methods
 Dùng cho Socket không hướng kết nối
 Dạng của BeginSendTo():
IAsyncResult BeginSendTo(byte[] buffer, int offset, int size,
SocketFlags sockflag, EndPoint ep, AsyncCallback
callback, object state)
 Ví dụ:
IPEndPoint iep = new
IPEndPoint(IPAddress.Parse("192.168.1.6"), 9050);
sock.BeginSendTo(data, 0, data.Length, SocketFlags.None,
iep, new AsynCallback(SendDataTo), sock);

Nguyễn Vũ – IT Faculty, Viet Han Friendship 24


Socket không đồng bộ
 The BeginSendTo() and EndSendTo() Methods
 Dạng của EndSendTo():
int EndSendTo(IAsyncResult iar)
 The BeginReceive() and EndReceive() Methods:
 Dạng của BeginReceive()
IAsyncResult BeginReceive(byte[] buffer, int offset, int size,
SocketFlags sockflag, AsyncCallback callback, object state)
 Ví dụ:

sock.BeginReceive(data, 0, data.Length,
SocketFlags.None, new AsyncCallback(ReceivedData),
sock);

Nguyễn Vũ – IT Faculty, Viet Han Friendship 25


×