Kiểm tra thamso nếu hợp lệ thì chờ một client nào đó kết nối tại cổng là thamso(được nhập từ bàn phím).Mặc định thamso là 7777.Sau khi kết nối, thực hiện những yêu cầu của client. Cuối cùng là đóng kết nối khi client thực hiện ngắt kết nối với server
8 trang |
Chia sẻ: tuandn | Lượt xem: 2127 | Lượt tải: 1
Bạn đang xem nội dung tài liệu Đề tài Chương trình FTP đơn giản, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
BÁO CÁO ĐỒ ÁN
Chương trình FTP đơn giản
Môn : Thực hành nâng cao
Giáo viên: Lê Văn Tuấn
I.Cấu trúc chương trình FTP đơn giản:
1.Tổ chức các lớp, chức năng và sơ đồ lớp:
Chương trình gồm 7 lớp:
-MyTinyFTPD.class
-MyTinyFTP.class
-MainFrame.class
-SeverThread.class
-DataPacket.class
-Processes.class
-MyCellRenderer.class
*)Tổ chức lớp:
Lớp
Phương thức
Chức năng
MyTinyFTPD.class
public MyTinyFTPD(String[] thamso)
Kiểm tra thamso nếu hợp lệ thì chờ một client nào đó kết nối tại cổng là thamso(được nhập từ bàn phím).Mặc định thamso là 7777.Sau khi kết nối, thực hiện những yêu cầu của client. Cuối cùng là đóng kết nối khi client thực hiện ngắt kết nối với server
MyTinyFTP.class
public MyTinyFTP()
Tạo một đối tượng thuộc lớp MainFrame sau đó hiển thị giao diện ra màn hình
MainFrame.class
public MainFrame()
tạo giao diện cho ứng dụng
protected static ImageIcon createImageIcon(String path)
tạo ImageIcon
public JScrollPane createClient()
tạo cây thư mục
public void addTreeServer(Vector v)
public void createComponetList(String name,int x,int y,int w,int h)
public void connect()
kết nốI
public void disConnect()
ngắt kết nối
public void createServer_db()
public void upLoad()
public void downLoad()
public void refreshS()
public void connection(String h, int p)
kết nốI vớI host h và cổng p
public void closeConnection()
Đóng kết nốI
public void initStream()
khởI tạo luồng
public void closeStream()
Đóng luồng
public void downLoadDir(String path,String folder)
Down thư mục
public void downLoad(String path,String fileName)
Down file
public void upLoadDir(String path,String folderName)
Up thư mục
public boolean upLoad(String absoluteFile)
public void changeDir(String folder)
đổI thư mục
public void loadTreeServer()
public Vector getVList()
ServerThread.class
public ServerThread(Socket c)
public void run()
thực hiện kết nối
public void closeClient()
Đóng kết nối
public void infoClient(Socket c,String msg)
Thong tin về client
public void downLoadDir()
public void downLoad()
public void upLoadDir()
public void upLoad()
public void sendTreeServer(String path)
public boolean listener()
DataPacket.class
public DataPacket(byte notice)
Đóng gói notice
public DataPacket(byte notice,byte[] buffer)
Đóng gói mảng buffer
public DataPacket(byte notice,String msg)
Đóng gói chuỗI msg
public static byte[] formatDataLength(int value)
định dạng dữ liệu
public static int returnDataLength(byte[] len)
trả lạI kích thước dữ liệu
public static int returnDataLength(byte hi, byte low)
public byte[] getMessage()
lấy thông báo
public byte[] getData()
lấy dữ liệu
public int getLengthMessage()
lấy kích thước thông báo
public int getDataLength()
lấy kích thước dữ liệu
public byte getNotice()
public String toString(byte[] data,int vtd, int vtc)
Processes.class
public static int sendPacket(DataOutputStream out,DataPacket p)
gửI gói tin
public static DataPacket receivePacket(DataInputStream in)
nhận gói tin
private static byte[] read(DataInputStream in,int num)
public static boolean loadFile(DataOutputStream out, String fullName)
public static boolean writeFile(DataInputStream in,String fullPath)
public static boolean validFile(String fullPath)
public static void mkDir(String name)
tạo thư mục
public static void rename(File f,String newName)
đổI tên thư mục
public static void delete(String fullPath)
Xóa đường dẫn
public static String getFileName(String path)
lấy tên file
public static String getFullPath(String path, String fileName)
MyCellRenderer.class
public MyCellRenderer()
public Component getListCellRendererComponent(JList list,Object value,int index,boolean isSelected,boolean cellHasFocus)
*)Chức năng của các lớp:
Các lớp của chương trình
Chức năng chính từng lớp
MyTinyFTPD.class
Chạy trên server chờ các client kết nối.
MyTinyFTP.class
Chạy trên client, hiển thị giao diện chương trình FTP lên màn hình.
MainFrame.class
Tạo giao diện cho chương trình.
SeverThread.class
Khi client đã kết nối thành công với server thì một đối tượng thuộc lớp ServerThread được tạo ra để phục vụ những yêu cầu do client gửi tới server như là upload/download file/thư mục
DataPacket.class
Lớp này có chức năng chia tập tin ban đầu thành các gói tin, đóng gói các gói tin.
Proceses.class
Lớp này có chức năng gứi gói tin vào luồng xuất va nhận gói tin từ luồng nhập.
MyCellRenderer.class
Giúp ta phân biệt được đâu là thư mục đâu là file mỗi khi client upload chúng lên server
MyTinyFTPD.class
private static ServerSocketserver;
private int port;
public MyTinyFTPD(String[] thamso)
*)Sơ đồ lớp:
MyTinyFTP.class
public MyTinyFTP()
MainFrame.class
private static JLabel lblFile;
private static JLabel lbltopPanel;
private static JLabel lbconnect,lbline;
private static Container container;
private static JFileChooser fc;
private static JPanelcenterPanel1,centerPanel2;
private static JTextField txtHost,txtPort;
private static JTextArea txtState=new JTextArea();
private static JButton btKetnoi,btGioithieu;
private static JButton btGuiFile,btNhanFile;
private static JEditorPane treeClient;
private static JList treeServer=new JList();
private Vector vList=new Vector();
private Socket socket;
private DataInputStream in;
private DataOutputStream out;
private int port;
private String host;
private String currentPath=System.getProperty("user.dir");
public MainFrame()
protected static ImageIcon createImageIcon(String path)
public JScrollPane createClient()
public void addTreeServer(Vector v)
public void createComponetList(String name,int x,int y,int w,int h)
public void connect()
public void disConnect()
public void createServer_db()
public void upLoad()
public void downLoad()
public void refreshS()
public void connection(String h, int p)
public void closeConnection()
public void initStream()
public void closeStream()
public void downLoadDir(String path,String folder)
public void downLoad(String path,String fileName)
public void upLoadDir(String path,String folderName)
public boolean upLoad(String absoluteFile)
public void changeDir(String folder)
public void loadTreeServer()
public Vector getVList()
SeverThread.class
private Socket client;
private DataInputStream in;
private DataOutput Streamout;
private String homePath=System.getProperty("user.dir")+"\\";
private String currPath=homePath;
public ServerThread(Socket c)
public void run()
public void closeClient()
public void infoClient(Socket c,String msg)
public void downLoadDir()
public void downLoad()
public void upLoadDir()
public void upLoad()
public void sendTreeServer(String path)
public boolean listener()
DataPacket.class
private static byte[] message={0,0,0};
private static byte[] data=new byte[0];
public DataPacket(byte notice)
public DataPacket(byte notice,byte[] buffer)
public DataPacket(byte notice,String msg)
public static byte[] formatDataLength(int value)
public static int returnDataLength(byte[] len)
public static int returnDataLength(byte hi, byte low)
public byte[] getMessage()
public byte[] getData()
public int getLengthMessage()
public int getDataLength()
public byte getNotice()
public String toString(byte[] data,int vtd, int vtc)
Processes.class
private static final int MAX_LEN=8192;
public static int sendPacket(DataOutputStream out,DataPacket p)
public static DataPacket receivePacket(DataInputStream in)
private static byte[] read(DataInputStream in,int num)
public static boolean loadFile(DataOutputStream out, String fullName)
public static boolean writeFile(DataInputStream in,String fullPath)
public static boolean validFile(String fullPath)
public static void mkDir(String name)
public static void rename(File f,String newName)
public static void delete(String fullPath)
public static String getFileName(String path)
public static String getFullPath(String path, String fileName)
MyCellRenderer.class
private DataInputStream in;
public MyCellRenderer()
public Component getListCellRendererComponent(JList list,Object value,int index,boolean isSelected,boolean cellHasFocus)
2.Giao thức:
Một hệ thống client/server cần phải cài đặt một giao thức bên trong nó, với chương trình FTP này giao thức được cài đặt là TCP. Với đặc tính là một giao thức hướng liên kết (connection-oriented), ổn định và chính xác nên TCP rất thích hợp cho việc truyền tải file qua mạng, nhưng nó tiêu tốn khá nhiều tài nguyên mạng. Cơ chế làm việc của chương trình là từ tầng ứng dụng (nơi chương trình được cài đặt và làm việc), chương trình sẽ truyền các gói tin được chia nhỏ từ một file, rồi từ đó các tầng mạng tiếp tục xử lý các gói tin đó để chuyền qua mạng cho máy nhận.
Giao thức được cài đặt với 2 lớp quan trọng là :DataPacket.class dùng để chia file thành các gói tin, lớp Processes.class có nhiệm vụ gửi và nhận các gói tin.
Khi kết nối thành công server lặp vô tận và tạo ra đốI tượng ServerThread phục vụ client đã kết nối với server.
3.Cách sử dụng chương trình:
Trong chương trình này, để kết nối, ở server chạy file MyTinyFTPD.class bằng cách gõ từ dòng lệnh “java MyTinyFTPD [port]” .Mặc định port là 7777.Sau đó ở client chạy file MyTinyFTP.class băng cách gõ java MyTinyFTP. Lúc này giao diện chương trình hiện lên màn hình tiếp theo ta nhấp chuột vào button “ket noi” để kết nối với server.Qua trình kết nối thành công sẽ được thông báo.Bây giờ client có thể gửi file tới server hoặc tải file từ server .
a. Gởi File:
Để gởi file (hoặc thư mục) ta chọn một file (hoặc thư mục) trong hộp thoại chọn file trên Client. Sau đó chọn thư mục sẽ chứa các file hoặc thư mục này trên phía Server bằng cách chọn một thư 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 “Gui file”. Lúc này chương trình sẽ gởi các file (hoặc thư mục) đã chọn đến đích.
Quá trình truyền một file diễn ra: Trước tiên chương trình sẽ lấy thông tin của file cần truyền, sau đó tình toán số lượng và kích thước các gói sẽ được chia nhỏ ra để truyền qua mạng. Tên file cùng với các thông tin phụ sẽ được gửi đi trước, bên nhận sẽ kiểm tra sự tồn tại của file sắp được chuyển trong thư mục hiện hành. Tiếp theo, chương trình sẽ tiến hành gửi các gói dữ liệu đi. Trong quá trình nhận các gói tin, nếu có lỗi xảy ra, ngay lập tức file mới được đóng lại và thông tin của lần truyền file bị lỗi này sẽ được thông báo cho người dung.
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 file (hoặc thư mục) trên cây hiển thị phía Server và chọn nơi sẽ chứa nhũng file (hoặc thư mục) này trên hộp chọn file phía Client. Và sau đó nhấn nút “Nhan file”
II.Khó khăn:
Trong qua trình cài đặt chương trình FTP này, nhóm em đã gặp khó khăn trong việc chia nhỏ tập tin như thế nào cho thuận lợi trong việc gưỉ.Một vấn đề khó khăn là làm sao nhận biết được ranh giới giữa các gói tin cũng như các thông điệp trong luồng nhập cũng như luồng xuất. Và khi tiến hành truyền nhiều file hoặc truyền một thư mục (không rỗng) thì vấn đề là làm sao biết được ranh giới dữ liệu giữa các file với nhau trong luồng. Với cách làm thông thường xử lý từng byte một thì việc này đòi hỏi cần phải có một sự kiểm soát luồng cực kỳ chặt chẽ (chặt chẽ đền từng byte một) thì mới có thể đảm bảo cho chương trình vận hành ổn định.
Khó khăn thứ 2 là việc hiển thị danh sách các file ở Server trên máy Client.
Chương trình này chỉ có 2 tính năng cơ bản là gửi và nhận file.Không cài được chức năng resume trong trường hợp bị ngắt kết nối khi đang truyền file.
Việc lựa chọn loại của luồng (nhập/xuất), cũng như các phương thức đọc/ghi cũng gặp nhiều vấn đề. Bởi vì nếu sử dụng không đúng thì dữ liệu sau khi chuyển qua mạng sẽ bị hỏng cấu trúc, không sử dụng được.
III.Thành viên nhóm 2:
1.Tô Trần Quốc Đạt (trưởng nhóm)
2.Thời Minh Vương (phó nhóm)
3.Nguyễn Anh Tuấn
4.Lê Phạm Nhựt Trường
5.Nguyễn Trần Lưu