1. Trang chủ
  2. » Luận Văn - Báo Cáo

đồ án chương trình truyền file qua mạng mytinyftp

11 546 0
Tài liệu được quét OCR, nội dung có thể không chính xác

Đ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

Thông tin cơ bản

Định dạng
Số trang 11
Dung lượng 4,98 MB

Nội dung

Trang 1

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

Trang 2

Báo cáo đồ án „ „ ¬ FTP _Group 4

BAO CAO DO AN 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

H 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 u cầu có kết nối Khi trao đổi đữ 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

II 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ề Ngồ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 bay phia may chu va may client

Trước khi kết nối với máy chủ: chương trình chỉ có hộp chon 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

25 Grouph 4 FTPM of Server name focainost | Port [7777 | Conect Upload | Download | exit |

Client Server

Lookim [2MDoeumems v [cai (| C3 (BB) =

CTFTP_Thao (images

(Luan van Phi

Amy music ñMPictures = D cthujava wR [3 eETRLE D) Luyentite java [ÄNODGRIN.GIF D sthujava

Sau khi kết nối v6i may chu (bang cach nhan nut Conect) thi 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, cay 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

Trang 3

Báo cáo đồ án

5 Grouph 4 FTPE FT] Server name localhost Port 7777 DisConect Upload - Download mm |

Client Server

tap CTETP Thao (CMwbames vị [gji8jiS|BfE ƒ3m SSCS D mrilejzva

(images D mytinye TP java (Luan van Phi a MyTinyFTPD java Server_Clientclass

awe Dy PacketData java EAwewss TÔ SendByPacketjava

faa iv eos D) mytinye TP class Phịng [Ơ mwil.class

D002 [Ơ SendByPacketclass

D cthujava D PacketData class

D cerrwe LD mytinyeTP.ctass D tuyentite java D mytinyintertaces1 class D noperin.cir LD mytinyinterfaces2.class D sthujava D MyTinyinterface$3.class x Conect (Conect sucessfull 2 Sử dụng chương trình: FTP _ Group 4

Để 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ủ

MyTinyInterƒace class:Chứa những thủ tục và hàm xử ly tir may client MyTinyFTP class: Ding dé chay may Client

SendByPacket class: Gém thu tuc gới và nhận file, tạo mới thư mục, xóa thư mục PacketDaa 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 q 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ư

Trang 4

Báo cáo đỗ án - FTP _Group 4

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ề

II 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) thi may 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

class myFile

{

#/Phuong thuc nay dung de tao cac nhanh cho cay

public static DefaultMutableTreeNode createNodes(String fullName)

}

Như vậy khi kết nói thi may Client đọc nút gốc này và tao ra một cây từ nút gốc này và

thêm vào giao điệ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

#/Tao cay tu thu muc hien hanh cua 8erver #/Doce rootNode tu luong cua Server goi qua

try{

rootNode= (DefaultMutableTreeNode) inObj readObject(); }catch (IOException e) {}

catch(ClassNotFoundException e) {} tree=new JTree (rootNode)

tree setSelectionRow (OQ);

#/Cho hien thi goc cua cay tree setRootVisible (true);

fileChoserServer = new JScrollPane();

fileChoserServer setViewportView(tree)

fileChoserServer setBounds(0,20,335,310);

fileChoserServer addMouseListener (this) ;

tree addMouseListener (this);

centerPanel2 add (fileChoserServer)

2 Goi file và nhận file: a Goi file

Trang 5

Báo cáo đồ án FTP _ Group 4 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 "8ENDEFTLE”; Sau đó gởi file đi nhờ vào phương thức sendFile trong lớp SendByPacket.class:

public static void sentFile(ObjectOutputStream out, String fileName,

String dest)

Với file gởi là một tập tin:

outOb] writeOb3] ect ( "8ENDFTILE ") ;

SendByPacket sentFile(outObj, file[i].toString(), folder); addMessage("Upload "+file[i].toString());

Trong đó: file[ï] 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 (//eFolder) và lần lượt gởi đi từng file một Quá trình này thực hiện song song

fileFolder.add(file[i].getPath().toString()); while (fileFolder size()!=0)

{

fileName= (String) fileFolder remove (0); ftam=new File (fileName);

outoObj.writeObject("SENDFILE");

String temp=fileName substring (parentPath length());

addMessage("Temp "+temp);

if (temp lastIndexOf("\\") !=-1)

SendByPacket sentFile(outObj, fileName, foldert"\\ "+

temp substring (0, temp lastIndexOf("\\"))); else

SendByPacket sentFile(outObj, fileName, folder) ; if (ftam.isDirectory())

{

list=ftam listFiles();

for (int chiso=0;chiso<list length; chisot+)

fileFolder.add(list[chiso].getPath().toString());

Vì trước khi gởi một file thi may Client gởi một thông điệp ”8ENPFT1E” 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:

public static void ReceiveFile(ObjectInputStream in, String path)

Cu thé:

if (str equalsIgnoreCase("SENDFILE") )

SendByPacket ReceiveFile(inObj,curDir);

}

Ở đây curDiz 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

Trang 6

Báo cáo đ án FTP _ Group 4 ngay ở đâu chương trình

try{

String tam=(new File(".")).getCanonicalPath(); curDir=tam substring (0, tam lastIndexOf("\\")); }catch (TOException eee) {}

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

Server [J MyTinyFTP_Grouph 4 LD myFile java LD) MyTinyFTP java LD MyTinyFTPD java [ sendByPacket.class [ PacketData j4 Refresh QD SendByPacke Delete L MTinyInterfa Q PacketData.c LD Server_Clien{_About LD) MyTinyFTPD.class LÔ mwrile.class Q MyTinyFTP.class B MyTinyInterface$1.class QD MyTinylnterface$2.class r 3

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

//Khi itemNewfolder duoc chon

itemNewfolder addActionListener (new ActionListener () { public void actionPerformed (ActionEvent evt) {

checkSelect();

String temp=getNodeFullPath().trim();

String folderName=JOptionPane showInputDialog("Folder name", "New folder" addMessage("New folder "+ttemp+"\\"+folderName+” at "+" of Server"); if (folderName!=null)

{

addTextFieldValue(folderName,1);

try{

outObj.writeObj ect ("NEWFOLDER") ;

outobj writeObj ect (temp+"\\"+folderName) ; }ecatch(LOException ee) {}

1);

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

Trang 7

Báo cáo đồ án FTP _ Group 4

str= (8tring) 1nOb] readObject();

System out.print("Thong diep nhan duoc "+str+"\n");

if (str equalsIgnoreCase("NEWFOLDER") )

{

try{

String tt=(String)inObj.readObject(); System out print(curDirt+"\\"+tt);

SendByPacket.makeDir(curDirt+"\\"+tt); }catch(IOException ee) {} } if (str equalsIgnoreCase("DELFOLDER") ) { try{

String tt=(String)inObj readObject(); System out print (curDirt"\\"+tt); SendByPacket.delete(curDirt"\\"+tt); }catch(LOException ee) {}

}

Các hàm tạo, xóa một file có dạng sau :

#/mao thu muc

public static void makeDir(String name)

#/Xoa file

public static void delete(String fullPath)

V6i name hoc fullPath là đường dẫn đến thư mục hoặc file cần tạo, xóa b Nhan 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ẽ lay 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 diép "GETFILE" va

sau đó gởi danh sách này đi Và thủ tục này sẽ được gọi lại dé nhận file Khi thủ tục này được

gọi lại thì chương trình sẽ nhận fle từ Server về nhờ vào phương thức getDataFromServer(z/ s/), ở đây biến sI dùng để đánh dấu là gởi dánh sách đi hay nhận đữ liệu về (0 gởi danh sách đi ; I nhận dữ liệu về)

Trang 8

Báo cáo đồ án FTP _ Group 4 if (s1==0) { TreePath[] tree8election=tree.get8electionEaths () ; if (treeSelection length!=0) { try{ outObj.writeOhject("GETFILE"); //Goi so file se nhan

outObj.writeObj ect (String valueOf (treeSelection length) ); for (int i=0;i<treeSelection length; i++)

{

tree setSelectionPath(treeSelection[i]);

String fileNameDownload=getNodeFullPath().trim(); outob].writeObj ect (fileNameDownload) ;

} }catch(IOException exception) {} s1=1-s1; btDownload_C11ek (s1); I } else { getDataFromServer (); sl=1-sl;

Khi máy Server nhận được thông diép "GETFILE" sé nhan danh sach cac file vé va sau đó gởi lần lượt từng file một dựa vào phương thức sendToClient(Sring[7 name) với name[j 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 "ENDGETFTLE ",

1£ (str.equalsTgnoreCase("GETFTLE"))

{

String fileName;

int sofile=Integer.parseInt( (String) inObj.readObject());

String name[]=new String[sofile]; for (int i=0;i<sofile;it+)

name [i]=curDir+ (String) inObj.readObject(); sendToClient (name);

outoObj.writeObj ect ("ENDGETFILE");

}

Trước khi gởi đi cũng gởi thông diép "GETFILE" 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[iJ nào đó: nêu là tập tin thì gọi hàm sentFile(OjectOuipufStream out, String fileName, String dest) dé géi file

outObj.writeObject("GETFILE") ;

SendByPacket sentFile(outObj,name[i].toString(),"");

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

Trang 9

Báo cáo đồ án FTP _Group 4

8tring parentPath=tam.qetEarent().to8tring (); fileFolder.add(name[i]);

while (fileFolder.size() !=0)

{

fileName= (String) fileFolder remove (0); File ftam=new File (fileName);

outOb].writeObj ect ("GETFILE") ;

String nameTam=fileName substring (parentPath length()); SendByPacket sentFile(outObj, fileName,

nameTam substring (0, nameTam lastIndexOf("\\"))); if (ftam.isDirectory())

{

list=ftam.listFiles();

for (int chiso=0; chiso<list length; chiso++)

fileFolder.add(list[chiso].getPath().toString());

}

Như vậy khi máy Client nhận được thông điệp ”#ETFTLE” thì sẽ nhận file nhờ vào hàm

ReceiveEile(ObjecflnputStream 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à "ENDGETFTE ",

#/Vong lap nhan du lieu tu 8erver

public void getDataFromServer()

{

try{

8tring str=null; do{

str= (String) inObj readObject(); if (str equalsIgnoreCase("GETFILE") )

{

String curPath=fcClient getCurrentDirectory().getPath();

if ((fceClient getSelectedFiles().length==1) &&

(fcClient getSelectedFile().isDirectory())) curPath=fcClient getSelectedFile().getPath();

addMessage ("Thu muc hien tai "+curPath); 8endByPacket ReceiveFi1e(inOb], curEath) ;

}

}while (str.equalsTgnoreCase ( "SETFTLE”) ) ; }catch(TOException ee){}

catch(ClassNotFoundException ee) {} catch(NullPointerException ee) {}

}

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(), no duge su dung trong lop MyTinyFTPD.class

Constructor:

public Server_Client(Socket s) véi s là socket ma Server sé giao tiép Method:

Trang 10

Báo cáo đồ án FTP _ Group 4

public void run(): Xu ly 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_ Clienf.class Lớp này chứa

hàm main

3 Lớp MyTinylnterface.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(): duoc gọi khi người dùng nhan 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_CliekQ: đượ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(iz sJ): đượ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): xit ly cdc sự kiện lien quan đến chuột public void closeConect(): dugc goi đến khi thủ tục btExit_Cliek thực hiện, phương thức này dùng dé đóng kết nói và các luồng

public void btExit_Click(): duoc goi khi nhudi ding nhan nut Exit, ding dé dimg chuong trinh

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 để tao 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 $endByPacket.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

Trang 11

Báo cáo đồ án FTP _ Group 4

Contructor:

Method:

public static void sentFile(ObjectOutputStream out, String fileName, String dest): duge gọi khi cần truyén mét filename dén dest vao một luéng ObjectOutputStream out trén mang

public static void ReceiveFile(ObjectInputStream in,String path): duge goi khi can nhận một file từ luồng ObjectInputStream in trên mạng và lưu vào đường dan String path nào đó

public static void makeDir(String name): Ding dé tạo thư mục với tên dau du name public static void delete(String fullPath): Ding để xóa thư mục với tên đầu đủ fullName

7 Lớp PacketDafa.class: đây là lớp đối tượng được dùng khi gởi file trên mạng Lớp nay cai giao dién Serializable

Constructor:

public PacketData(String fileName,byte[] b,int kt,boolean last): trong dd fileName 1a tén file sé goi, bf] la di liéu goi di, kt la kich thude của dữ liệu một lần BỞI,

last=true néu đây là gói sau cùng, false ngược lại Method:

public String getFileName(): tra vé tén tập tin ma 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(): tra về dữ liệu của gói được truyền đi public boolean isLast(): tra 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 sốt được những file không thể xóa

Ngày đăng: 17/10/2014, 13:00

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w