Tải bản đầy đủ (.doc) (42 trang)

đồ án “lập trình mạng nâng cao”

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 (407.52 KB, 42 trang )

Đồ án môn học Lập trình mạng nâng cao
MỤC LỤC
1.1. Các lớp đối tượng trong .NET Framework 6
1.2. Ngoại lệ và xử lý ngoại lệ 15
GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 1
Đồ án môn học Lập trình mạng nâng cao
LỜI CẢM ƠN
Trước tiên nhóm em xin chân thành cảm ơn sâu sắc đến các thầy cô trong trường
Cao đẳng Công nghệ thông tin Hữu nghị Việt – Hàn, đặt biệt các thầy cô trong khoa
Khoa học máy tính, bộ môn Mạng máy tính đã truyền đạt kiến thức cho chúng em
trong thời gian qua
Nhóm em xin chân thành cảm ơn thầy Nguyễn Vũ đã tận tình giúp đỡ, chỉ bảo
hướng dẫn trực tiếp nhóm em để nhóm hoàn thành tốt đồ án “Lập trình mạng nâng
cao”, trong thời gian làm được thầy hướng dẫn, nhóm đã tiếp thu thêm nhiều kiến thức
bổ ích trong quá trình học tập cũng như trong quá trình làm việc sau này.
Nhóm xin gởi lời cảm ơn đến tất cả các bạn bè đã động viên, đóng góp ý kiến
giúp đỡ trong quá trình học tập, nghiên cứu hoàn thành đồ án môn học.
Và cuối cùng ,kính chúc thầy cô sức khỏe, tiếp tục đạt được nhiều thành tích
trong giảng dạy, cũng như trong nghiên cứu khoa học và trong sự nghiệp giáo dục
Xin chân thành cảm ơn !
Sinh viên thực hiện
Nhóm 6
GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 2
Đồ án môn học Lập trình mạng nâng cao
LỜI NÓI ĐẦU
Ngày nay cuộc cách mạng công nghệ luận văn - báo cáo - tiểu luận - tài liệu
chuyên ngành Công Nghệ thông tin và viễn thông luận văn - báo cáo - tiểu luận
chuyên ngành Viễn Thông đã phát triển vô cùng mạnh mẽ, những thành tựu của nó đã
có những ứng dụng to lớn, và trở thành một phần quan trọng trong cuộc sống của


chúng ta. Mạng viễn thông mà tiêu biểu là Internet đã kết nối mọi người trên toàn thế
giới, cung cấp đa dịch vụ từ Chat, e – mail, VoIP, hội nghị truyền hình, các thông tin
khoa học kinh tế, giáo dục… Truy cập Internet trở thành nhu cầu quen thuộc đối với
mọi người.
Vấn đề trao đổi file là không thể thiếu đối với người dùng đầu cuối . Giao thức
FTP là một giao thức trao đổi file khá phổ biến - tuy nhiên những hoạt động xảy ra
trong giao thức thì không phải ai cũng biết được hết cách thức làm việc của giao thức
này.
Xuất phát từ yêu cầu trên nhóm của em đi vào tìm hiểu và lập trình socket ftp
truyền file đơn giản .Nhằm bước đầu hiểu về cách thức lập trình một đối tượng.
Nội dung gồm 3 phần :
Chương I: Tổng quan về lập trình socket
Chương II: File transfer protocol
Chương III : Giới thiệu chương trình
Chương IV: Tổng kết
Đồ án được thực hiện trong khoảng thời gian tương đối ngắn nên không tránh
khỏi còn nhiều thiếu sót. Nhóm tác giả rất mong nhận được các ý kiến đóng góp của
thầy cô và những người quan tâm
GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 3
Đồ án môn học Lập trình mạng nâng cao
DANH MỤC TỪ VIẾT TẮC
FTP File Transfer Protocol
TCP/IP
Transmission Control Protocol / Internet
Protocol
SSL Secure Sockets Layer
TLS Transport Layer Security
SFTP Secure Shell File Transfer Protocol
CLS Common Language Specification

GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 4
Đồ án môn học Lập trình mạng nâng cao
DANH MỤC CÁC HÌNH VẼ
1.1. Các lớp đối tượng trong .NET Framework 6
1.2. Ngoại lệ và xử lý ngoại lệ 15
GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 5
Đồ án môn học Lập trình mạng nâng cao
CHƯƠNG I : TỔNG QUAN VỀ LẬP TRÌNH SOCKET
1.1. Các lớp đối tượng trong .NET Framework
NET Framework chứa số lượng nhiều những kiểu dữ lớp, những kiểu liệt kê,
những cấu trúc, những giao diện và nhiều kiểu dữ liệu khác nữa. Thật vậy, có hàng
ngàn số lượng các kiểu như trên. Những lớp này điều cho phép chúng ta sử dụng trong
chương trình C#.
Chúng ta sẽ tìm hiểu một vài kiểu dữ liệu thường sử dụng trong chương này. Các
lớp được trình bày thông qua các ví dụ minh họa đơn giản. Từ những ví dụ minh họa
cách sử dụng các lớp cơ sở này chúng ta có thể mở rộng để tạo ra các chương trình
phức tạp hơn.
1.1.1 Common Language Specification (CLS)
Những lớp bên trong Framework được viết với ngôn ngữ được xác nhận là chung
nhất
CLS là một tập hợp các luật hay các quy tắc mà tất cả các ngôn ngữ thực hiện bên
trong .NET platform phải tuân thủ theo.
Lợi ích theo sau của CLS là mã nguồn được viết trong một ngôn ngữ có thể được
gọi sử dụng bởi một ngôn ngữ khác Bởi vì thông thường bên trong Framework với
CLS, chúng có thể sử dụng không chỉ ngôn ngữ C# mà còn bất cứ ngôn ngữ tương
thích với CLS như là Visual Basic.NET và JScript.NET.
1.1.2 Kiểu dữ liệu trong NameSpace
Mã nguồn bên trong Framework được tổ chức bên trong namespace. Có hàng

