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