1. Trang chủ
  2. » Công Nghệ Thông Tin

Giáo trình Lập trình mạng: Phần 2 - Trường Đại học Phan Thiết

99 0 0
Tài liệu đã được kiểm tra trùng lặp

Đ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

Tiếp nội dung phần 1, Giáo trình Lập trình mạng: Phần 2 cung cấp cho người học những kiến thức như: Sử dụng các lớp helper của C# socket; đa nhiệm tiểu trình; đồng bộ hóa; lập trình socket bất đồng bộ. Mời các bạn cùng tham khảo!

Khoa Cơng Nghệ Thơng Tin Giáo trình Lập Trình Mạng CHƢƠNG IV: SỬ DỤNG CÁC LỚP HELPER CỦA C# SOCKET IV.1 Lớp TCP Client Lớp TcpClient nằm namespace System.Net.Sockets đƣợc thiết kế để hỗ trợ cho việc viết ứng dụng TCP Client đƣợc dễ dàng Lớp TcpClient cho phép tạo đối tƣợng Tcp Client sử dụng ba phƣơng thức tạo lập sau: TcpClient(): phƣơng thức tạo lập đầu tiên, đối tƣợng đƣợc tạo phƣơng thức tạo lập gắn kết với địa cục port TCP ngẫu nhiên Sau đối tƣợng TcpClient đƣợc tạo ra, phải đƣợc kết nối đến thiết bị xa thơng qua phƣơng thức Connect() nhƣ ví dụ dƣới đây: TcpClient newcon = new TcpClient(); newcon.Connect("192.168.6.1", 8000); TcpClient(IPEndPoint localEP): phƣơng thức tạo lập cho phép địa IP cục với port đƣợc dùng Đây phƣơng thức tạo lập thƣờng đƣợc sử dụng thiết bị có nhiều card mạng muốn liệu đƣợc gởi card mạng Phƣơng thức Connect() đƣợc dùng để kết nối với thiết bị xa: IPEndPoint iep = new IPEndPoint(IPAddress,Parse("192.168.6.1"), 8000); TcpClient newcon = new TcpClient(iep); newcon.Connect("192.168.6.2", 8000); TcpClient(String host, int port): phƣơng thức tạo lập thứ ba thƣờng đƣợc sử dụng nhất, cho phép thiết bị nhận phƣơng thức tạo lập không cần phải dùng phƣơng thức Connect() Địa thiết bị xa chuỗi hostname chuỗi địa IP Phƣơng thức tạo lập TcpClient tự động phân giải hostname thành địa IP Ví dụ: TcpClient newcon = new TcpClient("www.isp.net", 8000); Mỗi đối tƣợng TcpClient đƣợc tạo ra, nhiều thuộc tính phƣơng thức đƣợc dùng để xử lý việc truyền liệu qua lại thiết bị Trang 79 Khoa Cơng Nghệ Thơng Tin Giáo trình Lập Trình Mạng Phƣơng Thức Close() Connect() Mơ Tả Đóng kết nối TCP Thành lập kết nối TCP với thiết bị xa Equals() GetHashCode() So sánh hai đối tƣợng TcpClient Lấy mã hash code GetStream() GetType() Lấy đối tƣợng Stream dùng để gởi nhận liệu Lấy kiểu thể ToString() Chuyển thể sang kiểu chuỗi Phƣơng thức Connect() dùng để kết nối đối tƣợng TcpClient đến thiết bị xa Mỗi kết nối đƣợc thành lập, phƣơng thức GetStream() gán đối tƣợng NetworkStream để gởi nhận liệu nhờ vào phƣơng thức Read() Write() Lớp TcpClient cịn có nhiều thuộc tính đƣợc mơ tả bảng sau: Thuộc Tính LingerState Mơ Tả Lấy thiết lập thời gian kết nối TCP sau gọi phƣơng thức Close() NoDelay Lấy thiết lập thời gian trễ đƣợc dùng để gởi nhận đệm TCP ReceiveBufferSize Lấy thiết lập kích thƣớc đệm TCP nhận ReceiveTimeout Lấy thiết lập thời gian timeout Socket SendBufferSize SendTimeout Lấy thiết lập kích thƣớc đệm TCP gởi Lấy thiết lập giá trị timeout Socket Chƣơng trình TCPClient đơn giản using System; using System.Net; using System.Net.Sockets; using System.Text; class TcpClientSample { public static void Main() { byte[] data = new byte[1024]; string input, stringData; TcpClient server; Trang 80 Khoa Công Nghệ Thông Tin Giáo trình Lập Trình Mạng try { server = new TcpClient("127.0.0.1", 5000); } catch (SocketException) { Console.WriteLine("Khong the ket noi den server"); return; } NetworkStream ns = server.GetStream(); int recv = ns.Read(data, 0, data.Length); stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); while (true) { input = Console.ReadLine(); if (input == "exit") break; ns.Write(Encoding.ASCII.GetBytes(input), 0, input.Length); ns.Flush(); data = new byte[1024]; recv = ns.Read(data, 0, data.Length); stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); } Console.WriteLine("Dang ngat ket noi voi server "); ns.Close(); server.Close(); } } Trong chƣơng trình phƣơng thức tạo lập tự động kết nối đến Server đƣợc xa, nên đƣợc đặt khối try-catch để phịng trƣờng hợp Server khơng hợp lệ Sau đối tƣợng NetworkStream đƣợc tạo ra, ta dùng phƣơng thức Read() Write() để nhận gởi liệu: Trang 81 Khoa Công Nghệ Thông Tin Giáo trình Lập Trình Mạng while (true) { input = Console.ReadLine(); if (input == "exit") break; ns.Write(Encoding.ASCII.GetBytes(input), 0, input.Length); ns.Flush(); data = new byte[1024]; recv = ns.Read(data, 0, data.Length); stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); } Phƣơng thức Read() yêu cầu tham số:  Mảng byte để đặt liệu nhận vào  Vị trí offset đệm mà ta muốn đặt liệu  Chiều dài đệm liệu Cũng giống nhƣ phƣơng thức Receive() Socket, phƣơng thức Read() đọc lƣợng liệu có độ lớn tối đa độ lón đệm Nếu đệm nhỏ, phần liệu lại nằm stream đợi lần gọi phƣơng thức Read() Phƣơng thức Write() yêu cầu ba tham số:  Mảng byte để gởi liệu  Vị trí offset đệm mà ta muốn gởi liệu  Chiều dài liệu đƣợc gởi Cần ý TCP không bảo vệ biên thông điệp Điều áp dụng cho lớp TcpClient, ta cần phải xử lý vấn đề biên thông điệp giống nhƣ phƣơng thức Receive() lớp Socket cách tạo vòng lặp để đảm bảo tất liệu đƣợc đọc từ stream Ta test chƣơng trình với chƣơng trình TCP Server đơn giản phần IV.2 Lớp TCPListener Cũng giống nhƣ lớp TcpClient, lớp TcpListener cho phép tạo chƣơng trình TCP Server cách đơn giản Trang 82 Khoa Cơng Nghệ Thơng Tin Giáo trình Lập Trình Mạng Lớp TcpListener có ba phƣơng thức tạo lập:  TcpListener(int port): gắn đối tƣợng TcpListener vào port đƣợc máy cục  TcpListener(IPEndPoint ie): gắn đối tƣợng TcpListener vào đối tƣợng EndPoint cục  TcpListener(IPAddress addr, int port): gắn đối tƣợng TcpListener vào đối tƣợng IPAddress port Không giống nhƣ lớp TcpClient, phƣơng thức tạo lập lớp TcpListener yêu cầu tham số: số port mà Server lắng nghe kết nối Nếu Server có nhiều card mạng ta muốn lắng nghe card mạng ta dùng đối tƣợng IPEndPoint để địa IP card với số port dùng để lắng nghe Lớp TcpListener có số phƣơng thức sau: Phƣơng Thức AcceptSocket() Equals() GetHashCode() Mô Tả Chấp nhận kết nối port gán kết nối cho đối tƣợng Socket Chấp nhận kết nối port gán kết nối cho đối tƣợng TCPClient So sánh hai đối tƣợng TcpListener Lấy hash code GetType() Pending() Start() Stop() Lấy kiểu thể Kiểm tra xem có yêu cầu chờ kết nối hay không Bắt đầu lắng nghe kết nối Ngừng lắng nghe kết nối ToString() Chuyển đối tƣợng TcpListener thành chuỗi AcceptTcpClient() Phƣơng thức Start() tƣơng tự nhƣ phƣơng thứcBind() Listen() đƣợc dùng lớp socket Phƣơng thức Start() kết nối Socket đến EndPoint đƣợc định nghĩa phƣơng thức tạo lập lớp TcpListener đặt TCP port vào chế độ lắng nghe, sẵng sàng chấp nhận kết nối Phƣơng thức AcceptTcpClient() so sánh với phƣơng thức Accept() Socket, chấp nhận kết nối gán cho đối tƣợng TcpClient Sau đối tƣợng TcpClient đƣợc tạo ra, tất truyền thông với thiết bị xa đƣợc thực với đối tƣợng TcpClient với đối tƣợng Trang 83 Khoa Công Nghệ Thông Tin Giáo trình Lập Trình Mạng TcpListener ban đầu, đối tƣợng TcpListener đƣợc dùng để chấp nhận kết nối khác Để đóng đối tƣợng TcpListener ta dùng phƣơng thức Stop() Chƣơng trình TCPListener using System; using System.Net; using System.Net.Sockets; using System.Text; class TcpListenerSample { public static void Main() { int recv; byte[] data = new byte[1024]; TcpListener newsock = new TcpListener(5000); newsock.Start(); Console.WriteLine("Dan cho client ket noi den "); TcpClient client = newsock.AcceptTcpClient(); NetworkStream ns = client.GetStream(); string welcome = "Hello Client"; data = Encoding.ASCII.GetBytes(welcome); ns.Write(data, 0, data.Length); while (true) { data = new byte[1024]; recv = ns.Read(data, 0, data.Length); if (recv == 0) break; Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); ns.Write(data, 0, recv); } ns.Close(); client.Close(); newsock.Stop(); } } Chƣơng trình TcpListenerSample tạo đối tƣợng TcpListener, sử dụng port 5000 dùng phƣơng thức Start() để đặt đối tƣợng tạo vào chế độ Trang 84 Khoa Cơng Nghệ Thơng Tin Giáo trình Lập Trình Mạng lắng nghe Sau phƣơng thức AcceptTcpClient() chờ kết nối TCP đến gán kết nối đến vào đối tƣợng TcpClient: TcpListener newsock = new TcpListener(5000); newsock.Start(); Console.WriteLine("Dan cho client ket noi den "); TcpClient client = newsock.AcceptTcpClient(); NetworkStream ns = client.GetStream(); Khi đối tƣợng TcpClient đƣợc thành lập, đối tƣợng NetworkStream đƣợc gán vào để truyền thông với máy xa Tất thông tin liên lạc đƣợc thực cách sử dụng phƣơng thức Read() Write() IV.3 Lớp UdpClient Lớp UdpClient đƣợc tạo để giúp cho việc lập trình mạng với giao thức UDP đƣợc đơn giản Lớp UdpClient có bốn phƣơng thức tạo lập:  UdpClient(): tạo đối tƣợng UdpClient nhƣng không gắn vào địa hay port  UdpClient(int port): gắn đối tƣợng UdpClient tạo vào port/  UdpClient(IPEndPoint iep): gắn đối tƣợng UdpClient tạo vào địa Ip cục port  UdpClient(string host, int port): gắn đối tƣợng UdpClient tạo vào địa IP port kết hợp với địa IP port xa Các phƣơng thức tạo lập lớp UdpClient tƣơng tự nhƣ phƣơng thức tạo lập lớp TcpClient, hệ thống chọn port thích hợp cho ứng dụng ta port đƣợc dùng ứng dụng Nếu ứng dụng UDP phải chấp nhận liệu port đó, ta phải định nghĩa port phƣơng thức tạo lập lớp UdpClient Một số phƣơng thức lớp UdpClient: Phƣơng Thức Close() Mơ Tả Đóng Socket bên dƣới Connect() DropMulticastGroup() Equals() Cho phép IP endpoint xa để gởi nhận liệu Gỡ bỏ Socket từ nhóm UDP multicast So sánh hai đối tƣợng UdpClient Trang 85 Khoa Công Nghệ Thông Tin Giáo trình Lập Trình Mạng Phƣơng Thức GetHashCode() GetType() Mơ Tả Lấy hash code Lấy kiểu đối tƣợng JoinMulticastGroup() Receive() Thêm Socket vào nhóm UDP multicast Nhận liệu từ Socket Send() ToString() Gởi liệu đến thiết bị xa từ Socket Chuyển đối tƣợng UdpClient thành chuỗi Có nhiều chỗ khác phƣơng thức Send(), Receive() lớp UdpClient phƣơng thức SendTo(), ReceiveFrom() Socket Phƣơng thức Receive() Lớp UdpClient sử dụng phƣơng thức Receive() để chấp nhận gói tin card mạng port Chỉ có cách sử dụng phƣơng thức Receive(): byte[] Receive(ref IPEndPoint iep) Khi liệu đƣợc nhận từ Socket, khơng đặt vào mảng byte phƣơng thức nhƣ phƣơng thức ReceiveFrom() mà trả mảng byte Sự khác thứ hai phƣơng thức ReceiveFrom() đặt thông tin máy xa vào đối tƣợng EndPoint cịn phƣơng thức Receive() đặt thơng tin máy xa vào đối tƣợng IPEndPoint, việc làm cho lập trình viên cảm thấy dễ lập trình Khi nhiều liệu đƣợc nhận kích thƣớc đệm, thay phát sinh biệt lệ nhƣ phƣơng thức ReceiveFrom() Socket, UdpClient tả đệm liệu đủ lớn để chứa liệu nhận tính hay phƣơng thức Receive() Phƣơng thức Send() Phƣơng thức Send() có ba tải hàm để gởi liệu tới thiết bị xa:  Send(byte[] data, int sz): gởi mảng liệu với kích thƣớc sz đến thiết bị xa mặc định Để dùng tải hàm này, ta phải thiết bị xa mặc định cách sử dụng phƣơng thức tạo lập lớp UdpClient dùng phƣơng thức Connect()  Send(byte[] data, int sz, IPEndPoint iep): cho phép gởi mảng liệu có kích thƣớc sz đến thiết bị xa đƣợc iep Trang 86 Khoa Công Nghệ Thơng Tin Giáo trình Lập Trình Mạng  Send(byte[] data, int sz, string host, int port): gởi mảng liệu kích thƣớc sz đến máy xa port đƣợc Chƣơng trình UdpClient Server using System; using System.Net; using System.Net.Sockets; using System.Text; class UdpSrvrSample { public static void Main() { byte[] data = new byte[1024]; IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000); UdpClient newsock = new UdpClient(ipep); Console.WriteLine("Dang cho client ket noi den "); IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); data = newsock.Receive(ref sender); Console.WriteLine("Thong diep duoc nhan tu {0}:", sender.ToString()); Console.WriteLine(Encoding.ASCII.GetString(data, 0, data.Length)); string welcome = "Xin chao client"; data = Encoding.ASCII.GetBytes(welcome); newsock.Send(data, data.Length, sender); while (true) { data = newsock.Receive(ref sender); Console.WriteLine(Encoding.ASCII.GetString(data, 0, data.Length)); newsock.Send(data, data.Length, sender); } } } Chƣơng trình UdpClient Client using System; using System.Net; using System.Net.Sockets; using System.Text; class UdpClientSample { public static void Main() { byte[] data = new byte[1024]; Trang 87 Khoa Cơng Nghệ Thơng Tin Giáo trình Lập Trình Mạng string input, stringData; UdpClient server = new UdpClient("127.0.0.1", 5000); IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); string welcome = "Xin chao server"; data = Encoding.ASCII.GetBytes(welcome); server.Send(data, data.Length); data = server.Receive(ref sender); Console.WriteLine("Thong diep duoc nhan tu {0}:", sender.ToString()); stringData = Encoding.ASCII.GetString(data, 0, data.Length); Console.WriteLine(stringData); while (true) { input = Console.ReadLine(); if (input == "exit") break; server.Send(Encoding.ASCII.GetBytes(input), input.Length); data = server.Receive(ref sender); stringData = Encoding.ASCII.GetString(data, 0, data.Length); Console.WriteLine(stringData); } Console.WriteLine("Dang dong client"); server.Close(); } } Trang 88 ... việc lập trình hỗ-tr? ?-? ?a-tiểu -trình Tuy nhiên, cần lƣu ý định sử dụng thread-pool, cần xem xét điểm sau: - Không nên sử dụng thread-pool để thực thi tiến trình chạy thời gian dài Vì số tiểu trình. .. tiến trình T 12 Biến môi trường tiến trình T4 CPU T11 Stack tiểu trình Stack tiểu trình Tiểu trình Tiểu trình T5 T10 T6 T7 T8 T9 Các ứng dụng cài đặt theo mơ hình đa tiến trình hay đa tiểu trình. .. Khoa Công Nghệ Thông Tin Giáo trình Lập Trình Mạng CHƢƠNG V: ĐA NHIỆM TIỂU TRÌNH V.1 Khái niệm tiến trình tiểu trình Windows Tiến trình thể chƣơng trình họat động Một tiến trình ln sở hữu khơng

Ngày đăng: 26/11/2022, 16:16

Xem thêm: