FTP (File transfer Protocol) được biết đến như một giao thức truyền file nổi tiếng trong các mạng TCPIP. Với các chương trình có cùng tên kèm theo trong các hệ điều hành có hỗ trợ TCPIP như Linux, Unix, Windows 2000XP… người sử dụng có thể lấy các file trên máy chủ ở xa, cũng như upload file lên máy chủ một cách dễ dàng.Khi sử dụng FTP, phần mềm FTP trên máy cục bộ phải được kết nối đến phần mềm FTP trên máy ở xa, nơi bạn muốn lấy file về hay tải lên đó. Thông thường thì người dùng phải được cấp một tài khoản mới truy cập được vào máy ở xa. Nhưng cũng trong đa số các trường hợp người dùng không cần phải được cấp tải khoản trước mà có thể dùng tài khoản vô danh (Anonymous Account), với các hạn chế về truy cập tài nguyên.
MỤC LỤC Giới thiệu Giao diện chương trình 3 Các tính chương trình MytinyFTP Giao thức cài đặt bước hoạt động chương trình Các khó khăn kỹ thuật giải Cài đặt lớp phương thức chương trình .8 a Lớp information b Lớp packageData c Lớp Client d Lớp Service_Client e Lớp Server f Lớp dataResume g Lớp myCellRenderer h Lớp myTree i Lớp myVector j Lớp Tree_server Cách sử dụng chương trình 17 Thành viên nhóm 18 I Giới thiệu FTP (File transfer Protocol) biết đến giao thức truyền file tiếng mạng TCP/IP Với chương trình có tên kèm theo hệ điều hành có hỗ trợ TCP/IP Linux, Unix, Windows 2000/XP… người sử dụng lấy file máy chủ xa, upload file lên máy chủ cách dễ dàng Khi sử dụng FTP, phần mềm FTP máy cục phải kết nối đến phần mềm FTP máy xa, nơi bạn muốn lấy file hay tải lên Thông thường người dùng phải cấp tài khoản truy cập vào máy xa Nhưng đa số trường hợp người dùng không cần phải cấp tải khoản trước mà dùng tài khoản vô danh (Anonymous Account), với hạn chế truy cập tài nguyên Trong đồ án kết thúc môn học “Thực hành nâng cao” này, nhóm viết ứng dụng client/server nhỏ mô chương trình FTP với số chức đơn giản: MyTinyFTP Chương trình cài đặt ngôn ngữ Java II Giao diện chương trình Chương trình chưa kết nối với Server có giao diện Vì chưa kết nối với Server nên bên phía cửa số Client file máy cục Khi client kêt nối với server, cửa sổ bên server hiển thị danh sách file máy chủ: Người dùng chuyển chế độ thị dạng thư mục bên cửa sổ server: III Các tính chương trình MyTinyFTP Chương trình MyTinyFTP gồm có chức sau: • Cho phép gửi/nhận một/nhiều file thư mục từ máy trạm đến máy chủ xa (thông qua mạng cục bộ) • Cho phép nhiều Client kết nối đến Server trình vận hành chương trình • Hỗ trợ chức resume trường hợp bị ngắt kết nối bất thường truyền file từ Client lên Server ngược lại • Với hai danh sách chọn file tương ứng với hai phía Client Server người dùng thao tác với nhiều file/thư mục nhiều nơi khác để tải Client chép lên Server • Với chức Tree bên phía Server, người dùng dễ dàng hình dung tổng thể toàn cấu trúc file thư mục bên phía Server mà đuợc phép truy nhập, dễ dàng chọn file/thư mục từ • Cho phép thiết lập linh động thư mục gốc (FTPRoot) bên Server mà người dùng phép truy cập vào • Ngoài cho phép người dùng linh động với nhiều tuỳ chọn lúc khởi động chương trình IV Giao thức cài đặt bước hoạt động chương trình Một hệ thống client/server phải cài đặt giao thức bên nó, với chương trình giao thức cài đặt TCP Với đặc tính giao thức hướng liên kết (connection-oriented), ổn định xác nên TCP thích hợp cho việc truyền tải file qua mạng, nhiên ưu điểm khiến cho tiêu tốn nhiều tài nguyên mạng Cơ chế làm việc chương trình từ tầng ứng dụng (nơi chương trình cài đặt làm việc), chương trình truyền gói tin chia nhỏ từ file, từ tầng mạng tiếp tục xử lý gói tin để chuyền qua mạng cho máy nhận Hoạt động chương trình sau: Server hoạt động lắng nghe cổng mặc định (hoặc người dùng quy định), để Client kết nối với Server cần phải cung cấp cho Client biết tên máy chủ cổng mà máy chủ làm việc Khi Server khởi động, tạo file LOG (nếu chưa có) để ghi lại lỗi xảy trình làm việc Sau server chạy vào vòng lặp vô tận chờ Client gửi yêu cầu (hợp lệ) lên Trong chương trình, yêu cầu sau yêu cầu hợp lệ: Yêu cầu Ý nghĩa Send Nhận file từ Client gửi lên Get Load file từ server máy Client Ngat Ngắt kết nối Chuyenthumuc chuyển thư mục hành Yeucauresume Yêu cầu resume trường hợp upload Yeucauloadtiep Yêu cầu resume trường hợp download layJTree_JTable Cập nhật khung duyệt layJTree Cập nhật layJTable Cập nhật khung duyệt Khi Client kết nối thành công với Server, trước tiên gửi yêu cầu layJTree_JTable đến Server lấy danh sách file FTPRoot để hiển thị lên giao diện bên Client Sau Client tạo file LOG bên Client chưa tồn tại, có file Log Client kiểm tra xem có cần Resume không (xét hai trường hợp upload download) cách kiểm tra file log Nếu lần kết nối trước đó, chương trình bị ngắt kết nối bất thường truyền chưa xong file chương trình hỏi người dùng xem có muốn tiếp tục truyền hoàn thành file không; câu trả lời nhận có chương trình tiến hành Resume Quá trình truyền file diễn sau: chương trình lấy thông tin file cần truyền, sau tình toán số lượng kích thước gói chia nhỏ để truyền qua mạng Tên file với thông tin phụ gửi trước, bên nhận kiểm tra tồn file chuyển có có thư mục hay không Sau trình kiểm tra xác nhận người dùng (nếu cần thiết), chương trình tiến hành gửi gói liệu Trong trình nhận gói tin, có lỗi xảy ra, file đóng lại thông tin lần truyền file bị lỗi lưu vào file log để phục vụ cho trình resume lần kết nối sau Tất lỗi thông báo chương trình trình vận hành hiển thị khung Status Riêng lỗi lúc khởi động hiển thị hình Console V Các khó khăn kỹ thuật giải Trong qua trình cài đặt chương trình, vấn đề khó khăn lên nhận biết ranh giới gói tin thông điệp luồng nhập luồng xuất Và tiến hành truyền nhiều file truyền thư mục (không rỗng) vấn đề biết ranh giới liệu file với luồng Với cách làm thông thường xử lý byte việc đòi hỏi cần phải có kiểm soát luồng chặt chẽ (chặt chẽ đền byte một) đảm bảo cho chương trình vận hành ổn định Một giải pháp khác ta không tiến hành gửi/nhận byte mà ta gửi/nhận đối tượng Như tất thông tin muốn gửi qua mạng ta cần “đóng gói” chúng vào đối tượng chuyển chúng vào luồng Ở đầu bên luồng, ta lại đọc nguyên đối tượng với đầy đủ liệu phương thức xây dựng sẵn đối tượng đó, thuận tiện cho việc thao tác liệu Hơn “gói” (đối tượng) chứa nhiều loại lẫn số lượng liệu nên ta gộp nhiều thông tin vào gói gửi lần, dễ dàng việc kiểm soát luồng Để truyền đối tượng qua mạng đối tượng phải cài đặt (implements) giao diện Serializable Các đối tượng loại chương trình gồm có: • packageData : gói chứa liệu chia nhỏ từ file số thông tin liên quan • Information : gói chứa thông tin file truyền • myTree : gói tạo • Tree_server : gói phục vụ trình tạo • myVector : gói chứa danh sách file bên Server gửi qua cho Client • dataResume : gói phục vụ cho trình resume Một khó khăn việc hiển thị danh sách file Server máy Client Vì việc sử dụng đối tượng JFileChooser trở nên phức tạp trường hợp này, nên việc lựa chọn đối tượng sử dụng hình thức thể gặp nhiều khó khăn, vướng mắc Mỗi thành phần (component) có ưu nhược điểm riêng việc thể danh sách file Server Giải pháp đưa tích hợp nhiều thành phần phép người sử dụng tuỳ chọn trình sử dụng Trong chương trình hai thành phần sử dụng là: JTree JList Để load icon JList, đối tượng JList phải setCellRenderer với đối số phương thức đối tượng kiểu CellRenderer (và cụ thể chương trình lớp myCellRenderer kế thừa từ lớp ListCellRenderer) Việc lựa chọn loại luồng (nhập/xuất), phương thức đọc/ghi gặp nhiều vấn đề Bởi sử dụng không liệu sau chuyển qua mạng bị hỏng cấu trúc, không sử dụng Vấn đề giải kinh nghiệm thử nghiệm luồng phương thức để kiểm tra VI.Cài đặt lớp phương thức chương trình Chương trình bao gồm 11 lớp với chức lớp tóm tắt bảng sau: Tên lớp Chức Client lớp bên phía máy khách, thực chức truyền tải file hiển thị giao diện Server lớp thực thi bên phía máy chủ, có chức tạo luồng cho Client nối vào Service_Client lớp bên phía máy chủ, thực chức truyền tải file packageData gói chứa thông tin liệu (được chia nhỏ từ file) để truyền qua mạng dataResume gói chứa thông tin file cần resume information chứa thông tin file truyền qua mạng myCellRenderer lớp phục vụ cho việc thị icon đối tượng JList myTree lớp phục vụ cho việc truyền đối tượng JTree qua mạng myVector lớp phục vụ cho việc truyền đối tượng Vector qua mạng Tree_server lớp dùng để tạo đối tượng JTree Vector_server lớp phục vụ cho việc trình bày file thư mục Server bên Client (sắp xếp trình bày theo loại) Lớp information Lớp dùng để chứa thông tin file/thư mục chuẩn bị truyền qua mạng Do phải truyền qua mạng nên lớp phải implements lớp Serializable Lớp bao gồm có thuộc tính với phương thức set/get cho thuộc tính Ý nghĩa thuộc tính: • String ten :chứa tên file/thư mục chuẩn bị truyền qua • :xác định thông tin gửi file thư mục String loai • int soluong :xác định số lượng file/thư mục thư mục gửi qua (trong trường hợp đối tượng gửi qua thư mục) • String path :chứa vị trí đối tượng (file/thư mục) máy gửi (dùng cho chức Resume) Lớp dùng phương thức gửi/nhận file hai lớp Client Service_Client Lớp packageData Lớp dùng để chứa liệu với thông tin liên quan để chuyển qua mạng Dữ liệu chứa gói liệu file “cắt” nhỏ để chuyển qua mạng Lớp bao gồm có thuộc tính với phương thức set/get cho thuộc tính Ý nghĩa thuộc tính: • byte[] dulieu : mảng chứa liệu • int kichthuoc : kích thước thật mảng liệu • boolean goicuoi : xác định gói chuyển có phải gói cuối file hay không • int goiso : thứ tự gói chuyển Phương thức khởi tạo có đối số là: kích thước liệu tối đa mà gói chứa lần gửi Lớp dùng phương thức gửi file lớp Client Service_Client Lớp dataResume Lớp dùng để chứa thông tin phục vụ cho việc Resume Khi client kết nối với server, có yêu cầu cần Resume thông tin Resume chuyển qua lại máy gói Lớp bao gồm có thuộc tính với phương thức get cho thuộc tính Phương thức khởi tạo lớp có đối số, giá trị khởi tạo cho thuộc tính Ý nghĩa thuộc tính: • String path : đường dẫn file máy gửi • int goiso : gói truyền bị lỗi, resume cần gửi gói trở Lớp myCellRenderer Lớp lớp “chức năng” phục vụ cho việc load icon (để phân biệt đâu thư mục, đâu file) thành phần JList Lớp kế thừa (extends) lớp JLabel “thực thi” (implements) lớp ListCellRenderer, ta dùng hình ảnh (icon) lẫn văn để hiển thị ô JList ListCellRenderer giao diện đơn giản có phương thức: public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) Phương thức gọi đối tượng JList muốn hiển thị ô thành phần danh sách Ta quan tâm đến đối số thứ để xác định ô thể file hay thư mục để load icon tương ứng File f = (File)value; if(f.isDirectory()) setIcon(new ImageIcon("images"+File.separator+"folder_icon.gif")); else setIcon(new ImageIcon("images"+File.separator+"file_icon.gif")); Sau có lớp rồi, để JList load icon, ta cần gọi phương thức: setCellRenderer với đối số phương thức instance lớp myCellRenderer: JList_File_Server.setCellRenderer(new myCellRenderer()); Lớp Server Lớp lớp thực thi bên phía Server, đối số nhận vào từ dòng lệnh (nếu có) quy định việc khởi động Server hoạt động Nếu tham số nhập vào sai, không nhập vào thông số mặc định sử dụng, làm việc cổng 1905 thư mục làm việc (FTPRoot) thư mục hành Khi Server chạy, vào vòng lặp vô tận để đáp ứng nhiều Client kết nối vào Khi có client kết nối vào, instance lớp Service_Client tạo để thực “giao dịch” while (true){ try{ Socket s = ss.accept(); new Service_Client(s,FTPRoot); }catch (Exception e2) {} } Lớp Client Lớp lớp thực thi bên phía Client, thực hầu hết chức truyền tải file hiển thị giao diện a Phương thức khởi tạo: Client(String host, int port) Nếu đối số truyền xác chương trình sau hiển giao diện kết nối với Server luôn, ngược lại hiển thị giao diện Trong trường hợp kết nối chương trình kiểm tra xem có cần resume không cách gọi phương thức kiểm tra là: this.kiemtraResume_Client(); kiểm tra resume theo chiều Client - Server this.resume(); kiểm tra resume theo chiều Server – Client b Phương thức void showgui() Dùng để hiển thị giao diện chương trình 10 this.guifile(); else ……………………………………………… } Lớp myTree Lớp lớp mở rộng (extends) lớp JTree, có implements thêm lớp Serializable để đối tượng truyền qua mạng Lớp sử dụng phương thức void guiJTree() lớp Service_Client client yêu cầu server tạo cấu trúc thư mục hành gửi sang cho Client Lớp myVector Lớp lớp mở rộng (extends) lớp Vector, có implements thêm lớp Serializable để đối tượng truyền qua mạng Lớp dùng để chứa danh sách FILE thư mực hành Server để gửi qua Client phục vụ cho việc trình bày Lớp sử dụng phương thức void guiJTable() lớp Service_Client 10 Lớp Tree_server Lớp dùng để tạo cấu trúc thư mục bên Server Được sử dụng phương thức void guiJTree() lớp Service_Client Mỗi file/thư mục tương ứng với nút Để tạo nút cây, ta dùng Vector: list_file list_node đóng vai trò ngăn xếp để quản lý file nút Thư mục hành (FTPRoot) gốc Trong trình tạo cây, ta vừa phải xếp nút theo thứ tự alphabel vừa phải xếp theo loại (các nút thư mục tạo trước, nút file tạo sau) VII Cách sử dụng chương trình Yêu cầu hệ thống phải cài đặt JDK1.4 có hỗ trợ giao thức TCP/IP Chương trình bao gồm có hai phần, phần chạy bên phía máy khách, bên máy chủ Phần máy khách bao gồm lớp sau: • Client.class • myCellRenderer.class • dataResume.class • myTree.class • information.class • myVector.class 16 • packageData.class • Vector_server.class • Tree_server.class • Images (thư mục hình ảnh) Phần máy chủ bao gồm lớp sau: • Server.class • myTree.class • Service_Client.class • myVector.class • dataResume.class • packageData.class • information.class • Tree_server.class - Server: - Khởi động: java Server [port] [FTPRoot] - Thoát: Ctrl + C Nếu tham số [port] vắng mặt cổng mặc định sử dụng 1905 Còn tham số [FTPRoot] vắng mặt thư mục mặc định Server thư mục hành Khởi động : java Client [host] [port] Nếu tham số [host] vắng mặt giá trị localhost sử dụng Nếu [port] vắng mặt cổng mặc định sử dụng 1905 - Client : Người dùng dùng chuột để chọn file di chuyển thư mục, sau chọn nút chức tương ứng theo nhu cầu VIII Các tính chương trình MyTinyFTP Chương trình MyTinyFTP gồm có chức sau: • Cho phép gửi/nhận một/nhiều file thư mục từ máy trạm đến máy chủ xa (thông qua mạng cục bộ) • Cho phép nhiều Client kết nối đến Server trình vận hành chương trình • Hỗ trợ chức resume trường hợp bị ngắt kết nối bất thường truyền file từ Client lên Server ngược lại • Với hai danh sách chọn file tương ứng với hai phía Client Server người dùng thao tác với nhiều file/thư mục nhiều nơi khác để tải Client chép lên Server 17 • Với chức Tree bên phía Server, người dùng dễ dàng hình dung tổng thể toàn cấu trúc file thư mục bên phía Server mà đuợc phép truy nhập, dễ dàng chọn file/thư mục từ • Cho phép thiết lập linh động thư mục gốc (FTPRoot) bên Server mà người dùng phép truy cập vào • Ngoài cho phép người dùng linh động với nhiều tuỳ chọn lúc khởi động chương trình IX.Giao thức cài đặt bước hoạt động chương trình Một hệ thống client/server phải cài đặt giao thức bên nó, với chương trình giao thức cài đặt TCP Với đặc tính giao thức hướng liên kết (connection-oriented), ổn định xác nên TCP thích hợp cho việc truyền tải file qua mạng, nhiên ưu điểm khiến cho tiêu tốn nhiều tài nguyên mạng Cơ chế làm việc chương trình từ tầng ứng dụng (nơi chương trình cài đặt làm việc), chương trình truyền gói tin chia nhỏ từ file, từ tầng mạng tiếp tục xử lý gói tin để chuyền qua mạng cho máy nhận Hoạt động chương trình sau: Server hoạt động lắng nghe cổng mặc định (hoặc người dùng quy định), để Client kết nối với Server cần phải cung cấp cho Client biết tên máy chủ cổng mà máy chủ làm việc Khi Server khởi động, tạo file LOG (nếu chưa có) để ghi lại lỗi xảy trình làm việc Sau server chạy vào vòng lặp vô tận chờ Client gửi yêu cầu (hợp lệ) lên Trong chương trình, yêu cầu sau yêu cầu hợp lệ: Yêu cầu Ý nghĩa Send Nhận file từ Client gửi lên Get Load file từ server máy Client Ngat Ngắt kết nối Chuyenthumuc chuyển thư mục hành Yeucauresume Yêu cầu resume trường hợp upload Yeucauloadtiep Yêu cầu resume trường hợp download 18 layJTree_JTable Cập nhật khung duyệt layJTree Cập nhật layJTable Cập nhật khung duyệt Khi Client kết nối thành công với Server, trước tiên gửi yêu cầu layJTree_JTable đến Server lấy danh sách file FTPRoot để hiển thị lên giao diện bên Client Sau Client tạo file LOG bên Client chưa tồn tại, có file Log Client kiểm tra xem có cần Resume không (xét hai trường hợp upload download) cách kiểm tra file log Nếu lần kết nối trước đó, chương trình bị ngắt kết nối bất thường truyền chưa xong file chương trình hỏi người dùng xem có muốn tiếp tục truyền hoàn thành file không; câu trả lời nhận có chương trình tiến hành Resume Quá trình truyền file diễn sau: chương trình lấy thông tin file cần truyền, sau tình toán số lượng kích thước gói chia nhỏ để truyền qua mạng Tên file với thông tin phụ gửi trước, bên nhận kiểm tra tồn file chuyển có có thư mục hay không Sau trình kiểm tra xác nhận người dùng (nếu cần thiết), chương trình tiến hành gửi gói liệu Trong trình nhận gói tin, có lỗi xảy ra, file đóng lại thông tin lần truyền file bị lỗi lưu vào file log để phục vụ cho trình resume lần kết nối sau Tất lỗi thông báo chương trình trình vận hành hiển thị khung Status Riêng lỗi lúc khởi động hiển thị hình Console X Các khó khăn kỹ thuật giải Trong qua trình cài đặt chương trình, vấn đề khó khăn lên nhận biết ranh giới gói tin thông điệp luồng nhập luồng xuất Và tiến hành truyền nhiều file truyền thư mục (không rỗng) vấn đề biết ranh giới liệu file với luồng Với cách làm thông thường xử lý byte việc đòi hỏi cần phải có kiểm soát luồng chặt chẽ (chặt chẽ đền byte một) đảm bảo cho chương trình vận hành ổn định Một giải pháp khác ta không tiến hành gửi/nhận byte mà ta gửi/nhận đối tượng Như tất thông tin muốn gửi qua mạng ta cần “đóng gói” chúng vào đối tượng chuyển chúng vào luồng Ở đầu bên luồng, ta lại đọc nguyên đối tượng với đầy đủ liệu phương thức xây dựng sẵn đối tượng đó, thuận tiện cho việc thao tác liệu Hơn “gói” (đối tượng) chứa nhiều loại lẫn số lượng 19 liệu nên ta gộp nhiều thông tin vào gói gửi lần, dễ dàng việc kiểm soát luồng Để truyền đối tượng qua mạng đối tượng phải cài đặt (implements) giao diện Serializable Các đối tượng loại chương trình gồm có: • packageData : gói chứa liệu chia nhỏ từ file số thông tin liên quan • Information : gói chứa thông tin file truyền • myTree : gói tạo • Tree_server : gói phục vụ trình tạo • myVector : gói chứa danh sách file bên Server gửi qua cho Client • dataResume : gói phục vụ cho trình resume Một khó khăn việc hiển thị danh sách file Server máy Client Vì việc sử dụng đối tượng JFileChooser trở nên phức tạp trường hợp này, nên việc lựa chọn đối tượng sử dụng hình thức thể gặp nhiều khó khăn, vướng mắc Mỗi thành phần (component) có ưu nhược điểm riêng việc thể danh sách file Server Giải pháp đưa tích hợp nhiều thành phần phép người sử dụng tuỳ chọn trình sử dụng Trong chương trình hai thành phần sử dụng là: JTree JList Để load icon JList, đối tượng JList phải setCellRenderer với đối số phương thức đối tượng kiểu CellRenderer (và cụ thể chương trình lớp myCellRenderer kế thừa từ lớp ListCellRenderer) Việc lựa chọn loại luồng (nhập/xuất), phương thức đọc/ghi gặp nhiều vấn đề Bởi sử dụng không liệu sau chuyển qua mạng bị hỏng cấu trúc, không sử dụng Vấn đề giải kinh nghiệm thử nghiệm luồng phương thức để kiểm tra XI.Cài đặt lớp phương thức chương trình Chương trình bao gồm 11 lớp với chức lớp tóm tắt bảng sau: Tên lớp Chức Client lớp bên phía máy khách, thực chức truyền tải file hiển thị giao diện Server lớp thực thi bên phía máy chủ, có chức tạo luồng cho Client nối vào 20 Service_Client lớp bên phía máy chủ, thực chức truyền tải file packageData gói chứa thông tin liệu (được chia nhỏ từ file) để truyền qua mạng dataResume gói chứa thông tin file cần resume information chứa thông tin file truyền qua mạng myCellRenderer lớp phục vụ cho việc thị icon đối tượng JList myTree lớp phục vụ cho việc truyền đối tượng JTree qua mạng myVector lớp phục vụ cho việc truyền đối tượng Vector qua mạng Tree_server lớp dùng để tạo đối tượng JTree Vector_server lớp phục vụ cho việc trình bày file thư mục Server bên Client (sắp xếp trình bày theo loại) 11 Lớp information Lớp dùng để chứa thông tin file/thư mục chuẩn bị truyền qua mạng Do phải truyền qua mạng nên lớp phải implements lớp Serializable Lớp bao gồm có thuộc tính với phương thức set/get cho thuộc tính Ý nghĩa thuộc tính: • String ten :chứa tên file/thư mục chuẩn bị truyền qua • String loai :xác định thông tin gửi file thư mục • int soluong :xác định số lượng file/thư mục thư mục gửi qua (trong trường hợp đối tượng gửi qua thư mục) • String path :chứa vị trí đối tượng (file/thư mục) máy gửi (dùng cho chức Resume) Lớp dùng phương thức gửi/nhận file hai lớp Client Service_Client 12 Lớp packageData Lớp dùng để chứa liệu với thông tin liên quan để chuyển qua mạng Dữ liệu chứa gói liệu file “cắt” nhỏ để chuyển qua mạng Lớp bao gồm có thuộc tính với phương thức set/get cho thuộc tính Ý nghĩa thuộc tính: 21 • byte[] dulieu : mảng chứa liệu • int kichthuoc : kích thước thật mảng liệu • boolean goicuoi : xác định gói chuyển có phải gói cuối file hay không • int goiso : thứ tự gói chuyển Phương thức khởi tạo có đối số là: kích thước liệu tối đa mà gói chứa lần gửi Lớp dùng phương thức gửi file lớp Client Service_Client 13 Lớp dataResume Lớp dùng để chứa thông tin phục vụ cho việc Resume Khi client kết nối với server, có yêu cầu cần Resume thông tin Resume chuyển qua lại máy gói Lớp bao gồm có thuộc tính với phương thức get cho thuộc tính Phương thức khởi tạo lớp có đối số, giá trị khởi tạo cho thuộc tính Ý nghĩa thuộc tính: • String path : đường dẫn file máy gửi • int goiso : gói truyền bị lỗi, resume cần gửi gói trở 14 Lớp myCellRenderer Lớp lớp “chức năng” phục vụ cho việc load icon (để phân biệt đâu thư mục, đâu file) thành phần JList Lớp kế thừa (extends) lớp JLabel “thực thi” (implements) lớp ListCellRenderer, ta dùng hình ảnh (icon) lẫn văn để hiển thị ô JList ListCellRenderer giao diện đơn giản có phương thức: public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) Phương thức gọi đối tượng JList muốn hiển thị ô thành phần danh sách Ta quan tâm đến đối số thứ để xác định ô thể file hay thư mục để load icon tương ứng File f = (File)value; if(f.isDirectory()) setIcon(new ImageIcon("images"+File.separator+"folder_icon.gif")); else setIcon(new ImageIcon("images"+File.separator+"file_icon.gif")); 22 Sau có lớp rồi, để JList load icon, ta cần gọi phương thức: setCellRenderer với đối số phương thức instance lớp myCellRenderer: JList_File_Server.setCellRenderer(new myCellRenderer()); 15 Lớp Server Lớp lớp thực thi bên phía Server, đối số nhận vào từ dòng lệnh (nếu có) quy định việc khởi động Server hoạt động Nếu tham số nhập vào sai, không nhập vào thông số mặc định sử dụng, làm việc cổng 1905 thư mục làm việc (FTPRoot) thư mục hành Khi Server chạy, vào vòng lặp vô tận để đáp ứng nhiều Client kết nối vào Khi có client kết nối vào, instance lớp Service_Client tạo để thực “giao dịch” while (true){ try{ Socket s = ss.accept(); new Service_Client(s,FTPRoot); }catch (Exception e2) {} } 16 Lớp Client Lớp lớp thực thi bên phía Client, thực hầu hết chức truyền tải file hiển thị giao diện a Phương thức khởi tạo: Client(String host, int port) Nếu đối số truyền xác chương trình sau hiển giao diện kết nối với Server luôn, ngược lại hiển thị giao diện Trong trường hợp kết nối chương trình kiểm tra xem có cần resume không cách gọi phương thức kiểm tra là: this.kiemtraResume_Client(); kiểm tra resume theo chiều Client - Server this.resume(); kiểm tra resume theo chiều Server – Client b Phương thức void showgui() Dùng để hiển thị giao diện chương trình 23 c Phương thức void setGui(boolean ok) Dùng để thiết lập trạng thái (kích hoạt không kích hoạt) cho JButton JTextField trường hợp hoạt động cụ thể chương trình d Phương thức boolean connection(String host, int port) Phương thức dừng để kết nối Client với Server địa host cổng port Sau kết nối thành công, thiết lập luồng nhập xuất để gửi thông tin: s = new Socket(host,port); out = new ObjectOutputStream(s.getOutputStream()); in = new ObjectInputStream(s.getInputStream()); e Phương thức void disconnect() Phương thức dùng để ngắt kết nối Client Server, gửi yêu cầu ngắt kết nối sang Server, sau tiến hành đóng luồng nhập xuất đóng kết nối Và thiết lập lại giao diện cho thích hợp: try{ out.writeObject("ngat"); in.close(); out.close(); s.close(); }catch (Exception e){} // **** thiết lập lại giao diện **** ……………………… f Phương thức boolean send(File filename) Phương thức dùng để gửi file/thư mục qua Server Đầu tiên gói information chứa thông tin đối tượng gửi qua Server trước, bao gồm tên, đường dẫn, loại (“dir” thư mục “file” tập tin) Server kiểm tra tồn đối tượng máy chủ gửi yêu cầu xác nhận (“datontai” “ok”) Nếu đối tượng tồn ConfirmDialog để người dùng trả lời có ghi đè không Xét trường hợp có ghi đè đối tượng chưa tồn server: + Nếu thư mục: gọi tiếp phương thức gửi thư mục sendDir(filename) để gửi toàn nội dung bên (nếu có) thư mục sang Server 24 + Nếu file: tiến hành gửi liệu qua Đầu tiên tính toán xem gói chuyển qua Sau dùng vòng lặp để chuyển gói đi, gói chứa liệu số thứ tự gói (số thứ tự dùng việc resume lần kết nối sau trường hợp bị lỗi lúc gửi file) Riêng gói cuối thuộc tính goicuoi thiết lập true để báo cho server biết truyền hết file int i=0; for (i=0;i Server) không? Phương thức gọi sau Client kết nối với Server (trong phương thức khởi tạo xử lý kiện nút Connect) Đầu tiên client gửi thông điệp “yeucauresume” sang server Server kiểm tra file log bên server có dòng có IP_Client trùng với IP_Client vừa kết nối vào chưa xử lý (không có [ok] cuối dòng) hay không Nếu có server gửi thông điệp “canresume” gói dataResume chứa thông tin resume cho client Client lấy tên đường dẫn với số thứ tự gói bị lỗi (giả sử n) từ gói dataResume này, sau mở file tương ứng, đọc bỏ qua n-1 gói đầu tiên, gửi qua Server từ gói thứ n Bên server tương ứng đón gói ghi tiếp tục vào file đích 17 Lớp Service_Client Đây lớp bên phía Server, thực chức truyền tải file bên server với số chức khác Lớp Service_Client có phương 27 thức: void nhan(String pathCurrentDir), boolean send(File filename), void kiemtraResume(), void resume_Client(), void sendDir(File f) có chức cài đặt tương tự phương thức tên bên client Phương thức khởi tạo lớp nhận đối số, Socket s dùng để tạo luồng nhập/xuất dể trao đổi thông tin, hai FTPRoot quy định thư mục làm việc hành chương trình (tức thư mục người dùng upload download file) Sau tạo luồng thiết lập thư mục việc xong, chương trình tạo file log bên Server (nếu cần) gọi phương thức run() lệnh start(): this.socket = s; in = new ObjectInputStream(s.getInputStream()); out = new ObjectOutputStream(s.getOutputStream()); IP_Client = s.getInetAddress().getHostAddress(); FTPRoot = ftproot; currentDir = (new File(FTPRoot)).getPath(); if (!log_file.exists()){ if (log_file.createNewFile()) //tao file log System.out.println("Tao log file cong!"); else{ logfile_exist = false; System.out.println("Khong the tao log file!"); } } start(); Phương thức run() vòng lặp vô tận lắng nghe yêu cầu từ bên Client gửi qua Tuỳ yêu cầu mà Server gọi phương thức tương ứng while (true) { String yeucau = (String)in.readObject(); if (yeucau.equalsIgnoreCase("send")) this.nhan(currentDir); else if (yeucau.equalsIgnoreCase("get")) 28 this.guifile(); else ……………………………………………… } 18 Lớp myTree Lớp lớp mở rộng (extends) lớp JTree, có implements thêm lớp Serializable để đối tượng truyền qua mạng Lớp sử dụng phương thức void guiJTree() lớp Service_Client client yêu cầu server tạo cấu trúc thư mục hành gửi sang cho Client 19 Lớp myVector Lớp lớp mở rộng (extends) lớp Vector, có implements thêm lớp Serializable để đối tượng truyền qua mạng Lớp dùng để chứa danh sách FILE thư mực hành Server để gửi qua Client phục vụ cho việc trình bày Lớp sử dụng phương thức void guiJTable() lớp Service_Client 20 Lớp Tree_server Lớp dùng để tạo cấu trúc thư mục bên Server Được sử dụng phương thức void guiJTree() lớp Service_Client Mỗi file/thư mục tương ứng với nút Để tạo nút cây, ta dùng Vector: list_file list_node đóng vai trò ngăn xếp để quản lý file nút Thư mục hành (FTPRoot) gốc Trong trình tạo cây, ta vừa phải xếp nút theo thứ tự alphabel vừa phải xếp theo loại (các nút thư mục tạo trước, nút file tạo sau) XII Cách sử dụng chương trình Yêu cầu hệ thống phải cài đặt JDK1.4 có hỗ trợ giao thức TCP/IP Chương trình bao gồm có hai phần, phần chạy bên phía máy khách, bên máy chủ Phần máy khách bao gồm lớp sau: • Client.class • myCellRenderer.class • dataResume.class • myTree.class • information.class • myVector.class 29 • packageData.class • Vector_server.class • Tree_server.class • Images (thư mục hình ảnh) Phần máy chủ bao gồm lớp sau: • Server.class • myTree.class • Service_Client.class • myVector.class • dataResume.class • packageData.class • information.class • Tree_server.class Server: - Khởi động: java Server [port] [FTPRoot] - Thoát: Ctrl + C Nếu tham số [port] vắng mặt cổng mặc định sử dụng 1905 Còn tham số [FTPRoot] vắng mặt thư mục mặc định Server thư mục hành Client : - Khởi động : java Client [host] [port] Nếu tham số [host] vắng mặt giá trị localhost sử dụng Nếu [port] vắng mặt cổng mặc định sử dụng 1905 - Người dùng dùng chuột để chọn file di chuyển thư mục, sau chọn nút chức tương ứng theo nhu cầu 30 ... kết thúc môn học Thực hành nâng cao” này, nhóm viết ứng dụng client/ server nhỏ mô chương trình FTP với số chức đơn giản: MyTinyFTP Chương trình cài đặt ngôn ngữ Java II Giao diện chương trình Chương... chương trình Chương trình chưa kết nối với Server có giao diện Vì chưa kết nối với Server nên bên phía cửa số Client file máy cục Khi client kêt nối với server, cửa sổ bên server hiển thị danh... chương trình sau: Server hoạt động lắng nghe cổng mặc định (hoặc người dùng quy định), để Client kết nối với Server cần phải cung cấp cho Client biết tên máy chủ cổng mà máy chủ làm việc Khi Server