Chương này giới thiệu về Socket trong Net. Nội dung chính trong chương này là khảo sát chức năng của các lớp Socket, UDP, TCP (TCPClient & TCPListener) và các lớp IPAddress, IPHostEntry, IPEndpoint trong lập trình mạng; khai báo và sử dụng các lớp UDP, TCP. Mời các bạn cùng tham khảo để nắm bắt các nội dung chi tiết.
26/02/2012 CHƯƠNG SOCKETS ThS Trần Bá Nhiệm Website: sites.google.com/site/tranbanhiem Email: tranbanhiem@gmail.com 26/02/2012 Nội dung • Giới thiệu • Khảo sát chức lớp Socket, UDP, TCP (TCPClient & TCPListener) lớp IPAddress, IPHostEntry, IPEndpoint lập trình mạng • Khai báo sử dụng lớp UDP, TCP 26/02/2012 Chương 3: Sockets 2 26/02/2012 Socket gì? • Lập trình mức socket tảng lập trình mạng • Socket đối tượng thể điểm truy cập mức thấp vào IP stack • Socket chế độ mở, đóng số trạng thái trung gian khác • Socket gửi, nhận liệu • Dữ liệu tổng quát gửi theo khối (thường gọi packet), khoảng vài KB/lần để tăng hiệu suất 26/02/2012 Chương 3: Sockets 3 26/02/2012 Khái niệm địa cổng (Address & Port) 26/02/2012 Chương 3: Sockets 4 26/02/2012 Địa cổng: ngun lý • Trong máy có nhiều ứng dụng muốn trao đổi với ứng dụng khác thơng qua mạng – Ví dụ: có ứng dụng máy A muốn trao đổi với với ứng dụng máy B • Mỗi máy tính có đường truyền liệu (để gửi nhận) 26/02/2012 Chương 3: Sockets 5 26/02/2012 Địa cổng: vấn đề • Có thể xảy "nhầm lẫn" liệu từ máy A gửi đến máy B máy B khơng biết liệu gửi cho ứng dụng nào? • Mỗi ứng dụng máy B gán số hiệu (cổng: Port), từ 65535 26/02/2012 Chương 3: Sockets 6 26/02/2012 Địa cổng: cách giải • Khi ứng dụng máy A muốn gửi cho ứng dụng máy B việc điền thêm số hiệu cổng (vào trường RemotePort) vào gói tin cần gửi • Trên máy B, ứng dụng việc kiểm tra giá trị cổng gói tin xem có trùng với số hiệu cổng (đã gán – giá trị LocalPort) hay khơng? Nếu xử lý, trái lại khơng làm (vì khơng phải mình) 26/02/2012 Chương 3: Sockets 7 26/02/2012 Ứng dụng cổng thường gặp Port Protocol 20 FTP data 21 FTP control 25 SMTP (email, outgoing) 53 DNS (Domain Name Service) 80 HTTP (Web) 110 POP3 (email, incoming) 143 IMAP (email, incoming) 26/02/2012 Chương 3: Sockets 8 26/02/2012 Một số quy định • Khơng có ứng dụng lại dùng port • Các port từ – 1023 (Well-know): dùng cho ứng dụng quan trọng hệ điều hành • Các port từ 1024 – 49151 (Registered): dành cho người lập trình (khuyến cáo tn theo) • Các port từ 49152 – 65535 (Dynamic): dự trữ 26/02/2012 Chương 3: Sockets 9 26/02/2012 Lớp IPAddress • Trên Internet trạm (có thể máy tính, máy in, thiết bị …) có định danh nhất, định danh thường gọi địa (Address) • Địa Internet tập hợp gồm số có giá trị từ 0-255 cách dấu chấm 26/02/2012 Chương 3: Sockets 10 10 26/02/2012 Lớp TCPListener • TCPListerner lớp cho phép người lập trình xây dựng ứng dụng Server (Ví dụ: SMTP Server, FTP Server, DNS Server, POP3 Server hay server tự định nghĩa ….) Ứng dụng server khác với ứng dụng Client chỗ luôn thực lắng nghe chấp nhận kết nối đến từ Client 26/02/2012 Chương 3: Sockets 82 82 26/02/2012 Lớp TCPClient: thành viên Tên phương thức Mô tả TcpListener (Port: Int32) Tạo TcpListener lắng nghe cổng định TcpListener (IPEndPoint) Tạo TcpListener với giá trị Endpoint truyền vào TcpListener (IPAddress, Port: Int32) Tạo TcpListener lắng nghe kết nối đến địa IP cổng định Active Trả giá trị cho biết TcpListener lắng nghe kết nối từ client Kiểu bool Server Trả socket 26/02/2012 Chương 3: Sockets 83 83 26/02/2012 Lớp TCPClient: thành viên Tên phương thức Mô tả AcceptSocket Chấp nhận yêu cầu kết nối chờ AcceptTcpClient Chấp nhận yêu cầu kết nối chờ (Ứng dụng dừng lệnh có kết nối đến) Pending Cho biết liệu có kết nối chờ đợi khơng? (True = có) Start Bắt đầu lắng nghe yêu cầu kết nối Stop Dừng việc nghe 26/02/2012 Chương 3: Sockets 84 84 26/02/2012 Lớp TCPClient: ví dụ xây dựng ứng dụng Server đơn giản Imports System.Net.Sockets Imports System.Net Imports System.IO Imports System.Threading Public Class frmServer Dim TCPServer As New System.Net.Sockets.TcpListener(21) Dim Thoat As Boolean = False Dim Clients(100) As TcpClient Dim CurrClient As Integer = Sub Xử_Lý_Kết_Nối() Dim LastClient As Integer = CurrClient - Dim Con As TcpClient = Clients(LastClient) Dim Doc As New StreamReader(Con.GetStream) Dim Ghi As New StreamWriter(Con.GetStream) Dim S As String 26/02/2012 Chương 3: Sockets 85 85 26/02/2012 Lớp TCPClient: ví dụ xây dựng ứng dụng Server đơn giản While Thoat = False Application.DoEvents() If Doc.EndOfStream = False Then S = Doc.ReadLine '// Xử lý đây: S = S.ToUpper Ghi.WriteLine(S) '//Gửi lại Client Ghi.Flush() End If End While End Sub 26/02/2012 Chương 3: Sockets 86 86 26/02/2012 Lớp TCPClient: ví dụ xây dựng ứng dụng Server đơn giản Sub Nghe_Kết_Nối() Do While Thoat = False Clients(CurrClient) = TCPServer.AcceptTcpClient() CurrClient += 'MsgBox ("Đã có " & (CurrClient + 1) & " kết nối !") Dim Th As New Thread(AddressOf Xử_Lý_Kết_Nối) Th.Start() Loop End Sub 26/02/2012 Chương 3: Sockets 87 87 26/02/2012 Lớp TCPClient: ví dụ xây dựng ứng dụng Server đơn giản Private Sub frmClose(ByVal s As Object, ByVal e As FormClosingEventArgs) Handles Me.FormClosing Thoat = True End Sub Private Sub Form1_Load(ByVal s As Object, ByVal e As EventArgs) Handles Me.Load TCPServer.Start() Nghe_Kết_Nối() End Sub End Class 26/02/2012 Chương 3: Sockets 88 88 26/02/2012 Dùng TCP/IP để truyền file • Để đọc file, tạo stream tương ứng • Đọc nội dung file vào buffer array • Gửi buffer array đường truyền Stream fileStream = File.OpenRead(tbFilename.Text); // Alocate memory space for the file byte[] fileBuffer = new byte[fileStream.Length]; fileStream.Read(fileBuffer, 0, (int)fileStream.Length); // Open a TCP/IP Connection and send the data TcpClient clientSocket = new TcpClient(tbServer.Text,8080); NetworkStream networkStream = clientSocket.GetStream(); networkStream.Write(fileBuffer,0,fileBuffer.GetLength(0)); networkStream.Close(); 26/02/2012 Chương 3: Sockets 89 89 26/02/2012 Debugging network code • Debugging phương pháp quan trọng để theo dõi giải lỗi phát sinh viết chương trình • Nên dùng cấu trúc try/catch try { serverSocket.Bind(ipepServer); serverSocket.Listen(-1); } catch(SocketException e) { MessageBox.Show(e.Message); } 26/02/2012 Chương 3: Sockets 90 90 26/02/2012 Debugging network code • Để xác định trục trặc ứng dụng multithreaded, chế theo vết (tracing) đóng vai trị quan trọng • Nên dùng System.Diagnostics.Trace • Hoặc phát biểu dạng Console.WriteLine 26/02/2012 Chương 3: Sockets 91 91 26/02/2012 Bài tập Viết chương trình UDP đặt hai máy thực công việc sau: Khi ứng dụng gửi chuỗi "OPEN#" ứng dụng máy mở file nằm phần Khi ứng dụng gửi chuỗi "SHUTDOWN" ứng dụng tắt máy tính 26/02/2012 Chương 3: Sockets 92 92 26/02/2012 Bài tập Viết chương trình UDP (ứng dụng A) đặt máy thực công việc sau: Khi ứng dụng (B) gửi chuỗi chữ tiếng Anh ứng dụng A gửi trả lại nghĩa tiếng Việt tương ứng Nếu từ tiếng Anh khơng có từ điển (từ điển có từ Computer, RAM, HDD) ứng dụng A gửi trả lại chuỗi "Not found" 26/02/2012 Chương 3: Sockets 93 93 26/02/2012 Bài tập Viết chương trình SMTP server Viết chương trình client/server đó, client di chuyển chuột server di chuyển chuột theo (dựng hàm API SetCursorPos…) Viết chương trình Client/Server: Khi client gửi chuỗi "shutdown", "restart" Server tắt máy khởi động tương ứng (dựng hàm API ExitWindow…) 26/02/2012 Chương 3: Sockets 94 94 26/02/2012 Bài tập Viết chương trình kiểm tra xem máy 192.168.1.1 có dịch vụ FTP chạy hay khơng? Viết chương trình kiểm tra xem máy "Servercntt" có dịch vụ FTP chạy hay khơng? Viết chương trình Telnet linh hoạt (có thể thay đổi tên máy, cổng…) Viết chương trình Server giải đáp tên miền Nếu máy khách gửi tên máy server gửi địa IP (danh sách tự tạo – khoảng cặp để minh họa) 26/02/2012 Chương 3: Sockets 95 95 26/02/2012 Bài tập 10.Viết chương trình Client/Server Khi Client gửi đường dẫn tập tin nằm máy server server gửi trả cho Client nội dung tập tin 11.Cài đặt chương trình minh họa giảng chương ngôn ngữ C# VB.NET 26/02/2012 Chương 3: Sockets 96 96 ... } 26/02/2012 Chương 3: Sockets 45 45 26/02/2012 Lớp UDPClient: chương trình chat 26/02/2012 Chương 3: Sockets 46 46 26/02/2012 Lớp UDPClient: chương trình chat 26/02/2012 Chương 3: Sockets 47... (Broadcast) cho đồng thời nhiều máy 26/02/2012 Chương 3: Sockets 34 34 26/02/2012 Lớp UDPClient: trình tự kết nối 26/02/2012 Chương 3: Sockets 35 35 26/02/2012 Lớp UDPClient: thành viên Tên phương... IPAddress, IPHostEntry, IPEndpoint lập trình mạng • Khai báo sử dụng lớp UDP, TCP 26/02/2012 Chương 3: Sockets 2 26/02/2012 Socket gì? • Lập trình mức socket tảng lập trình mạng • Socket đối tượng