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
47 trang |
Chia sẻ: Mr Hưng | Lượt xem: 871 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Lập trình mạng nâng cao - Xử lý sự kiện (event), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
XỬ LÝ SỰ KIỆN (EVENT)LẬP TRÌNH MẠNG NÂNG CAO1Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeMô hình xử lý sự kiện trong WindowsĐược thể hiện như sau:2Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeTrong 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 Windows3Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeVí 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()); }Mô hình xử lý sự kiện trong Windows4Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeTHREAD5Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeSử dụng Thread trong ứng dụng mạngMộ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.6Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeSử dụng Thread trong chương trình .NetĐể sử dụng Thread trong .Net ta sử dụng NameSpace System.ThreadingMột số phương thức thường dùng:Tên phương thứcÝ nghĩaAbort()Kết thúc ThreadJoin()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 JoinResume()Tiếp tục chạy Thread đã bị tạm ngưngSleep()Static method: tạm dừng thread trong một khoảng thời gianStart()Bắt đầu chạy ThreadSuspend()Tạm ngưng Thread7Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeSử dụng Thread trong chương trình .NetSau 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ĩaCurrentThreadĐây là phương thức tĩnh. Trả vể Thread hiện hành đang chạy.IsAliveTrả về giá trị cho biết trạng thái thực thi của Thread hiện hànhThreadStateLấy về trạng thái của Thread (đang dừng hay chạy)8Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeTạo một luồng trong C#: { Thread newThread=new Thread(new ThreadStart(newMethod)); newThread.Start(); . } void newMethod() { ... }Sử dụng Thread trong chương trình .Net9Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeVí dụ: using System; using System.Threading; class ThreadSample { public static void Main() { ThreadSample ts = new ThreadSample(); } public ThreadSample() { int i; Thread newCounter1 = new Thread(new ThreadStart(Counter1)); Thread newCounter2 = new Thread(new ThreadStart(Counter2)); newCounter1.Start(); newCounter2.Start(); }Sử dụng Thread trong chương trình .Netvoid Counter1() { 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); } } }10Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeĐ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 ClientMô hình ứng dụng đa luồng:Sử dụng Thread trong chương trình ServerCreate SocketBind SocketListen on SocketWhile { Accept connect Create Thread}Send WellcomeWhile { Receive data Send data}Close socketServerClient11Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeVí dụ: Chương trình Client-Server để trả về ngày, giờ của Server?Sử dụng Thread trong chương trình Server12Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeSử dụng Thread để gửi nhận dữ liệu13Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeSOCKET KHÔNG ĐỒNG BỘLẬP TRÌNH MẠNG NÂNG CAO14Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT College 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ụ15Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeMô hình Client/Server cho phương thức không đồng bộ như sau:Socket không đồng bộ - ví dụ16Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeLớ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ànhNhữ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 AsyncCallbackPhươ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ộ17Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeMỗ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 ByDescription of RequestRequests Ended BYBeginAccept() To accept an incoming connectionEndAccept() BeginConnect() To connect to a remote hostEndConnect() BeginReceive() To retrieve data from a socketEndReceive() BeginReceiveFrom() To retrieve data from a specific remote hostEndReceiveFrom() BeginSend() To send data from a socketEndSend() BeginSendTo() To send data to a specific remote hostEndSendTo() Socket không đồng bộ18Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeSocket 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); 19Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeSau 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ọiPhươ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ọiPhươ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); . . . } 20Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeThe 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); Socket không đồng bộ21Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeThe 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"); } } Socket không đồng bộ22Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeThe 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); } Socket không đồng bộ23Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeThe BeginSendTo() and EndSendTo() MethodsDùng cho Socket không hướng kết nốiDạ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); Socket không đồng bộ24Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeThe BeginSendTo() and EndSendTo() MethodsDạ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); Socket không đồng bộ25Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeThe BeginReceive() and EndReceive() Methods:EndReceive(): void ReceivedData(IAsyncResult iar) { 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ộ26Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeThe BeginReceiveFrom() and EndReceiveFrom() Methods:Dùng cho Socket không hướng kết nốiDạ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ộ27Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeThe BeginReceiveFrom() and EndReceiveFrom() Methods:EndReceiveFrom(): void ReceiveData(IasyncResult iar) { 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ộ28Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeKỹ thuật IP MulticastingBroadCasting là gì?Dùng để gửi một gói tin đến tất cả các nút trong mạngĐể thực hiện hình thức quảng bá, địa chỉ đến của gói tin sẽ là địa chỉ quảng bá.Có hai loại là:Local BroadCastGlobal BroadCastVí dụ: Cho mạng lớp B có địa chỉ IP là 192.168.0.0 có SubNet Mask là 255.255.0.0, địa chỉ Local Broadcast là: 192.168.255.25529Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeKỹ thuật IP MulticastingChương trình khai báo và gửi gói tin Broadcast:class BadBroadcast { public static void Main() { Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, 9050); byte[] data = Encoding.ASCII.GetBytes("This is a test message");sock.SendTo(data, iep); sock.Close(); } } 30Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeKỹ thuật IP MulticastingDù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 lớp Socket :Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1); 31Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeKỹ thuật IP MulticastingDùng kỹ thuật BroadCasting để gửi dữ liệu đến nhiều máy trong mạng cục bộ Gửi gói dữ liệu:class Broadcst {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(); }}32Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeKỹ 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();}}33Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeKỹ thuật IP MulticastingSử dụng Broadcast Packet để thông báo có sự hiện diện của Serverclass Advertise { public static void Main() { Advertise server = new Advertise(); } public Advertise() { Thread advert = new Thread(new ThreadStart(sendPackets)); advert.IsBackground = true; advert.Start(); Console.Write("Press Enter to stop"); string data = Console.ReadLine(); } 34Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeKỹ thuật IP MulticastingSử dụng Broadcast Packet để thông báo có sự hiện diện của Servervoid sendPackets() { Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1); IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, 9050); string hostname = Dns.GetHostName(); byte[] data = Encoding.ASCII.GetBytes(hostname); while (true) { sock.SendTo(data, iep); Thread.Sleep(6000); } } 35Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeKỹ thuật IP MulticastingMulticasting 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.RangeAssignment224.0.0.0–224.0.0.255Local network control block224.0.1.0–224.0.1.255Internetwork control block224.0.2.0–224.0.255.0AD-HOC block224.1.0.0–224.1.255.255ST multicast groups224.2.0.0–224.2.255.255SDP/SAP block224.252.0.0–224.255.255.255DIS transient block225.0.0.0–231.255.255.255Reserved232.0.0.0–232.255.255.255Source-specific multicast block233.0.0.0–233.255.255.255GLOP block234.0.0.0–238.255.255.255Reserved239.0.0.0–239.255.255.255Administratively scoped block36Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeMột số địa chỉ Multicast:Kỹ thuật IP Multicasting37Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeKỹ thuật IP MulticastingCó hai kỹ thuật Multicast được sử dụng:Peer to peer:38Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeKỹ thuật IP MulticastingCó hai kỹ thuật Multicast được sử dụng:Central Server: 39Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeKỹ thuật IP MulticastingGửi multicast Packets qua Router 40Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeSocket Multicasting trong .NetSử dụng phương thức SocketOption():Phương thức SocketOption() dùng để:Thêm một socket vào nhóm MulticastLoại bỏ một socket khỏi nhóm MulticastSetSocketOption(SocketOptionLevel,SocketOptionName, optionValue) SocketOptionName:AddMembership DropMembership 41Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeSocket Multicasting trong .NetSử 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"));42Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeSocket Multicasting trong .NetGửi dữ liệu Multicastclass MultiSend{public static void Main(){Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);IPEndPoint iep = new IPEndPoint(IPAddress.Parse("224.100.0.1"), 9050);byte[] data = Encoding.ASCII.GetBytes("This is a test message");server.SendTo(data, iep);server.Close();}}43Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeSocket Multicasting trong .NetNhận dữ liệu Multicastclass MultiRecv{public static void Main() {Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);Console.WriteLine("Ready to receive");IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050); EndPoint ep = (EndPoint)iep;sock.Bind(iep);sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse("224.100.0.1")));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();}}44Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeSocket Multicasting trong .NetMulticast với lớp UdpClient:JoinMulticastGroup()DropMulticastGroup()JoinMulticastGroup() là phương thức overloadJoinMulticastGroup(IPAddress)JoinMulticastGroup(IPAddress,int)45Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeSocket Multicasting trong .NetUdpClient Multicast Receiver class UdpClientMultiRecv { public static void Main() { UdpClient sock = new UdpClient(9050); Console.WriteLine("Ready to receive");sock.JoinMulticastGroup(IPAddress.Parse("224.100.0.1"), 50);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(); } } 46Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT CollegeSocket Multicasting trong .NetUdpClient 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(); } } 47Nguyễn Vũ Vũ – IT Faculty, Viet Han Friendship IT College
Các file đính kèm theo tài liệu này:
- baigianglaptrinhmangnangcaonguyenvu1_7825.ppt