I. Giới thiệu
Hiện nay với sự phát triển của Internet, sự truyền file trên mạng trở thành một nhu cầu bức thiết. Sự cần thiết của nó ai cũng hiểu được. Hiện nay đã có nhiều chương trình hỗ trợ việc truyền file trên mạng, chẳn hạn như FTP, Tuy nhiên, không cần thiết phải sử dụng những chương trình có sẵn mà ta có thể xây dựng một chương trình tương tự như như thế. Chương trình MyTinyFTP được xây dựng với mục đích như thế và nhằm để hiểu rõ được cơ chế truyền file và áp dụng những kiến thức đã học được vào việc lập trình mạng.
II. Giao thức sử dụng:
Chương trình sử dụng giao thức TCP: TCP-Transmission Control Protocol là giao thức truyền tin giữa hai máy tính yêu cầu có kết nối. Khi trao đổi dữ liệu hai máy phải duy trì một kết nối. Dữ liệu cần trao đổi được chia thành từng gói để gởi.
11 trang |
Chia sẻ: tuandn | Lượt xem: 2074 | Lượt tải: 2
Bạn đang xem nội dung tài liệu Đồ án Chương trình truyền File qua mạng MyTinyFTP, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Giáo viên hướng dẫn : Lê Văn Tuấn
Sinh viên thực hiện : Trần Đình Luyện
Võ Sơn Trí
Lê Cao Cường
Vũ Văn Trọng
Phạm Hoàng Trương
BÁO CÁO ĐỒ ÁN
I. Giới thiệu
Hiện nay với sự phát triển của Internet, sự truyền file trên mạng trở thành một nhu cầu bức thiết. Sự cần thiết của nó ai cũng hiểu được. Hiện nay đã có nhiều chương trình hỗ trợ việc truyền file trên mạng, chẳn hạn như FTP,…Tuy nhiên, không cần thiết phải sử dụng những chương trình có sẵn mà ta có thể xây dựng một chương trình tương tự như như thế. Chương trình MyTinyFTP được xây dựng với mục đích như thế và nhằm để hiểu rõ được cơ chế truyền file và áp dụng những kiến thức đã học được vào việc lập trình mạng.
II. Giao thức sử dụng:
Chương trình sử dụng giao thức TCP: TCP-Transmission Control Protocol là giao thức truyền tin giữa hai máy tính yêu cầu có kết nối. Khi trao đổi dữ liệu hai máy phải duy trì một kết nối. Dữ liệu cần trao đổi được chia thành từng gói để gởi.
III. Giao diện và cách sử dụng chương trình
Chương trình cho phép người sử dụng có thể gởi file đến một máy nào đó và nhận file từ máy đó về. Ngoài ra chương trình còn cho phép tạo thư mục, xóa thư mục trên máy chủ.
1. Giao diện chính của chương trình:
Chương trình gồm hai phần trình bày phía máy chủ và máy client.
Trước khi kết nối với máy chủ: chương trình chỉ có hộp chọn file (JFileChooser) fcClient hiển thị phía Client, lúc này chức năng của chương trình chưa thể sử dụng.
Sau khi kết nối với máy chủ (bằng cách nhấn nút Conect) thì chương trình sẽ kết nối với máy chủ, và giao diện lúc này hiển thị một cây JTree, cây này hiển hiển thị tên những tập tin hoặc tên thư mục của thư mục hiện tại chứa chương trình Server.
2. Sử dụng chương trình:
Để khởi động Server, từ dấu nhắc hệ thống gõ java MyTinyFTPD [port], trong đó port là số hiệu cổng mà Server chờ kết nối và sẽ nhận yêu cầu kết của Client; trong trường hợp vắng mặt tham số này, cổng 7777 sẽ được sử dụng như một cổng mặc định.
Để khởi động Client, từ dấu nhắc hệ thống gõ java MyTinyFTP, sẽ xuất hiện một giao diện. Nhập tên máy chủ mà Client sẽ kết nối,và số hiệu cổng để kết nối đến máy chủ.
Chương trình gồm các class:
MyTinyFTPD.class: Dùng để chạy máy chủ.
Server_Client.class: Lớp dẫn xuất từ Thread, dùng để phục vụ nhiều Client chứa những thủ tục và hàm xử lý máy chủ.
MyTinyInterface. class:Chứa những thủ tục và hàm xử lý từ máy client.
MyTinyFTP. class: Dùng để chạy máy Client.
SendByPacket. class: Gồm thủ tục gởi và nhận file, tạo mới thư mục, xóa thư mục.
PacketData. class: Lớp đối tượng dùng để gởi. Lớp này cài giao diện Serializable.
myFile. class: Chứa thủ tục tạo một nút gốc từ tên một tập tin.
a. Gởi File:
Để gởi file người sử dụng chọn file trong hộp thoại chọn file trên Client. Nếu muốn chọn nhiều file thì giữ phím Control trong quá trình chọn. Sau đó chọn thư mục sẽ chứa các file này trên phía Server bằng cách chọn một nhánh nào đó trên cây hiển thị các file và thư mục của Server. Sau đó nhấn nút Upload. Lúc này chương trình sẽ gởi các file đã chọn đến đích.
b. Nhận File
Để nhận file thì người sử dụng cũng chọn tương tự như lúc gởi, nhưng chọn các trên cây hiển thị phía Server và chọn nơi sẽ chứa những file này trên hộp chọn file phía Client. Và sau đó nhấn nút Download. Lúc này chương trình sẽ Download các file về.
III. Giao thức gởi và nhận file:
1. Khi người dùng kết nối với máy chủ:
Ngay khi yêu cầu kết nối (nhấn Conect) thì máy Client sẽ kết nối đến máy Server đang chờ kết nối tại cổng nào đó.
Khi máy Server nhận được kết nối thì máy Server sẽ tạo ra một nút gốc chứa toàn bộ các tên file hoặc thư mục con của thư mục hiện hành (chứa chương trình máy chủ). Việc tạo cây này nhờ vào phương thức createNodes trong lớp myFile.class.
Như vậy khi kết nối thì máy Client đọc nút gốc này và tạo ra một cây từ nút gốc này và thêm vào giao diện hiển thị ở phía Client. Đây là cây hiển thị thư mục và file con của thư mục hiện hành phía Server. Khi người dùng chọn trên cây này có nghĩa là chọn file hoặc thư mục bên phía Server.
2. Gởi file và nhận file:
a. Gởi file
Khi người dùng yêu cầu gởi những file đã chọn thì chương trình sẽ lần lượt gởi từng file đã chọn. Trước khi gởi đi thì chương trình sẽ gởi một thông điệp để phía Server nhận biết để nhận file. Ở đây sử dụng thông điệp . Sau đó gởi file đi nhờ vào phương thức sendFile trong lớp SendByPacket.class:
Với file gởi là một tập tin:
Trong đó: file[i] là file cần gởi.
Với file gởi là thư mục: Lấy tất cả các file và thư mục con của file cần gởi đưa vào một Vector (fileFolder) và lần lượt gởi đi từng file một. Quá trình này thực hiện song song.
Vì trước khi gởi một file thì máy Client gởi một thông điệp nên khi máy Server nhận được thông điệp này thì sẽ nhận file nhờ vào hàm ReceiveFile trong lớp SendByPacket.class:
Cụ thể :
Ở đây curDir là đường dẫn chứa thư mục gốc của thư mục chứa chương trình được lấy ngay ở đầu chương trình
. Ngoài ra chương trình còn hỗ trợ việc tạo mới thư mục, hoặc xóa thư mục bên phía Server bằng cách nhấn chuột phải vào phía cây tree hiển thị những tập tin của Server.
Việc tạo hay xóa này Server hiểu được là nhờ vào các thông điệp được truyền đi từ máy Client. Khi cần xóa hay tạo mới một thư mục thì Client gởi thông điệp và gởi tên thư mục cần tạo hoặc xóa.
Như vậy khi máy Server nhận được những thông điệp tạo hoặc xóa thì sẽ đọc tiếp tên file và tạo mới hoặc xóa nhờ vào các hàm tạo và xóa trong lớp SendByPacket.class.
Các hàm tạo, xóa một file có dạng sau :
Với name hoặc fullPath là đường dẫn đến thư mục hoặc file cần tạo, xóa.
b. Nhận file:
Khi người dùng chọn một số file hoặc thư mục trên cây của Server và có yêu cầu Download thì chương trình sẽ lấy danh sách các file hoặc thư mục được chọn và gởi danh sách đó đến Server. Ở đây trước khi gởi đi chương trình gởi đi sẽ gởi một thông điệp và sau đó gởi danh sách này đi. Và thủ tục này sẽ được gọi lại để nhận file. Khi thủ tục này được gọi lại thì chương trình sẽ nhận file từ Server về nhờ vào phương thức getDataFromServer(int sl), ở đây biến sl dùng để đánh dấu là gởi dánh sách đi hay nhận dữ liệu về (0 gởi danh sách đi ; 1 nhận dữ liệu về).
Khi máy Server nhận được thông điệp sẽ nhận danh sách các file về và sau đó gởi lần lượt từng file một dựa vào phương thức sendToClient(String[] name) với name[] là danh sách các file cần gởi. Kết thúc của việc gởi file của Server đến Client thì gởi đi một thông điệp .
Trước khi gởi đi cũng gởi thông điệp và sau đó gởi file đi nhờ vào hàm sendFile của lớp SendByPacket.class.
Trong phương thức gởi file tới Client:
Khi gởi name[i] nào đó: nếu là tập tin thì gọi hàm sentFile(ObjectOutputStream out, String fileName, String dest) để gởi file.
Nếu file cần gởi là một thư mục: Lấy tất cả các file và thư mục con của file cần gởi đưa vào một Vector (fileFolder) và lần lượt gởi đi từng file một. Quá trình này thực hiện song song.
Như vậy khi máy Client nhận được thông điệp thì sẽ nhận file nhờ vào hàm ReceiveFile(ObjectInputStream in,String path) của lớp SendByPacket.class để nhận file. Việc nhận file này lặp liên tục cho đến khi thông điệp nhận được là .
Quá trình gởi và nhận file này diễn ra khi có yêu cầu của người sử dụng từ phía Client.
IV. Các lớp sử dụng trong chương trình và các giao thức của các lớp:
1. Lớp Server_Client.class là lớp dẫn xuất từ Thread:
Lớp này dùng để xử lý các công việc của máy chủ. Lớp này chỉ có một phương thức run(), nó được sử dụng trong lớp MyTinyFTPD.class.
Constructor:
public Server_Client(Socket s) với s là socket mà Server sẽ giao tiếp.
Method:
public void run(): Xử lý những thông điệp nhận được từ Server.
2. Lớp MyTinyFTPD.class dùng để chờ kết nối và thực hiện phục vụ nhiều Client. Mỗi khi có một client kết nối thì nó sẽ new một đối tượng lớp Server_Client.class. Lớp này chứa hàm main.
3. Lớp MyTinyInterface.class chứa toàn bộ những phương thức thực hiện giao tiếp với Server. Lớp này xử lý các yêu cầu người dùng thông qua giao diện.
Constructor:
public MyTinyInterface()
Method:
public void btConect_Click(): được gọi khi người dùng nhấn Conect, phương thức này sẽ kết nối với máy chủ. Tên và cổng máy chủ kết nối được lấy từ hai textfield trên giao diện.
public void getDataFromServer(): được gọi khi nhấn Download, phương thức này dùng để nhận dữ liệu từ Server gởi qua.
public void btUpload_Click(): được gọi khi người dùng nhấn Upload, phương thức này dùng để gởi file từ Client đến Server.
public void btDownload_Click(int sl): được gọi khi người dùng nhấn nút Download, dùng để download các file từ máy chủ.
public String getNodeFullPath(): phương thức trả về đường dẫn từ nút gốc đến một nhánh được chọn trên cây. Phương thức này được gọi khi cần lấy tên các file chọn trên cây.
public void mouseClicked(MouseEvent e): xử lý các sự kiện lien quan đến chuột.
public void closeConect(): được gọi đến khi thủ tục btExit_Click thực hiện, phương thức này dùng để đóng kết nối và các luồng.
public void btExit_Click(): được gọi khi nhười dùng nhấn nút Exit, dùng để dừng chương trình.
4. Lớp MyTinyFTP.class: dùng để chạy máy Client. Lớp này tạo một đối tượng từ lớp MyTinyInterface.class.
5. Lớp myFile.class: chứa một phương thức dùng để tạo nút gốc cho cây. Nút gốc này chứa toàn bộ các nút con là các file trong thư mục gôc của thư mục hiện hành chứa chương trình máy Server.
public static DefaultMutableTreeNode createNodes(String fullName)
6. Lớp SendByPacket.class: lớp này chứa các thủ tục gởi, nhận file và một số phương thức khác như tạo thư mục, xóa thư mục. Phương thức dùng hỗ trợ trong việc gởi và nhận file.
Contructor:
Method:
public static void sentFile(ObjectOutputStream out,String fileName, String dest): được gọi khi cần truyền một filename đến dest vào một luồng ObjectOutputStream out trên mạng.
public static void ReceiveFile(ObjectInputStream in,String path): được gọi khi cần nhận một file từ luồng ObjectInputStream in trên mạng và lưu vào đường dẫn String path nào đó.
public static void makeDir(String name): Dùng để tạo thư mục với tên đầu đủ name.
public static void delete(String fullPath): Dùng để xóa thư mục với tên đầu đủ fullName.
7. Lớp PacketData.class: đây là lớp đối tượng được dùng khi gởi file trên mạng. Lớp này cài giao diện Serializable.
Constructor:
public PacketData(String fileName,byte[] b,int kt,boolean last): trong đó fileName là tên file sẽ gởi, b[] là dữ liệu gởi đi, kt là kích thước của dữ liệu một lần gởi, last=true nếu đây là gói sau cùng, false ngược lại.
Method:
public String getFileName(): trả về tên tập tin mà gói truyền đi.
public int getLen(): Trả về kích thước của dữ liệu trong gói này.
public byte[] getData(): trả về dữ liệu của gói được truyền đi.
public boolean isLast(): trả vể true nếu đây là gói sau cùng.
V. Hạn chế của chương trình
Mặc dù đã cố gắng rất nhiều nhưng chương trình vẫn còn nhiều hạn chế cần được khắc phục:
Việc gởi file đến máy chủ vẫn chưa xác nhận sự tồn tại của file.
Việc truyền nhiều file có kích thước lớn cùng một lúc dẫn đến lỗi tràn bộ nhớ do tạo ra nhiều đối tượng mà không giải phóng những đối tượng không dùng đến.
Việc xóa file chưa kiểm soát được những file không thể xóa.