Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 64 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
64
Dung lượng
1,39 MB
Nội dung
Xây dựng ứng dụng dựa mạng ngang hàng MỞ ĐẦU Tốc độ phát triển công nghệ mang đến cho người dùng cuối ứng dụng, tiện ích miễn phí chất lượng Nhưng dù cơng nghệ thay đổi, biến chuyển nào, nhu cầu chia sẻ liệu cần thiết tất người Con người sử dụng mạng Internet để tìm kiếm thơng tin, thơng tin có nhiều định dạng Trong thời gian gần đây, chia sẻ file ngang hàng lên lĩnh vực ứng dụng chiếm tỉ lệ sử dụng băng thông lớn mạng Internet Bắt đầu từ tượng Napster vào cuối năm 90, phổ biến chương trình chia sẻ file ngang hàng Gnutella, Freenet, Kazzaa tạo nên xu hướng phát triển mạnh mẽ việc chia sẻ nội dung cộng đồng người dùng Internet Hệ thống mạng ngang hàng ứng dụng chia sẻ file ngang hàng trở thành đề tài thu hút nhiều quan tâm, nghiên cứu nhà khoa học Các hệ thống chia sẻ file ngang hàng ngày phổ dụng nhờ lợi điểm rõ rệt so với hình thức chia sẻ file Web theo kiến trúc client server Tuy nhiên, ứng dụng chia sẻ file ngang hàng phổ biến Internet hạn chế lớn Chúng cho phép người dùng tìm kiếm file theo tên hay gọi chung định danh chưa có chức truy xuất theo nội dung Mục đích khóa luận tốt nghiệp khai thác thành tựu công nghệ truy xuất thông tin để xây dựng ứng dụng chia sẻ file ngang hàng có chức tìm kiếm theo nội dung Hệ thống xây dựng theo mơ hình mạng ngang hàng lai ghép, kết hợp phương thức trao đổi trực tiếp không thông qua trung gian với giải pháp sử dụng máy chủ tìm kiếm Chiến lược quản lý tập trung dựa máy chủ tìm kiếm giúp khắc phục khó khăn việc tìm kiếm thơng tin phân tán Máy chủ tìm kiếm khơng chứa nội dung file Nó cho biết ứng với từ khóa cho trước có file chúng Trang -1- LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Xây dựng ứng dụng dựa mạng ngang hàng nằm đâu số điểm nút tham gia vào hệ thống Chương trình phát triển ngơn ngữ lập trình Java với tính tìm kiếm theo nội dung phát triển dựa thư viện mã nguồn mở Lucene Luận văn xây dựng ứng dụng dựa mạng ngang hàng Luận văn chia thành chương • Chương 1: Tổng quan mạng chia sẻ file ngang hàng • Chương 2: Mô tả số phương pháp, kỹ thuật tạo mục cho tài liệu tìm kiếm dựa mục • Chương 3: Giải pháp xây dựng ứng dụng • Chương 4: Cài đặt chương trình • Chương 5: Kết thực chương trình Mặc dù cố gắng với động viên giúp đỡ tận tình thầy giáo hướng dẫn xong trình độ hạn chế, nội dung đề tài phức tạp, phạm vi đề tài rộng nên khó tránh khỏi sai sót q trình làm đố án Em mong dẫn thầy cô góp ý bạn để chương trình em hoàn thiện Cuối em xin chân thành cảm ơn động viên giúp đỡ nhiệt tình thầy hướng dẫn: TS Phạm Hồng Thái CN Lương Việt Nguyên giúp đỡ em hoàn thành đề tài Hải Phòng, Tháng năm 2007 Sinh viên: Nguyễn Thị Hoa Trang -2- LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Xây dựng ứng dụng dựa mạng ngang hàng Chương 1: TỔNG QUAN VỀ MẠNG CHIA SẺ FILE NGANG HÀNG 1.1 Giới thiệu mạng ngang hàng (peer to peer – P2P) 1.1.1 Khái niệm Mạng ngang hàng vấn đề hoàn toàn Các máy chủ dịch vụ thư điện tử (Mail servers) máy chủ phân giải tên miền (Domain Name Servers) kết nối với tạo mạng ngang hàng Ví dụ máy chủ thư điện tử thực tương tác trực tiếp với Chúng gửi, nhận chuyển tiếp email cho Tuy dịch vụ thư điện tử hay DNS xuất từ lâu Internet khái niệm mạng ngang hàng hay tính tốn ngang hàng (P2P – Peer-to-Peer) đưa gần Mạng ngang hàng hệ phân tán với đặc thù không tồn cấu điều khiển tập trung tổ chức có phân cấp [16] Trong hệ thống túy ngang hàng, chương trình chạy điểm nút có vai trị hồn tồn tương đương bình đẳng với Tính chất đối lập hồn tồn với kiến trúc client – server truyền thống nơi có điểm nút đóng vai trị cung cấp dịch vụ (servers) điểm nút lại sử dụng dịch vụ (clients) Lợi điểm rõ rệt kiến trúc ngang hàng khả tận dụng tốt tài nguyên (xử lý, băng thông, lưu trữ) tồn mạng Bên cạnh đó, kiến trúc giúp cho dịch vụ mạng tránh khỏi tình trạng ngừng trệ server gặp phải trục trặc Tuy nhiên mơ hình tồn nhược điểm khó kiểm sốt trạng thái, hành vi điểm nút tồn mạng Ngồi địi hỏi máy tham gia vào mạng ngang hàng phải có lực xử lý băng thông gần tương đương Không giống kiến trúc client – server, hiệu suất hoạt động chung mạng ngang hàng có xu hướng tăng lên gia tăng số điểm nút tham gia Hiệu suất phụ thuộc vào ứng dụng mạng cụ thể, vào giao thức ngang hàng cấu hình mạng (topology) 1.1.2 Đặc điểm mạng ngang hàng Các mạng ngang hàng ngày thường mang số đặc trưng phổ biến Trang -3- LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Xây dựng ứng dụng dựa mạng ngang hàng sau: Z Các điểm nút mạng nhận biết lẫn Nghĩa có chế giúp cho điểm nút tham gia vào mạng xác định máy khác thành viên mạng Từ chúng định vị nhau, gửi thông điệp tới nhận thông điệp từ Z Các điểm nút tạo mạng kết nối ảo mức trừu tượng cao so với cấu tổ chức như: tường lửa (firewall), NAT (Network Address Translation), mạng (subnet) Mỗi điểm nút nằm mạng khác nhau, chịu chế tổ chức, kiểm sốt giới hạn hồn tồn riêng biệt Tuy nhiên tham gia vào mạng, chúng tổ chức mối liên kết logic với thông qua việc sử dụng dịch vụ chạy ứng dụng tầng cao so với chế vừa nhắc tới Tạo mạng kết nối logic điểm nút bị biệt lập hóa mạng riêng biệt ý tưởng xuyên suốt kiến trúc ngang hàng Z Mỗi điểm nút tự vừa đóng vai trị client vừa đóng vai trị server Điều thể rõ vai trị bình đẳng độc lập điểm nút Mọi điểm nút vừa cung cấp dịch vụ cho điểm nút khác vừa sử dụng dịch vụ hay nhiều điểm nút cịn lại Z Xuất số nhóm điểm nút liên kết với để chia sẻ liệu cộng tác với xử lý Đây tổ hợp lại điểm nút có mối liên hệ chặt chẽ mang tính tương tác gần gũi trình hoạt động ứng dụng mạng 1.1.3 Tiện ích mạng P2P mang lại Giúp cho người dùng dễ dàng tìm liệu cần thiết Tận dụng tiện ích tổng hợp: Nơi lưu trữ, thơng tin chi phí tính tốn phân phối PEER, làm máy tính tham gia vào mạng dễ dàng có thơng tin u cầu Tăng độ tin cậy Chứa đựng nhiều thông tin: Trong mạng P2P có nhiều máy tính tham vào, thân máy tính chứa nhiều thơng tin, cơng cụ tìm kiếm nắm bắt khoảng 20% nội dung Website Trang -4- LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Xây dựng ứng dụng dựa mạng ngang hàng 1.1.4 Những khó khăn thiết kế mạng ngang hàng Z Cân đối băng thông: Trong phần lớn ứng dụng chạy mạng ngang hàng, điểm nút đóng hai vai trị: client server nên tỉ lệ sử dụng băng thông đầu (outbound bandwidth) băng thông đầu vào (inbound bandwidth) điểm nút tương đối cân Tuy nhiên nhà cung cấp dịch vụ mạng (ISPs) lại thường triển khai mạng khơng đối xứng dành ưu tiên cho phần băng thơng đầu vào Ví dụ số ISP mạng DSL hỗ trợ 1.5Mbps băng thơng đầu vào có 128Kbps cho băng thông đầu Cho dù băng thông tổng cộng kết nối vật lý có mở rộng hạ tầng kỹ thuật ISP chủ yếu hỗ trợ chế bất đối xứng Giải pháp triệt vấn đề đến từ cộng tác ISP khách hàng việc triển khai thiết bị mạng chuyên dụng Z Tổ chức không gian tên: Việc đặt tên cho website thực thông qua hệ thống phân cấp dịch vụ phân giải tên miền (DNS) Tuy nhiên mạng ngang hàng không tồn chế tương tự Không máy chủ dịch vụ web, điểm nút mạng ngang hàng không tồn trạng thái tĩnh Thời điểm khoảng thời gian tham gia vào mạng điểm nút ko thể xác định Công việc tạo tên (định danh) cho đối tượng, thành phần mạng phải thực người phát triển ứng dụng phụ thuộc vào đặc thù ứng dụng Z Chứng thực kiểm tra quyền truy cập người dùng: Nếu tất file đặt server dễ dàng việc chứng thực người dùng kiểm tra quyền hạn truy cập họ liệu Tuy nhiên tính chất phân tán mạng ngang hàng, công việc phải thực điểm nút Người phát triển muốn xây dựng ứng dụng ngang hàng hoàn chỉnh cần quan tâm nhiều đến vấn đề bảo mật, chống hành động xâm nhập trái phép làm ảnh hưởng tới liệu Z Kiểm soát hành vi người dùng: Do lưu trữ tập trung thông tin hành động điểm nút nên khó kiểm sốt hành động Lấy ví dụ mạng chia sẻ file ngang hàng, người dùng thực hành vi khơng thực phù hợp sau: e Không chia sẻ file máy Trang -5- LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Xây dựng ứng dụng dựa mạng ngang hàng e Chia sẻ file bị lỗi e Chia sẻ file chứa mã nguy hiểm, virus e Chia sẻ file mà nội dung chắn khơng quan tâm e Không cho phép điểm nút khác tải file chia sẻ máy Nếu tất điểm nút tham gia thực hành vi tiêu cực hoạt động mạng ngang hàng thực không hiệu an toàn Tùy thuộc vào ứng dụng cụ thể, người thiết kế phát triển phải thiết lập chế kiểm soát hành vi điểm nút để bảo đảm chúng thực có đóng góp tích cực cho cộng đồng sử dụng mạng 1.1.5 Phân loại ứng dụng mạng ngang hàng Các ứng dụng mạng ngang hàng phân chia thành số nhóm sau: Z Chia sẻ file: Gnutella, FastTrack, Napster Z Chia sẻ tài nguyên phân tán: SETI@Home, Avaki, Entropia dự án tính tốn lưới Z Phân phối nội dung: OpenCola, Blue Falcon Networks, Konitiki Z Truyền thông P2P: AOL Instant Messenger, Yahoo! Messenger, ICQ, Jabber Z Các ứng dụng cộng tác: Hive, Groove, myJXTA 1.2 Mơ hình mạng P2P 1.2.1 Mơ hình tập trung Mô tả: Mạng tập trung bao gồm Server trung tâm xung quanh Server máy Clients Có mơ hình mạng tập trung: Single Centralized: Trong mơ hình máy Client kết nối trực tiếp với Server Trong mơ hình tất Client bình đẳng nhau, Client giao tiếp với thông qua Server trung tâm Trang -6- LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Xây dựng ứng dụng dựa mạng ngang hàng Hình 1: Mơ hình mạng tập trung Cơ chế hoạt động mơ hình mạng Single Centralized: Mỗi Client mạng u cầu file u cầu gửi đến Server, Server nhận yêu cầu xử lý yêu cầu, database Server có thơng tin file đó, thơng báo cho Client, sau bên có bên xin để bắt đầu q trình download Ưu điểm mơ hình Single Centralized: Khả xử lý thơng tin nhanh chóng, đáng tin cậy, thời gian tìm kiếm thơng tin nhanh chóng xác Nhược điểm: Có thể có q nhiều yêu cầu Client đồng loạt gửi đến Server gây nên tình trạng tải Server, khiến cho tốc độ hoạt động trung bình hệ thống bị giảm sút Hơn Server trung tâm bị hỏng tồn hệ thống ngừng hoạt động Multiple Mini Centralized: Bao gồm nhiều Server kết nối với nhau, Server kết nối với nhiều Client Một Client kết nối với Server, Server kết nối với nhiều Client Các Server trao đổi thơng điệp với Trang -7- LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Xây dựng ứng dụng dựa mạng ngang hàng Hình 2: Mơ hình mạng Multiple Mini – Centralized Cơ chế hoạt động mơ hình mạng Multiple Mini – Centralized: Khi Client yêu cầu file, gửi yêu cầu đến Server mà kết nối trực tiếp Nếu database mà có có thơng điệp gửi lại cho Client yêu cầu Client có file liệu để thiết lập download Trong trường hợp khơng có file đó, gửi thơng điệp đến Server hàng xóm để tiếp tục tìm kiếm Ưu điểm mơ hình mạng Multiple Mini – Centralized: Có nhiều Server khả xử lý thơng tin lớn, u cầu Client phân tán gửi đến Server khác làm giảm tải Server Hơn việc có nhiều Server mạng làm tăng hệ số an tồn cho hệ thống Server bị hỏng đảm bảo mạng hoạt động ổn định với Client không kết nối với Server 1.2.2 Mơ hình phân tán Mơ tả: Trong mạng P2P phân tán hồn tồn khơng có vai trò Server, thân Client lại đóng vai trị Server Hai mơ hình mạng phân tán: Trang -8- LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Xây dựng ứng dụng dựa mạng ngang hàng Phân tán hoàn toàn (Completely decentralized index): Mạng tạo Client, Client gửi yêu cầu thơng tin u cầu broadcast tới toàn Client mạng Ưu điểm mạng phân tán hồn tồn: Đây thực mơ hình gốc mạng P2P, yêu cầu gửi đến nhiều PEER tham gia khả tìm thấy thông tin yêu cầu lớn Nhược điểm: Do không xử lý tập trung nên thời gian chờ đợi PEER gửi yêu cầu lớn khả mát thông tin lớn Hình 3: Mơ hình mạng phân tán Phân tán khơng hồn tồn (Multiple semi decentralized index): Các Client đóng vai trị Server cần thiết - trở thành super PEER, Client khác gửi request đến super PEER để tìm thơng tin Ưu điểm: Tận dụng nguồn tài nguyên phần cứng lớn, tăng khả toàn hệ thống lên Khả PEER trở thành super PEER khơng giới hạn Nhược điểm: Việc phân chia “chức năng” PEER phức tạp Trang -9- LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Xây dựng ứng dụng dựa mạng ngang hàng Hình 4: Mơ hình mạng phân tán khơng hồn tồn 1.3 Ưu, nhược điểm P2P 1.3.1 Ưu điểm Máy tính lắp đặt bàn làm việc người dùng Người dùng tự quản lý công việc đề kế hoạch bảo mật riêng Tất người dùng chia sẻ tài nguyên theo cách thức tùy ý Những tài nguyên gồm có liệu thư mục dùng chung, máy in, card Fax, modem,… Mất mát liệu sơ ý không ảnh hưởng lớn đến hệ thống Cáp đơn giản, dễ thấy, dễ sử dụng để nối từ máy tính đến máy tính khác mạng Trong mơi trường P2P máy tính phải sử dụng tài ngun để hỗ trợ cho người dùng cục bộ, sử dụng tài nguyên bổ sung để hỗ trợ cho người dùng truy cập mạng từ xa Trang -10- LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Xây dựng ứng dụng dựa mạng ngang hàng } public synchronized void removePeer(String id) throws IOException { if(!indexed) return; IndexReader reader = IndexReader.open(INDEX_DIR); reader.deleteDocuments(new Term("sessionId", id.trim())); reader.close(); } public static void main(String[] args) { new Server().listen(); } } Lớp server.ServerThread class ServerThread extends Thread { private Server server; private Socket s; private String sessionId; private File tempDir; private DataInputStream fromPeer; private DataOutputStream toPeer; public ServerThread(Server server, Socket s, int id, ThreadGroup tg) throws IOException { super(tg, String.valueOf(id)); this.server = server; this.s = s; sessionId = String.valueOf(id); fromPeer = new DataInputStream(s.getInputStream()); toPeer = new DataOutputStream(s.getOutputStream()); // create a temporary index for the connected peer tempDir = new File("server\\temp\\" + sessionId); tempDir.mkdirs(); System.out.println("Peer " + sessionId + " connected"); } public void run() { try { toPeer.writeInt(Protocol.INIT); toPeer.writeUTF(sessionId); // Login sucessfully // return sessionId to peer toPeer.writeUTF(s.getInetAddress().getHostAddress()); Trang -50- LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Xây dựng ứng dụng dựa mạng ngang hàng boolean stop = false; while(!stop) { int request = fromPeer.readInt(); // One fragment of index is sent to server if(request == Protocol.SHARE || request == Protocol.SHARE_FINISH) shareDocument(request); if(request == Protocol.UNSHARE) unshareDocument(request); if(request == Protocol.DELETE) unshareDocument(request); if(request == Protocol.UPDATE || request == Protocol.UPDATE_FINISH) shareDocument(request); if(request == Protocol.SEARCH) search(); if(request == Protocol.LOG_OUT) { server.removePeer(sessionId); stop = true; } } } catch(IOException ioe) { ioe.printStackTrace(); } finally { finish(); } } private void search() throws IOException { String queryString = fromPeer.readUTF(); if(!server.indexed) { toPeer.writeInt(Protocol.RESULT); toPeer.writeInt(0); return; Trang -51- LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Xây dựng ứng dụng dựa mạng ngang hàng } Directory dir = FSDirectory.getDirectory(Server.INDEX_DIR, false); IndexSearcher searcher = new IndexSearcher(dir); // default searching field is "content" QueryParser parser StandardAnalyzer()); = new QueryParser("content", new queryString = "(" + queryString + ")" + " AND " + "-sessionId:" + sessionId; Query query; try { // parsing the user string to standard query query = parser.parse(queryString); } catch(ParseException pe) { toPeer.writeInt(Protocol.INVALID_QUERY); return; } Hits resultSet = searcher.search(query); int numResult = resultSet.length(); toPeer.writeInt(Protocol.RESULT); toPeer.writeInt(numResult); for(int i = 0; i < numResult; i ++) { Document doc = resultSet.doc(i); toPeer.writeUTF(doc.get("ip")); toPeer.writeUTF(doc.get("fullName")); toPeer.writeUTF(doc.get("path")); toPeer.writeUTF(doc.get("size")); toPeer.writeUTF(doc.get("modified")); } toPeer.flush(); dir.close(); searcher.close(); } private void shareDocument(int request) throws IOException { // name of component file String fileName = fromPeer.readUTF(); File file = new File(tempDir, fileName); DataOutputStream toFile = new DataOutputStream(new FileOutputStream(file)); byte[] byteArr = new byte[1024]; long size = fromPeer.readLong(); Trang -52- LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Xây dựng ứng dụng dựa mạng ngang hàng long remain = size; int interval; interval = (remain > 1024) ? 1024 : (int)remain; int amount; // write the received file to temporary directory while((amount = fromPeer.read(byteArr, 0, interval)) != -1) { toFile.write(byteArr, 0, amount); toFile.flush(); remain -= amount; if(remain 1024) ? 1024 : (int)remain; } toFile.close(); // if all files are received if (request == Protocol.SHARE_FINISH || request == Protocol.UPDATE_FINISH) { try { server.addDocument(tempDir); // update the Index } catch(IOException ioe) { ioe.printStackTrace(); if(request == Protocol.SHARE_FINISH) toPeer.writeInt(Protocol.SHARE_FAIL); else toPeer.writeInt(Protocol.UPDATE_FAIL); toPeer.flush(); return; } // delete all files in temporary directory File[] fileList = tempDir.listFiles(); for(int i = 0; i < fileList.length; i ++) fileList[i].delete(); if(request == Protocol.SHARE_FINISH) toPeer.writeInt(Protocol.SHARE_OK); else toPeer.writeInt(Protocol.UPDATE_OK); toPeer.flush(); } } Trang -53- LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Xây dựng ứng dụng dựa mạng ngang hàng private void unshareDocument(int request) throws IOException { String documentId = fromPeer.readUTF(); try { server.removeDocument(documentId); } catch(IOException ioe) { ioe.printStackTrace(); if(request == Protocol.UNSHARE) toPeer.writeInt(Protocol.UNSHARE_FAIL); else toPeer.writeInt(Protocol.UPDATE_FAIL); return; } if(request == Protocol.UNSHARE) toPeer.writeInt(Protocol.UNSHARE_OK); } private void finish() { try { File[] fileList = tempDir.listFiles(); for(int i = 0; i < fileList.length; i ++) fileList[i].delete(); tempDir.delete(); fromPeer.close(); toPeer.close(); s.close(); System.out.println("Peer " + sessionId + " disconnected"); } catch(IOException ioe) { ioe.printStackTrace(); } finally { if(this.currentThread().activeCount() == 1) server.stopServer(); // Notify here (used test only) } } } Lớp peer.ClientPeer public class ClientPeer { private int shareDocCount = 0; private Socket sock; private DataInputStream fromServer; private DataOutputStream toServer; private String sessionId; Trang -54- LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Xây dựng ứng dụng dựa mạng ngang hàng private boolean stop = false; private Indexer indexer; private Vector sharingDoc = new Vector(); private Vector unsharingDoc = new Vector(); private Vector updatingDoc = new Vector(); private FileServer fileServer; private SearchWindow searchWindow; private MainWindow mainWindow; SharedList sharedList = new SharedList(); ResultList resultList = new ResultList(); public ClientPeer() { try { sock = new Socket("localhost", 3000); fromServer = new DataInputStream(sock.getInputStream()); toServer = new DataOutputStream(sock.getOutputStream()); } catch(IOException ioe) { System.out.println("Cannot connect to indexing server"); ioe.printStackTrace(); return; } try { if(fromServer.readInt() == Protocol.INIT) sessionId = fromServer.readUTF(); System.out.println("Session Id: " + sessionId); String ip = fromServer.readUTF(); System.out.println("IP: " + ip); indexer = new Indexer(sessionId, ip); } catch(IOException ioe) { ioe.printStackTrace(); } mainWindow = new MainWindow(this, "Peer " + sessionId); searchWindow = new SearchWindow(this, "Search " + sessionId); mainWindow.setVisible(true); searchWindow.setVisible(false); System.out.println("Connected to server"); try { fileServer = new FileServer(this); fileServer.start(); } catch(IOException ioe) { Trang -55- LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Xây dựng ứng dụng dựa mạng ngang hàng ioe.printStackTrace(); return; } } public void run() { try { while(!stop) { SharedDocument doc; int response = fromServer.readInt(); if(response == Protocol.SHARE_OK) { sharedList.addDocument((SharedDocument) sharingDoc.remove(0)); mainWindow.repaint(); } if(response == Protocol.SHARE_FAIL) { doc = (SharedDocument)sharingDoc.remove(0); JOptionPane.showMessageDialog(mainWindow, doc.file.getName() + "cannot be shared", "Error", JOptionPane.ERROR_MESSAGE); } if(response == Protocol.UNSHARE_OK) { sharedList.removeDocument((SharedDocument) unsharingDoc.remove(0)); mainWindow.repaint(); } if(response == Protocol.UNSHARE_FAIL) { doc = (SharedDocument)unsharingDoc.remove(0); JOptionPane.showMessageDialog(mainWindow, doc.file.getName() + "cannot be unshared", "Error", JOptionPane.ERROR_MESSAGE); } if(response == Protocol.UPDATE_OK) { doc = (SharedDocument)updatingDoc.remove(0); SharedDocument newDoc = new SharedDocument( doc.file, doc.documentId); sharedList.updateDocument(doc, newDoc); mainWindow.repaint(); Trang -56- LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Xây dựng ứng dụng dựa mạng ngang hàng } if(response == Protocol.UPDATE_FAIL) { doc = (SharedDocument)updatingDoc.remove(0); JOptionPane.showMessageDialog(mainWindow, doc.file.getName() + "cannot be updated", "Error", JOptionPane.ERROR_MESSAGE); } if(response == Protocol.RESULT) fillResultList(); if(response == Protocol.INVALID_QUERY) JOptionPane.showMessageDialog(searchWindow, "Your query is invalid", "Error", JOptionPane.ERROR_MESSAGE); } } catch (Exception ioe) { // ioe.printStackTrace(); finish(); } finally { System.exit(0); } } private void fillResultList() throws IOException { int numResults = fromServer.readInt(); resultList.clear(); if(numResults