trăm namespace bên trong Framework được sử dụng để tổ chức hàng ngàn lớp đối
tượng và các kiểu dữ liệu khác.
Một vài namespace thì được lưu trữ bên trong namespace khác. Ví dụ chúng ta đã
sử dụng kiểu dữ liệu DateTime được chứa trong namespace System. Kiểu Random
cũng được chứa trong namespace System. Nhiều kiểu dữ liệu phục vụ cho thao tác
nhập xuất cũng được lưu trữ trong một namespace chức trong namespace System là
namespace System.IO. Nhiều kiểu dữ liệu thường dùng để làm việc với dữ liệu XML
thì được đặt bên trong namespace System.XML. Chúng ta có thể tìm hiểu các
GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 6
Đồ án môn học Lập trình mạng nâng cao
namespace này trong các tài liệu trực tuyến của Microsoft như MSDN Online chẳng
hạn.
1.1.3 Lớp Timer
Để bắt đầu lớp timer chúng ta xét một ví dụ:
namespace Programming_CSharp
{
using System;
public class Tester
{
public static void Main()
{
while (true)
{
Console.WriteLine(“\n {0}”, DateTime.Now);
}
}
Kết quả: 22/2/2011 3:21:20 PM
Như chúng ta có thể thấy, kết quả chương trình được thực thi vào lúc 3:21 vào
ngày 22 tháng 2. Danh sách này thể hiện một đồng hồ xuất hiện ở dòng lệnh, và chúng

dường như là được cập nhật trong mỗi giây đồng hồ. Thật vậy, nó thông thường được
cập nhật nhiều hơn một lần, do đó chúng ta lưu ý là giây đồng hồ thay đổi chỉ khi giá
trị xuất hiện thật sự khác nhau.
Chương trình sẽ chạy mãi đến khi nào ta nhấn thoát bằng Ctrl + C.
Trong chương trình ta sử dụng kiểu dữ liệu DateTime, đây là một cấu trúc được
chứa trong namespace System bên trong thư viện cơ sở. Cấu trúc này có một thuộc
tính tĩnh là Now trả về thời gian hiện hành. Có nhiều dữ liệu thành viên và những
GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 7
Đồ án môn học Lập trình mạng nâng cao
phương thức được thêm vào trong cấu trúc DateTime. Chúng ta có thể tìm hiểu thêm
về DateTime trong thư viện trực tuyến về các lớp cơ sở của .NET Framework.
1.1.4 Lớp Math
Chúng ta chỉ thực hiện các phép toán cơ bản như cộng, trừ, nhân, chia, chia
dư. Còn rất nhiều các phép toán mạnh hơn và cũng thường sử dụng mà chúng chưa
được đề cập tới. C# cung cấp một tập hợp các phép toán toán học bên trong những lớp
cơ sở. Chúng được chứa bên trong của namespace System.Math. Bảng sau liệt kê
những hàm toán học.
Lớp Math là lớp sealed, do đó chúng ta không thể xây dựng một lớp mới mà kế
thừa từ lớp này được. Thêm vào đó tất cả những lớp và dữ liệu thành viên đều là tĩnh,
do vậy chúng ta không thể tạo một đối tượng có kiểu Math. Thay vào đó chúng ta sẽ
sử dụng những thành viên và phương thức với tên lớp.
Lớp Math
Phương thức Mô tả
Abs Trả về giá trị tuyệt đối của một số
Ceiling Trả về giá trị nhỏ nhất hay bằng giá trị đưa ra
Exp Trả về giá trị e với mũ đưa ra
Floor Trả về giá trị lớn nhất hay bằng giá trị đưa ra
IEEERemainde
r

Trả về phần dư của hai phép chia hai số thực, phép chia này
dựa trên tiêu chuẩn IEEE cho phép toán dấu chấm động nhị
phân
Log Trả về logarit của giá trị đưa ra
Log10 Trả về logarit cơ số 10 của giá trị đưa ra
Max Trả về số lớn nhất trong hai số
Min Trả về số nhỏ nhất trong hai số
Pow Trả về kết quả X
y
Round Trả về giá trị được làm tròn
GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 8
Đồ án môn học Lập trình mạng nâng cao
Sign Trả về giá trị dấu của số. -1 nếu số âm, và 1 nếu số dương
Sqrt Trả về căn bật hai của một số
Acos Trả về giá trị một góc mà cosin bằng với giá trị đưa ra
Asin Trả về giá trị một gocs mà sin bằng với giá trị đưa ra
Atan Trả về giá trị một góc mà tang bằng với giá trị đưa ra
Atan2
Trả về giá trị của một góc mà tang của nó bằng tang(x,y)
đưa ra
Cos Trả về giá trị cosin của một góc đưa ra
Sin Trả về giá trị sin của một góc đưa ra
Cosh Trả về giá trị hyperbolic cosin của một góc đưa ra
Sinh Trả về giá trị hyperbolic của một góc đưa ra
Tan Trả về giá trị tang của một góc
Tanh Trả về giá trị hyperbolic của một góc đưa ra
Ngoài ra lớp Math cũng đưa ra 2 hằng số: PI và số E, PI trả về giá trị toán học
như 3.1415…. Giá trị E trả về 2.718, hầu hếu các hàm trong toán học đều dễ hiểu và
sử dụng

1.1.5 Lớp thao tác tập tin
Khả năng để viết thông tin vào trong một tập tin hay đọc thông tin từ trong một
tập tin có thể làm cho chương trình của chúng ta có nhiều hiệu quả hơn. Hơn nữa, có
rất nhiều lần khi chúng ta muốn có khả năng làm việc với những tập tin hiện hữu. Phần
tiếp sau chúng ta sẽ tìm hiểu những đặc tính cơ bản của việc thao tác trên tập tin. Điều
này sẽ được theo sau bởi một khái niệm quan trọng của tập tin là luồng (stream).
** Sao chép một tập tin
Một lớp tập tin tồn tại bên trong lớp cơ sở gọi là File, lớp này được định vị bên
trong namespace System.OI. Lớp File chứa một số các phương thức tĩnh được sử dụng
để thao tác trên tập tin. Thật vậy, tất cả các phương thức bên trong lớp File điều là
tĩnh.
Bảng sau liệt kê những phương thức chính của lớp File.
GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 9
Đồ án môn học Lập trình mạng nâng cao
Lớp FILE
Phương thức Mô tả
AppendText Nối văn bản vào một tập tin
Copy Tạo ra một tập tin mới từ một tập tin hiện hữu
Create Tạo ra một tập tin mới từ một vị trí xác định
CreateText Tạo ra một tập tin lưu trữ text
Delete Xóa một tập tin ở một vị trí xác định, tập tin phải hiện
hữu nếu không sẽ phát sinh ngoại lệ
Exists Kiểm tra thông tin ở một vị trí hiện hữu nào đó
GetAttributes Lấy thông tin thuộc tính của tập tin. Thông tin này bao
gồm: tập tin có bị nén hay không, tên thư mục, có thuộc
tính ẩn, thuộc tính chỉ đọc, tập tin hệ thống
GetCreationTime Trả về ngày giờ tập tin được tạo ra
GetLastAccessTime Trả về ngày giờ tập tin được truy cập lần cuối
GetLastWriteTime Trả về ngày giờ tập tin được viết lần cuốiMove

Move Cho phép tập tin được di chuyển vào vị trí mới và đổi
tên tập tin.
Open Mở một tập tin tại vị trí đưa ra. Bằng việc mở tập tin ày
chúng ta có thể viết thông tin hay đọc thông tin từ nó.
OpenRead Mở một tập tin hiện hữu để đọc
OpenText Mở một tập tin để đọc dạng text
OpenWrite Mở một tập tin xác định để viết
SetAttributes Thiết lập thuộc tính cho tập tin
SetCreationTime Thiết lập ngày giờ tạo tập tin
SetLastAccessTime Thiết lập lại ngày giờ mà tập tin được truy cập lần cuối
SetLastWriteTime Thiết lập ngày giờ mà tập tin được cập nhật lần cuối.
GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 10
Đồ án môn học Lập trình mạng nâng cao
1.1.6 Làm việc với tập tin CSDL
Phần trước chúng ta đã thực hiện công việc như lấy thông tin của tập tin và sao
chép tập tin sang một tập tin mới. Việc thực hiện quan trọng của tập tin là đọc và viết
những thông tin từ tập tin. Trong phần này chúng ta sẽ tìm hiểu về luồng nhập xuất và
cách tạo mới một tập tin để ghi hay mở một tập tin đã tồn tại để đọc thông tin.
Luồng nhập xuất: Thuật ngữ tập tin thì nói chung là liên quan đến những thông
tin lưu trữ bên trong ỗ đĩa hoặc trong bộ nhớ. Khi làm việc với tập tin, chúng ta bao
hàm với việc sử dụng một luồng.
Nhiều người nhầm lẫn về sự khác nhau giữa tập tin và luồng. Một luồng đơn giản
là luồng của thông tin, chứa thông tin sẽ được chuyển qua, còn tập tin thì để lưu trữ
thông tin.
Một luồng được sử dụng để gởi và nhận thông tin từ bộ nhớ, từ mạng, web, từ
một chuỗi, Một luồng còn được sử dụng để đi vào và ra với một tập tin dữ liệu.
Thứ tự của việc đọc một tập tin: Khi đọc hay viết một tập tin, cần thiết phải
theo một trình tự xác định. Đầu tiên là phải thực hiện công việc mở tập tin. Nếu như
tạo mới tập tin, thì việc mở tập tin cùng lúc với việc tạo ra tập tin đó. Khi một tập tin

đã mở, cần thiết phải tạo cho nó một luồng để đặt thông tin vào trong một tập tin hay
là lấy thông tin ra từ tập tin. Khi tạo một luồng, cần thiết phải chỉ ra thông tin trực tiếp
sẽ được đi qua luồng. Sau khi tạo một luồng gắn với một tập tin, thì lúc này chúng ta
có thể thực hiện việc đọc ghi các dữ liệu trên tập tin. Khi thực hiện việc đọc thông tin
từ một tập tin, chúng ta cần thiết phải kiểm tra xem con trỏ tập tin đã chỉ tới cuối tập
tin chưa, tức là chúng ta đã đọc đến cuối tập tin hay chưa. Khi hoàn thành việc đọc ghi
thông tin trên tập tin thì tập tin cần phải được đóng lại.
Tóm lại các bước cơ bản để làm việc với một tạo tin là:
Bước 1: Mở hay tạo mới tập tin
Bước 2: Thiết lập một luồng ghi hay đọc từ tập tin
Bước 3: Đọc hay ghi dữ liệu lên tập tin
Bước 4: Đóng lập tin lại
1.1.7 Các phương thức cho việc tạo và mở tập tin
GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 11
Đồ án môn học Lập trình mạng nâng cao
Có nhiều kiểu luồng khác nhau. Chúng ta sẽ sử dụng những luồng khác nhau và
những phương thức khác nhau phụ thuộc vào kiểu dữ liệu bên trong của tập tin. Trong
phần này, việc đọc/ghi sẽ được thực hiện trên tập tin văn bản. Trong phần kế tiếp
chúng ta học cách đọc và viết thông tin trên tập tin nhị phân. Thông tin nhị phân bao
hàm khả năng mạnh lưu trữ giá trị số và bất cứ kiểu dữ liệu nào khác.
Để mở một tập tin trên đĩa cho việc đọc và viết tập tin văn bản, chúng ta cần phải
sử dụng cả hai lớp File và FileInfo. Một vài phương thức có thể sử dụng trong những
lớp này. Các phương thức này bao gồm:
AppendText
Mở một tập tin để và tập tin này có thể được thêm văn bản vào trong
nó. Tạo luồng StreamWriter sử dụng để thêm vào trong văn bản.
Create Tạo mới một tập tin
CreateText Tạo và mở một tập tin văn bản. Tạo ra một luồng StreamWriter.
Open Mở một tập tin để đọc/viết. Mở một FileStream

OpenRead Mở một tập tin để đọc
OpenText Mở một tập tin văn bản để đọc. Tạo ra StreamReader để sử dụng.
OpenWrite Mở một tập tin cho việc đọc và ghi.
Làm thế nào để chúng ta có thể biết được khi nào sử dụng lớp File chính xác hơn
là sử dụng lớp FileInfo nếu chúng cùng chứa những phương thức tương tự với nhau.
Thật ra hai lớp này có nhiều sự khác biệt. Lớp File chứa tất cả các phương thức
tĩnh, thêm vào đó lớp File tự động kiểm tra permission trên một tập tin. Trong khi đó
nếu muốn dùng lớp FileInfo thì phải tạo thể hiện của lớp này. Nếu muốn mở một tập
tin chỉ một lần thì tốt nhất là sử dụng lớp File, còn nếu chúng ta tổ chức việc sử dụng
tập tin nhiều lần bên trong chương trình, tốt nhất là ta dùng lớp FileInfo. Hoặc nếu
không chắc chắn cách sử dụng thì chúng ta có thể sử dụng lớp FileInfo.
1.1.8 Viết thông tin nhị phân vào tập tin
Nếu chúng ta sử dụng một tập tin văn bản, thì khi chúng ta lưu dữ liệu kiểu số thì
phải thực hiện việc chuyển đổi sang dạng chuỗi ký tự để lưu vào trong tập tin văn bản
và khi lấy ra ta cũng lấy được giá trị chuỗi ký tự do đó ta phải chuyển sang dạng số.
GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 12
Đồ án môn học Lập trình mạng nâng cao
Đôi khi chúng ta muốn có cách thức nào đó tốt hơn để lưu trực tiếp giá trị vào
trong tập tin và sau đó đọc trực tiếp giá trị ra từ tập tin. Ví dụ khi viết một số lượng lớn
các số integer vào trong tập tin như là những số nguyên, thì khi đó ta có thể đọc các
giá trị này ra như là số integer. Trường hợp nếu chúng được viết vào tập tin với dạng
văn bản, thì khi đọc ra ta phải đọc ra văn bản và phải chuyển mỗi giá trị từ một chuỗi
đến các số integer. Tốt hơn việc phải thực hiện thêm các bước chuyển đổi, ta có thể
gắn một kiểu luồng nhị phân BinaryStream vào trong một tập tin, rồi sau đó đọc và ghi
thông tin nhị phân từ luồng này.
Tiếp theo ta sẽ xem một ví dụ minh họa việc đọc viết dữ liệu nhị phân vào một
tập tin. Mặc dù trong chương trình này thực hiện việc viết 100 giá trị integer vào trong
một tập tin nhưng có thể dễ dàng viết bất cứ kiểu dữ liệu nào khác.
Bảng sau liệt kê những mode giá trị khác trong kiểu liệt kê FileMode.

Giá trị Định nghĩa
Append Mở một tập tin hiện hữu hoặc tạo một tập tin mới
Create
Tạo một tập tin mới. Nếu một tập tin đã hiện hữu, nó sẽ bị
xóa và một tập tin mới sẽ được tạo ra với cùng tên.
CreateNew
Tạo một tập tin mới. Nếu một tập tin đã tồn tại thì một
ngoại lệ sẽ được phát sinh.
Open Mở tập tin hiện hữu.
OpenOrCreate Mở tập tin hay tạo tập tin mới nếu tập tin chưa tồn tại
Truncate Mở một tập tin hiện hữu và xóa nội dung của nó.
1.1.9 Đọc thông tin nhị phân từ tập tin
Trong phần trước chúng ta đã thực hiện việc viết thông tin nhị phân vào trong tập
tin, và bây giờ chúng ta mong muốn được đọc các thông tin đã ghi vào trong tập tin.
Việc đọc thong tin cũng khá đơn giản như là việc viết vào
Bảng sau liệt kê một số phương thức dùng để đọc các kiểu dữ liệu.
Phương thức
GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 13
Đồ án môn học Lập trình mạng nâng cao
Read
Đọc những ký tự và chuyển vị trí đọc sang vị trí tiếp theo.
Phương thức này được nạp chồng gồm 3 phương thức.
ReadBoolean
Đọc một giá trị boolean từ luồng hiện thời và chuyển vị trí đọc
sang một byte.
ReadByte Đọc byte kế tiếp từ luồng hiện thời và chuyển vị trí đọc sang 1
ReadBytes
Đọc n byte từ luồng hiện thời sang một mảng byte và chuyển vị
trí đọc sang n byte.

ReadChar
Đọc vị trí kế tiếp trong luồng hiện hành và chuyển vị trí đọc của
luồng theo sau sử dụng mã hóa và ký tự xác định được đọc từ
luồng
ReadChars
Đọc n ký tự từ luồng hiện hành vào một mảng n ký tự. Và
chuyển vị trí đọc của luồng theo sau sử dụng mã hóa và ký tự
xác định được đọc từ luồng.
ReadDecimal Đọc giá trị decimal và chuyển vị trí đọc sang 16 byte.
ReadDouble Đọc giá trị thực 8 byte và chuyển vị trí đọc sang 8 byte.
ReadInt16
Đọc giá trị 2 byte integer có dấu và chuyển vị trí đọc sang 2
byte
ReadInt32
Đọc giá trị 4 byte integer có dấu và chuyển vị trí đọc sang 4
byte
ReadInt64
Đọc giá trị 8 byte integer có dấu và chuyển vị trí đọc sang 8
byte
ReadSByte Đọc một signed byte từ luồng và chuyển vị trí đọc sang 1 byte.
ReadSingle
Đọc giá trị thực 4 byte từ luồng và chuyển vị trí đọc sang 4
byte.
ReadString
Đọc một chuỗi từ luồng. Chuỗi được cố định chiều dài trước.
Và được mã hóa mỗi lần như là số nguyên 7 bit.
ReadUInt16 Đọc giá trị 2-byte unsigned integer từ luồng. Sử dụng mã hóa
thứ tự nhỏ ở cuối (little endian encoding). Và chuyển vị trí hiện
GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 14

Đồ án môn học Lập trình mạng nâng cao
hành sang 2 byte.
ReadUInt64
Đọc 8-byte unsigned integer từ luống hiện hành và chuyển sang
8 byte.
1.2. Ngoại lệ và xử lý ngoại lệ
Trong ngôn ngữ C#, chúng ta chỉ có thể phát sinh (throw) những đối tượng các
kiểu dữ liệu là System.Exception, hay những đối tượng được dẫn xuất từ kiểu dữ liệu
này. Namespace System của CLR chứa một số các kiểu dữ liệu xử lý ngoại lệ mà
chúng ta có thể sử dụng trong chương trình. Những kiểu dữ liệu ngoại lệ này bao gồm
ArgumentNull- Exception, InValidCastException, và OverflowException, cũng như
nhiều lớp khác nữa.
Câu lênh throw
Để phát tín hiệu một sự không bình thường trong một lớp của ngôn ngữ C#,
chúng ta phát sinh một ngoại lệ. Để làm được điều này, chúng ta sử dụng từ khóa
throw. Dòng lệnh sau tạo ra một thể hiện mới của System.Exception và sau đó throw
nó: throw new System.Exception();
Khi phát sinh ngoại lệ thì ngay tức khắc sẽ làm ngừng việc thực thi trong khi
CLR sẽ tìm kiếm một trình xử lý ngoại lệ. Nếu một trình xử lý ngoại lệ không được
tìm thấy trong phương thức hiện thời, thì CLR tiếp tục tìm trong phương thức gọi cho
đến khi nào tìm thấy.
Nếu CLR trả về lớp Main() mà không tìm thấy bất cứ trình xử lý ngoại lệ nào, thì
nó sẽ kết thúc chương trình.
Ví dụ:
namespace Programming_CSharp
{
using System;
public class Test
{
public static void Main()

GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 15
Đồ án môn học Lập trình mạng nâng cao
{
Console.WriteLine(“Enter Main ”);
Test t = new Test();
t.Func1();
Console.WriteLine(“Exit Main ”);
}
public void Func1()
{
Console.WriteLine(“Enter Func1 ”);
Func2();
Console.WriteLine(“Exit Func1 ”);
}
public void Func2()
{
Console.WriteLine(“Enter Func2 ”);
throw new System.Exception();
Console.WriteLine(“Exit Func2 ”);
}
}
}
}
Kết Quả
Enter Main
Enter Func1
Enter Func2
GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 16

Đồ án môn học Lập trình mạng nâng cao
Exception occurred: System.Exception: An exception of type System.Exception
was throw.
at Programming_CSharp.Test.Func2() in exception01.cs:line 26
at Programming_CSharp.Test.Func1() in exception01.cs:line 20
at Programming_CSharp.Test.Main() in exception01.cs:line 12
Ví dụ minh họa đơn giản này viết ra màn hình console thông tin khi nó nhập vào
trong một hàm và chuẩn bị đi ra từ một hàm. Hàm Main() tạo thể hiện mới của kiểu
Test và sau đó gọi hàm Func1(). Sau khi in thông điệp “Enter Func1”, hàm Func1()
này gọi hàm Func2(). Hàm Func2() in ra thông điệp đầu tiên và phát sinh một ngoại lệ
kiểu System.Exception. Việc thực thi sẽ ngưng ngay tức khắc, và CLR sẽ tìm kiếm
trình xử lý ngoại lệ trong hàm Func2(). Do không tìm thấy ở đây, CLR tiếp tục vào
stack lấy hàm đã gọi trước tức là Func1 và tìm kiếm trình xử lý ngoại lệ. Một lần nữa
trong Func1 cũng không có đoạn xử lý ngoại lệ. Và CLR trả về hàm Main. Tại hàm
Main cũng không có, nên CLR sẽ gọi trình mặc định xử lý ngoại lệ, việc này đơn giản
là xuất ra một thông điệp lỗi.
1.2.1 Lệnh Try/Catch
Trong C#, một trình xử lý ngoại lệ hay một đoạn chương trình xử lý các ngoại lệ
được gọi là một khối catch và được tạo ra với từ khóa catch.
Trong ví dụ sau, câu lệnh throw được thực thi bên trong khối try, và một khối
catch ược sử dụng để công bố rằng một lỗi đã được xử lý.
Ví dụ
Namespace Programming_CSharp
{
using System;
public class Test
{
public static void Main()
GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 17

Đồ án môn học Lập trình mạng nâng cao
{
Console.WriteLine(“Enter Main ”);
Test t = new Test();
t.Func1();
Console.WriteLine(“Exit Main ”);
}
public void Func1()
{
Console.WriteLine(“Enter Func1 ”);
Func2();
Console.WriteLine(“Exit Func1 ”);
}
public void Func2()
{
Console.WriteLine(“Enter Func2 ”);
try
{
Console.WriteLine(“Entering try block ”);
throw new System.Exception();
Console.WriteLine(“Exiting try block ”);
}
catch
{
Console.WriteLine(“Exception caught and handled.”);
}
GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 18
Đồ án môn học Lập trình mạng nâng cao
Console.WriteLine(“Exit Func2 ”);

}
}
}
KẾT QUẢ
Enter Main
Enter Func1
Enter Func2
Entering try block
Exception caught and handled.
Exit Func2
Exit Func1
Exit Main
Ví dụ này cũng tương tự ví dụ trước, ngoại trừ chương trình them vào trong một
khối try/catch. Thông thường chúng ta cũng co thể đặt khối try bao quanh những đoạn
chương trình tiềm ẩn gây ra sự nguy hiểm, như là việc truy cập file, cấp phát bộ nhớ
Theo sau khối try là câu lệnh catch tổng quát. Câu lệnh catch trong ví dụ này là
tổng quát bởi vì chúng ta không xác định loại ngoại lệ nào mà chúng ta bắt giữ. Trong
trường hợp tổng quát này thì khối catch này sẽ bắt giữ bất cứ ngoại lệ nào được phát
sinh. Sử dụng câu lệnh catch để bắt giữ ngoại lệ xác định sẽ được thảo luận trong phần
sau của chương. Trong ví dụ này, khối catch đơn giản là thông báo ra một ngoại lệ
được bắt giữ và được xử lý. Trong ví dụ của thế giới thực, chúng ta có thể đưa hành
động đúng để sửa chữa vấn đề mà gây ra sự ngoại lệ. Ví dụ, nếu người sử dụng đang
cố mở một tập tin có thuộc tính chỉ đọc, chúng ta có thể gọi một phương thức cho phép
người dùng thay đổi thuộc tính của tập tin.
Nếu chương trình thực hiện thiếu bộ nhớ, chúng ta có thể phát sinh cho người
dùng cơ hội để đóng bớt các ứng dụng khác lại. Thậm chí trong trường hợp xấu nhất ta
GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 19
Đồ án môn học Lập trình mạng nâng cao
không khắc phục được thì khối catch này có thể in ra thông điệp lỗi để người dùng

biết.
Thử kiểm tra kỹ lại chương trình ví dụ trên, chúng ta sẽ thấy xuất hiện đoạn mã
đi vào từng hàm như Main(), Func1(), Func2(), và cả khối try. Chúng ta không bao giờ
thấy nó thoát khối lệnh try (tức là in ra thông báo “Exiting try block ”, hay thực hiện
lệnh này), mặc dù nó vẫn thoát ra theo thứ tự Func2(), Func1(), và Main(). Chuyện gì
xảy ra? Khi một ngoại lệ được phát sinh, việc thi hành ngay lập tức sẽ bị tạm dừng và
việc thi hành sẽ được chuyển qua khối lệnh catch. Nó không bao giờ trả về luồng thực
hiện ban đầu, tức là các lệnh sau khi phát ra ngoại lệ trong khối try không được thực
hiện. Trong trường hợp này chúng ta sẽ không bao giờ nhận được thông báo “Exiting
try block ”. Khối lệnh catch xử lý lỗi và sau đó chuyển việc thực thi chương trình
đến các lệnh tiếp sau khối catch. Ở đây không có việc quay lại cuộc gọi hàm trước
trong stack. Ngoại lệ bây giờ được xử lý, không có vấn đề gì xảy ra, và chương trình
tiếp tục hoạt động bình thường. Điều này trở nên rõ ràng hơn nếu chúng ta di chuyển
khối try/catch lên hàm Func1 như trong ví dụ minh họa
1.2.2 Câu lệnh Finaly
Trong một số tình huống, việc phát sinh ngoại lệ và unwind stack có thể tạo ra
một số vấn đề. Ví dụ như nếu chúng ta mở một tập tin hay trường hợp khác là xác
nhận một tài nguyên, chúng ta có thể cần thiết một cơ hội để đóng một tập tin hay là
giải phóng bộ nhớ đệm mà chương trình đã chiếm giữ trước đó.
Tuy nhiên, có một số hành động mà chúng ta cần phải quan tâm bất cứ khi nào
một ngoại lệ được phát sinh ra, như việc đóng một tập tin, chúng ta có hai chiến lược
để lựa chọn thựcmhiện. Một hướng tiếp cận là đưa hành động nguy hiểm vào trong
khối try và sau đó thực hiện việc đóng tập tin trong cả hai khối catch và try. Tuy nhiên,
điều này gây ra đoạn chương trình không được đẹp do sử dụng trùng lắp lệnh.
Ngôn ngữ C# cung cấp một sự thay thế tốt hơn trong khối finally.
Đoạn chương trình bên trong khối catch được đảm bảo thực thi mà không quan
tâm đến việc khi nào thì một ngoại lệ được phát sinh. trong khối finally, ở đây nó sẽ
được thực thi mà không cần quan tâm đến việc có phát sinh hay không một ngoại lệ
trong chương trình.
GVHD: Nguyễn Vũ

SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 20
Đồ án môn học Lập trình mạng nâng cao
CHƯƠNG I: FILE TRANSFER PROTOCOL
2.1Giới thiệu
FTP là chữ viết tắc của File Transfer Protocol – Giao thức truyền file. FTP là một
giao thức truyền file trên mạng dựa trên chuẩn TCP nên rất đáng tin cậy.
Hoạt động của FTP cần có 2 máy tính, một máy chủ (Server) và một máy khách
(Client) Máy chủ FTP, dùng chạy phần mềm cung cấp dịch vụ FTP, gọi là trình chủ,
lắng nghe yêu cầu về dịch vụ của các máy tính khác trên mạng lưới. Máy khách chạy
phần mềm FTP dành cho người sử dụng dịch vụ, gọi là trình khách, thì khởi đầu một
liên kết với máy chủ. Một khi hai máy đã liên kết với nhau, máy khách có thể xử lý
một số thao tác về tập tin, như tải tập tin lên máy chủ, tải tập tin từ máy chủ xuống
máy của mình, đổi tên của tập tin, hoặc xóa tập tin ở máy chủ v.v. Vì giao thức FTP là
một giao thức chuẩn công khai, cho nên bất cứ một công ty phần mềm nào, hay một
lập trình viên nào cũng có thể viết trình chủ FTP hoặc trình khách FTP. Hầu như bất
cứ một nền tảng hệ điều hành máy tính nào cũng hỗ trợ giao thức FTP. Điều này cho
phép tất cả các máy tính kết nối với một mạng lưới có nền TCP/IP, xử lý tập tin trên
một máy tính khác trên cùng một mạng lưới với mình, bất kể máy tính ấy dùng hệ điều
hành nào (nếu các máy tính ấy đều cho phép sự truy cập của các máy tính khác, dùng
giao thức FTP). Hiện nay trên thị trường có rất nhiều các trình khách và trình chủ FTP,
và phần đông các trình ứng dụng này cho phép người dùng được lấy tự do, không mất
tiền
FTP thường chạy trên hai cổng, 20 và 21, và chỉ chạy riêng trên nền của TCP.
Trình chủ FTP lắng nghe các yêu cầu dịch vụ từ những kết nối vào máy của các trình
khách FTP, trên cổng 21. Đường kết nối trên cổng 21 này tạo nên một dòng truyền
điều khiển, cho phép các dòng lệnh được chuyển qua trình chủ FTP.
Để truyền tải tập tin qua lại giữa hai máy, chúng ta cần phải có một kết nối khác.
Tùy thuộc vào chế độ truyền tải được sử dụng, trình khách (ở chế độ năng động -
active mode) hoặc trình chủ (ở chế độ bị động - passive mode) đều có thể lắng nghe
yêu cầu kết nối đến từ đầu kia của mình. Trong trường hợp kết nối ở chế độ năng

GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 21
Đồ án môn học Lập trình mạng nâng cao
động, (trình chủ kết nối với trình khách để truyền tải dữ liệu) , trình chủ phải trước tiên
đóng kết vào cổng 20, trước khi liên lạc và kết nối với trình khách. Trong chế độ bị
động, hạn chế này được giải tỏa, và việc đóng kết trước là một việc không cần phải
làm.
Trong khi dữ liệu được truyền tải qua dòng dữ liệu, dòng điều khiển đứng im.
Tình trạng này gây ra một số vấn đề, đặc biệt khi số lượng dữ liệu đòi hỏi được truyền
tải là một số lượng lớn, và đường truyền tải chạy thông qua những bức tường lửa. Bức
tường lửa là dụng cụ thường tự động ngắt các phiên giao dịch sau một thời gian dài im
lặng. Tuy tập tin có thể được truyền tải qua hoàn thiện, xong dòng điều khiển do bị
bức tường lửa ngắt mạch truyền thông giữa quãng, gây ra báo lỗi.
FTP là một phương pháp truyền tập tin có truyền thống phi bảo an (không an
toàn), vì theo như bản thiết kế gốc đặc tả của FTP, không có cách nào có thể truyền tải
dữ liệu dưới hình thức mật mã hóa được. Ảnh hưởng này có nghĩa là, phần lớn các cài
đặt của mạng lưới truyền thông, tên người dùng, mật khẩu, dòng lệnh FTP và tập tin
được truyền tải, đều có thể bị người khác trên cùng một mạng lưới, "ngửi" hoặc quan
sát, dùng phần mềm phân tích giao thức (protocol analyzer) (hoặc còn gọi là "dụng cụ
ngửi dữ liệu", tiếng Anh là "sniffer"). Nên chú ý rằng đây là vấn đề thường thấy ở các
giao thức của Internet được thiết kế trước khi SSL (Secure Sockets Layer) ra đời (tạm
dịch là giao thức "tầng kết nối bảo mật"), như HTTP, SMTP và Telnet. Giải pháp
thường thấy, đối với vấn đề này, là dùng SFTP (Secure Shell File Transfer Protocol -
tạm dịch là "giao thức truyền tập tin dùng trình bao bảo mật"), một giao thức dựa trên
nền của SSH, hoặc trên FTPS (FTP over SSL). SFTP là FTP được cộng thêm chức
năng mã hoá dữ liệu của SSL hoặc TLS (Transport Layer Security - tạm dịch là "Bảo
mật tầng giao vận").
Nhiều máy chủ chạy trình chủ FTP cho phép cái gọi là "FTP nặc danh". Bố trí này cho
phép người dùng truy nhập vào máy chủ mà không cần có trương mục. Tên người
dùng của truy cập nặc danh thường là hai chữ 'nặc danh' hoặc một chữ 'ftp' mà thôi.

Trương mục này không có mật khẩu. Tuy người dùng thường bị đòi hỏi phải kèm địa
chỉ thư điện tử của mình vào, thay thế cho mật khẩu, hòng giúp phần mềm xác minh
người dùng, xong thủ tục xác minh thường là rất sơ sài và hầu như không có - tùy
GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 22
Đồ án môn học Lập trình mạng nâng cao
thuộc vào trình chủ FTP đang được dùng và sự cài đặt của nó. Internet Gopher đã
được đề nghị trở thành một hình thức thay thế của FTP nặc danh.
2.2 Mục đích của giao thức FTP
- Mục đích của giao thức FTP, như được phác thảo trong bản RFC, là:
- Khuyến khích việc dùng chung tập tin (như chương trình ứng dụng vi
tính hoặc dữ liệu)
- Khuyến khích việc sử dụng máy tính ở xa một cách gián tiếp / ngấm
ngầm (implicit).
- Che đậy sự khác biệt về hệ thống lưu trữ tập tin giữa các máy chủ, hầu
cho người dùng không cần phải quan tâm đến những sự khác biệt riêng tư của chúng.
- Truyền tải dữ liệu một cách đáng tin cậy và có hiệu quả cao.
2.3 Những phê bình về giao thức FTP
- Mật khẩu và nội dung của tập tin được truyền qua đường dây ở thể dạng văn
bản thường (clear text), và vì vậy chúng có thể bị chặn và nội dung bị tiết lộ cho
những kẻ nghe trộm. Hiện nay, người ta có những cải tiến để né tránh được nhược
điểm này.
- Cần phải có nhiều kết nối TCP/IP: một dòng dành riêng cho việc điều khiển kết
nối, một dòng riêng cho việc truyền tập tin lên, truyền tập tin xuống, hoặc liệt kê thư
mục. Các phần mềm bức tường lửa cần phải được cài đặt thêm những lôgic mới, đế có
thể lường trước được những kết nối của FTP.
- Việc thanh lọc giao thông FTP bên trình khách, khi nó hoạt động ở chế độ năng
động, dùng bức tường lửa, là một việc khó làm, vì trình khách phải tùy ứng mở một
cổng mới để tiếp nhận đòi hỏi kết nối khi nó xảy ra. Vấn đề này phần lớn được giải
quyết bằng cách chuyển FTP sang dùng ở chế độ bị động

- Người ta có thể lạm dụng tính năng ủy quyền, được cài đặt sẵn trong giao thức,
để sai khiến máy chủ gửi dữ liệu sang một cổng tùy chọn ở một máy tính thứ ba. Xin
xem thêm về FXP.
GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 23
Đồ án môn học Lập trình mạng nâng cao
- FTP là một giao thức có tính trì trệ rất cao (high latency). Sự trì trệ gây ra do
việc, nó bắt buộc phải giải quyết một số lượng lớn các dòng lệnh khởi đầu một phiên
truyền tải.
- Phần nhận không có phương pháp để kiểm chứng tính toàn vẹn của dữ liệu
được truyền sang. Nếu kết nối truyền tải bị ngắt giữa lưng chừng thì không có cách gì,
trong giao thức, giúp cho phần nhận biết được rằng, tập tin nhận được là hoàn chỉnh
hay còn vẫn còn thiếu sót. Sự hỗ trợ bên ngoài, như việc dùng kiểm tra tổng MD5,
hoặc dùng kiểm độ dư tuần hoàn (cyclic redundancy checking) là một việc cần thiết.
- FTP là một phương pháp truyền tập tin có truyền thống phi bảo an (không an
toàn), vì theo như bản thiết kế gốc đặc tả của FTP, không có cách nào có thể truyền tải
dữ liệu dưới hình thức mật mã hóa được. Ảnh hưởng này có nghĩa là, phần lớn các cài
đặt của mạng lưới truyền thông, tên người dùng, mật khẩu, dòng lệnh FTP và tập tin
được truyền tải, đều có thể bị người khác trên cùng một mạng lưới, "ngửi" hoặc quan
sát, dùng phần mềm phân tích giao thức (protocol analyzer) (hoặc còn gọi là "dụng cụ
ngửi dữ liệu", tiếng Anh là "sniffer"). Nên chú ý rằng đây là vấn đề thường thấy ở các
giao thức của Internet được thiết kế trước khi SSL (Secure Sockets Layer) ra đời (tạm
dịch là giao thức "tầng kết nối bảo mật"), như HTTP, SMTP và Telnet. Giải pháp
thường thấy, đối với vấn đề này, là dùng SFTP (Secure Shell File Transfer Protocol -
tạm dịch là "giao thức truyền tập tin dùng trình bao bảo mật"), một giao thức dựa trên
nền của SSH, hoặc trên FTPS (FTP over SSL). SFTP là FTP được cộng thêm chức
năng mã hoá dữ liệu của SSL hoặc TLS (Transport Layer Security - tạm dịch là "Bảo
mật tầng giao vận").
2.4 Các loại kết nối
2.4.1 Active FTP

Trong chế độ này FTP Client kết nối tới server bằng một port ngẫu nhiên, không
có đặt quyền. (N>1023), đến cổng lệnh của máy chủ FTP ( port 21), sau đó, ftp client
lắng nghe bằng cổng N+1 và gửi lệnh port N+1 cho máy chủ, sau đó ftp server sẽ kết
nối với ftp client port 20, và bắt đầu truyền dữ liệu
Bước 1: Client liên lạc với máy chủ, và gửi port 1027
Bước 2: Server gửi gói tin ack gửi lại về cổng lệnh của client
GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 24
Đồ án môn học Lập trình mạng nâng cao
Bước 3: Server khởi tạo một kết nối vào cổng 1027 của client
Bước 4. Client gửi gói ack về cho server
Hình 2.1: Actice FTP
2.4.2 Passive FTP
Trong chế độ thụ động FTP client khởi xướng cả các kết nối đến máy chủ, giải
quyết vấn đề của bức tường lửa lọc các cổng kết nối dữ liệu đến cho khách hàng từ
máy chủ. Khi mở một kết nối FTP, khách hàng sẽ mở hai cổng ngẫu nhiên không có
đặc quyền tại địa phương (N> 1023 và N +1). Các địa chỉ liên lạc cảng đầu tiên trên
máy chủ trên cổng 21, nhưng thay vì sau đó phát hành một PORT lệnh và cho phép
các máy chủ để kết nối trở lại vào cổng dữ liệu của nó, khách hàng sẽ cấp PASV lệnh.
Kết quả của việc này là máy chủ sau đó sẽ mở ra một cổng ngẫu nhiên không có đặc
quyền (P> 1023) và gửi PORT P lệnh lại cho khách hàng. Các khách hàng khởi tạo kết
nối từ cổng N +1 vào cổng P trên máy chủ để chuyển dữ liệu.
Bước 1: Client gửi yêu cầu kết nối với server( với 2 port n và n +1)
Bước 2: Server gửi port ngẫu nhiên về phía client
Bước 3: Client sử dụng port để bắt đầu một kết nối
Bước 4: Gửi ack về phía khách hàng
GVHD: Nguyễn Vũ
SVTH: Quốc Nhựt – Trọng Việt – Ngọc Trí Trang 25

×