Công nghệ thông tin với sự tự do, sáng tạo và chia sẻ

Thread trong .NET hỗ trợ phương thức suspend và resume, tuy nhiên việc dùng hai phương thức này vào xử lý trong thực tế có thể dẫn đến một số bất cập. Ta không thể biết thread đang làm gì lúc nó dừng, nếu thread đang nắm một tài nguyên dùng chung nào đó đột ngột bị dừng, nó có thể khiến các thread khác gặp exception hoặc tệ hơn gây deadlock. Để dừng một thread cách tốt nhất là sử dụng biến dùng chung và thay đổi giá trị biến ấy từ bên ngoài. Khi thread thực hiện công việc nó sẽ định kỳ kiểm tra biến này và dừng khi đến đúng điểm định trước và gặp đúng giá trị thích hợp. Một trong những cách dừng cơ bản nhất là dùng một biến làm cờ và bên trong đoạn code mà thread thực thi, ta đặt tại vị trí thích hợp một vòng lặp, có tác dụng như một bẫy: while(pauseFlag== true) ;

pdf45 trang | Chia sẻ: lylyngoc | Lượt xem: 2341 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Công nghệ thông tin với sự tự do, sáng tạo và chia sẻ, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
iệp phần mềm có mức độ vận động sáng tạo và chuyển hóa nhanh đến nỗi những nền tảng pháp lý về sở hữu trí tuệ vốn trước nay được xem là để bảo vệ quyền lợi của nhà phát minh sáng chế lại trở thành rào cản cho sự tự do sáng tạo. Phần này sẽ điểm qua lịch sử của ngành công nghệ phần mềm và các xu hướng phát triển phần mềm hiện tại, các tranh cãi vẫn đang tiếp diễn liên quan đến sở hữu trí tuệ đối với phần mềm. Từ đó chúng ta có thể nhìn thấy một bức tranh muôn màu về việc áp dụng các nguyên lý sáng tạo vào ngành công nghiệp phần mềm cũng như làm sao thúc đẩy sự sáng tạo trong công nghệ thông tin. GVHD: Hoàng Văn Kiếm Trang 13/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học Mục cuối cùng của phần này sẽ mô tả lại quá trình xây dựng một phần mềm sơ khai, chỉ tận dụng các nguyên tắc sáng tạo mà không theo một lối mòn cho trước nào. I. Sự giải phóng của ngành phần mềm và bùng nổ sáng tạo trong công nghệ thông tin Từ thời kỳ của những cỗ máy tính siêu lớn những năm 50, đến giai đoạn bùng nổ máy tính cá nhân, và cho đến thời kỳ chớm nở của điện toán đám mây và máy tính bảng. Mục này điểm qua sơ lược lịch sử ngành công nghệ phần mềm với những sáng tạo và phát kiến đã ghi dấu vào lịch sử. a. Giai đoạn 1: Phần mềm là gắn liền với phần cứng Thập niên 60 của thế kỷ XX đánh dấu một bước thay đổi to lớn đối với ngành công nghiệp phần mềm. Trước thập niên 60 không ai nghĩ đến một ngành công nghiệp phần mềm, người ta xem phần mềm như là một phần gắn liền với phần cứng máy tính. Những cổ máy tính khổng lồ to bằng cả toà nhà được lập trình trước một số chức năng nhất định và thường được cho thuể sử dụng theo giờ. Do thời gian làm việc với máy hạn chế, rất ít kỹ sư có khả năng cũng như điều kiện nghiên cứu phát triển phần mềm trên máy, nhà sản xuất chỉ sản xuất những phần mềm cần thiết để máy hoạt động và không thu phí phần mềm cũng như không đầu tư phát triển phần mềm cho máy tính. Tuy nhiên sự thay đổi đột phá đầu tiên đến từ một tên tuổi không mấy xa lạ: công ty IBM. Năm 1964, như một ví dụ điển hình cho “nguyên tắc linh động” trong 40 nguyên tắc sáng tạo khoa học/kỹ thuật, IBM công bố sản phẩm System/360. Thay vì các sản phẩm máy tính trước đây chỉ được thiết kế tối ưu cho một số công việc nhất định, IBM tung ra một họ các máy tính với một thiết kế tương tự nhau, sử dụng chung phần mềm nhưng có nhiều kích thước và tốc độ xử lý tính toán khác nhau. Các công ty vừa và nhỏ có thể dễ dàng trang bị một máy tính cỡ nhỏ của hệ thống System/360 cùng các phần mềm cần thiết và khi công ty phát triển họ có thể chuyển sang sử dụng một máy tính lớn hơn mà vẫn đảm bảo tương thích. Sự linh động này đánh dấu một bước đột phá trong ngành công nghiệp máy tính. Giờ đây máy tính từ những cổ máy khổng lồ chỉ có thể cho thuê chứ ít ai mua nổi nay đã trở nên dễ dàng tiếp cận hơn. Sự thành công mày System/360 mang lại cho IBM lớn đến nỗi GVHD: Hoàng Văn Kiếm Trang 14/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học chính hãng đã thừa nhận đây là sản phẩm quan trọng nhất trong lịch sử công ty từ trước đến nay[9]. Đồng thời, System/360 cũng mở ra một kỷ nguyên mới cho ngành công nghiệp phần mềm khi giờ đây phần mềm có thể chạy trên nhiều máy tính khác nhau. Không chỉ sáng tạo đôt phá về mặt kỹ thuật, năm 1969, IBM tiếp tục đề xuất một đột phá mới trong mô hình kinh doanh áp dụng “nguyên tắc phân nhỏ” khi chia sản phẩm máy tính thành 3 phần riêng biệt bao gồm: Phần cứng, phần mềm và dịch vụ. Theo đó IBM sẽ tính phí riêng cho việc cung cấp phần cứng, phát triển phần mềm theo yêu cầu, tổ chức các khóa đào tạo sử dụng máy tính, dịch vụ hỗ trợ khách hàng khi có sự cố, v.v... Mô hình kinh doanh đột phá này chính thức khai sinh ngành công nghiệp phần mềm và dịch vụ, mở đường cho sự bùng nổ sáng tạo không ngừng của công nghệ thông tin. b. Giai đoạn 2: Định hình nền công nghiệp với sự trỗi dậy của máy tính cá nhân Khi mới khai sinh ngành công nghiệp phần mềm phát triển khá chậm chạp. Các hệ thống phần cứng máy tính bấy giờ vẫn còn có giá khá cao và phần mềm chỉ tương thích với một số phần cứng nhất định. Điều này dẫn đến việc thị trường phần mềm khá manh múng với lượng khách hàng tương đối ít và vẫn còn lệ thuộc khá nhiều vào phần cứng. Các công ty lớn vẫn xem phần mềm là một loại hình dịch vụ giá trị gia tăng cho phần cứng và chưa đầu tư đúng mức cho lĩnh vực này. Giai đoạn đầu của thập niên 70 cũng đánh dấu sự ra đời của hai nhân tố quan trọng là mạng Internet và đĩa mềm (floppy disk). Hai công cụ này cho phép phần mềm được chia sẻ và trao đổi cực kỳ dễ dàng giữa những người dùng máy tính tạo ra một kênh phân phối phần mềm độc lập không cần thông qua các công ty sản xuất phần cứng. Và đặc biệt hơn internet cho phép trao đổi giữa những người đam mê máy tính (hobbyist) - những lập trình viên, những kỹ sư phần mềm tương lai. Họ có thể tự mình phát triển phần mềm, chia sẻ phần mềm đó với cộng đồng người dùng trên internet và nhận được các phản hồi góp ý để cùng nhau tiến bộ. Đây chính là hạt giống ban đầu cho phong trào mã nguồn mở và các công ty sản xuất phần cứng hết sức vui vẻ chào đón các cộng đồng những người đam mê máy tính này. Trước hết vì họ là những khách hàng tiềm năng và luôn sẵn sàng đó nhận sản phẩm mới, hơn nữa sự phong phú về phần mềm do những lập trình viên ban sơ này GVHD: Hoàng Văn Kiếm Trang 15/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học viết ra sẽ thúc đẩy doanh số phần cứng. Tuy nhiên môi trường phát triển và chia sẻ phần mềm dựa theo đam mê này lại gây ảnh hưởng đến doanh thu của những công ty chỉ chuyên phát triển phần mềm. Công ty Microsoft thành lập năm 1975 với sản phẩm đầu tay là phần mềm Altair BASIC cho máy MITS. Tuy nhiên trong khi máy MITS được bán ra hành nghìn chiếc mỗi tháng thì trong suốt cả năm ròng phần mềm Altair BASIC chỉ bán được vài trăm phiên bản. Tháng 2 năm 1976, Bill Gate, viết một bức thư ngỏ cho tất cả người đam mê máy tính (Open letter to Hobbyist) được xuất bản trên nhiều tạp chí. Trong đó ông than phiền về việc có quá ít người dùng Altair BASIC thật sự trả tiền mua phần mềm này. Cho rằng việc sao chép phần mềm sẽ làm nản lòng những nhà lập trình viên muốn tham gia ngành công nghiệp phần mềm vừa chớm nở, ông lên án hành vi sao chép phần mềm là bất công và trộm cắp. Bức thư của Bill Gate nhận được nhiều sự phản ứng dữ dội nhưng cũng có nhiều người tán đồng quan điểm của Bill Gate. Trong những phát biểu và hướng đi tiếp theo của mình, ông đã áp dụng triệt để “nguyên tắc chuyển sang chiều khác”, thay vì xem phần mềm là một sản phẩm phụ trợ được bán theo phần cứng, ông xem phần mềm là một tác phẩm của lao động sáng tạo, được bảo hộ bởi quyền tác giả và tác giả phần mềm có quyền thu hoa hồng trên mỗi phiên bản copy phần mềm được phát hành. Cách tiếp cận này nhanh chóng thu hút được sự chú ý của nhiều công ty phần mềm khác và xu hướng phần mềm mã nguồn đóng dần được hình thành. Theo đó phần mềm sẽ được phân phối dưới dạng mã nhị phân, độc lập với phần cứng và người dùng sẽ mua một license trong đó thường quy định rõ họ không được phép xem lén mã nguồn, không được phân phát phần mềm cho người khác và chỉ được dùng trên một số lượng máy tính nhất định. Phương thức kinh doanh phần mềm này nhận được một sự thúc đẩy vượt bậc hơn nữa khi máy tính cá nhân của IBM ra đời. Một dòng máy tính đủ rẻ để cá nhân và gia đình có thể mua được mở ra một thì trường vô cùng to lớn cho các nhà phát triển phần mềm. Microsoft nhanh chóng nhảy vào thị trường cung cấp phần mềm cho máy tính cá nhân với hệ điều hành DOS và nhanh chóng xác lập được vị trí thống trị của mình trong ngành công nghiệp phần mềm còn non trẻ này. GVHD: Hoàng Văn Kiếm Trang 16/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học c. Sự trỗi dậy của phần mềm mã nguồn mở và câu chuyện Tái ông thất mã Cuối thập niên 70, thị trường phần mềm chuyển hướng sang mô hình kinh doanh mã nguồn đóng do Bill Gate khởi sướng tuy mang lại một luồng sinh khí mới cho công nghệ thông tin nhưng cũng để lại một số mặt trái: Những người đam mê tin học, những nhà tiên phong trong lĩnh vực công nghệ phần mềm cảm thấy họ bị đặt vào một tình thế bị phản bội. Họ đã góp phần thúc đẩy sự phát triển của ngành công nghiệp máy tính nhưng bây giờ họ bị cấm không được xem mã nguồn phần mềm. Những phần mềm trước đây họ phát tham gia phát triển bị các công ty lớn đem về chỉnh sửa cho hoàn thiện và bán với giá không thể mua được. Thậm chí một số công ty đăng ký bảo hộ phần mềm bằng hình thức “bằng sáng chế” patent có thể yêu cầu cấm việc phát triển và sử dụng những phần mềm cùng tính năng. Bức bối trước tình trạng lợi dụng luật sở hữu trí tuệ để bóp chẹt sáng tạo hòng độc quyền kinh doanh, Richard Stallman - cha đẻ của tổ chức Phần mềm tự do đã tương kế tựu kế - sử dụng nguyên tắc “Biến hại thành lợi”, dùng chính luật sở hữu trí tuệ để xây dựng một hành lang pháp lý cho trào lưu phần mềm nguồn mở. Giấy phép công cộng phổ quát (General Public License – GPL) ra đời với phương châm của phần mềm tự do. Theo đó bất kỳ người nào có một bảng copy của phần mềm cũng sẽ sở hữu ngay quyền được tự do sửa đổi, sao chép, phân phối lai phần mềm đó với duy nhất một điều kiện: Mọi sản phẩm được phát triển tiếp theo dựa trên phần mềm đó cũng sẽ phải mang giấp phép GPL. Hành lang pháp lý vững chắc của GPL cho phép hoạt động chia sẻ phần mềm từ một hành vi bị lên án nhầm là trộm cắp nay trở thành một hoạt động tự do dưới sự bảo vệ của luật pháp. Dưới sự bảo trợ này Stallman và tổ chức phần mềm tự do bắt tay vào việc xây dựng một loạt phần mềm tự do mang giấy phép GPL để thay thế cho các phần mềm thương mại hiện có đang chuyển dần sang mã nguồn đóng, từ hoạt động này mà hệ điều hành linux ra đời và dần dần phát triển thành một sản phẩm duy nhất khả dĩ cạnh tranh được với Microsoft windows về thị phần hệ điều hành cho máy tính cá nhân. Phong trào phần mềm tự do hay mã nguồn mở tiếp tục phát triển lên một tầm mức mới với sự kiện có liên quan đến sự ra đời của world wide web. Đầu thập niên 90, Microsoft phát hành trình duyệt Internet Explorer để cạnh tranh với trình duyệt Netscape Navigator của công ty Netscape Communication. Tuy là một trong những GVHD: Hoàng Văn Kiếm Trang 17/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học công ty tiên phong với sự ra đời của world wide web và chiếm đến 95% thị phần trình duyệt web, Netscape nhanh chóng bị Microsoft đẩy lùi bằng con át chủ bài: Windows. Sau khi Microsoft quyết định phát hành miễn phí Internet Explorer như một phần Windows vào năm 1995, thị phần của Internet Explorer nhanh chóng tăng lên 50% và dần dần đẩy Netscape Navigator vào chỗ nguy khốn. Đến năm 1997 sau khi Microsoft tăng cường việc tích hợp một số chuẩn lạ vào Internet Explorer khiến cho các trang web duyệt tốt trên Internet Explorer có thể không chạy được trên trình duyệt Netscape, 90% thị trường trình duyệt web đã rơi vào tay Internet Explorer,. Trước tình thế đó, công ty Netscape communication đã có một quyết định cực kỳ táo bạo: “Phát hành mã nguồn Netscpae Navigator dưới giấy phép mã nguồn mở”. Quyết định này về sau được giải thích nhằm tránh thế độc quyền về trình duyệt web của Microsoft, một khi Microsoft nắm độc quyền trình duyệt web, họ sẽ có khả năng thao túng quá trình phát triển của giao thức HTTP và chuẩn world wide web, từ đó làm bàn đạp xâm chiếm thị trường máy chủ web và độc quyền gần như toàn bộ internet. Việc mã nguồn mở Netscape Navigator cho phép các chuyên gia về tin học có thể tiếp tục tham gia phát triển trình duyệt này dưới sự bảo trợ của giấy phép GPL và không bị Microsoft lợi dụng. Sự kiện này mở ra một hướng đi mới cho mã nguồn mở, từ chỗ là kẻ thù của doanh nghiệp thì nay mã nguồn mở trở thành một lợi thế trong kinh doanh. Thay vì thu phí phần mềm thật cao doanh nghiệp sẽ tận dụng sự trợ giúp của các cộng đồng người sử dụng có đam mê và kinh nghiệm để phát triển phần mềm. Phần mềm đó được mã nguồn mở để tránh sự lợi dụng đánh cắp mã nguồn từ đối thủ. Với việc giảm được gánh nặng trong phát triển phần mềm, công ty có thể tập trung vào thu lợi từ cách dịch vụ kèm theo. II. Áp dụng các nguyên tắc sáng tạo trong xây dựng phần mềm a. Nhu cầu thực tế. Chia sẻ dữ liệu giữa các máy là một nhu cầu khá phổ biến trong thực tế làm việc với máy tính. Nếu như trong môi trường mạng cục bộ (LAN) việc chia sẻ dữ liệu diễn ra khá dễ dàng, thì trong môi trường internet, mọi việc lại không được suôn sẻ như thế. Về cơ bản, việc chia sẻ file giữa các máy đang kết nối chung trong một mạng là không khó. Tuy nhiên, do đặt cao tính bảo mật nên khả năng chia sẻ file tích hợp GVHD: Hoàng Văn Kiếm Trang 18/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học trong hệ thống thường bị chặn trong mội trường internet. Để chia sẻ file người dùng thường có một số lựa chọn: 1. Chép file vào thiết bị lưu trữ ngoài rồi chạy đến chỗ máy cần nhận file. Dễ thấy phương án này không khả thi nếu hai máy cách nhau quá xa về địa lý... 2. Biến máy mình thành một server chia sẻ file trên máy (vd FTP server) Phương án này đòi hỏi nhiều kiến thức chuyên môn về công nghệ thông tin. 3. Sử dụng tính năng send file có sẵn trong các chương trình chat (instant message). Phương án này phải lệ thuộc vào nhà cung cấp dịch vụ tin nhắn tức thời, khi dịch vụ có sự cố, tính năng send file cũng tiêu tùng theo. 4. Upload file cần chia sẻ lên một server chuyên lưu trữ file. Phương án này tốn thời gian do đòi hỏi file phải được tải lên hoàn chỉnh trước khi người nhận có thể tải về 5. Sử dụng chương trình chia sẻ file qua mạng ngang hàng. Đây là phương án rất khả thi, tuy nhiên các trình chia sẻ file qua mạng ngang hàng hiện nay tương đối khó sử dụng với người dùng cuối. b. Phân tích các giải pháp đã có và tìm ra vấn đề: Với nhu cầu không ngừng gia tăng mỗi ngày của con người thì các phương án đã nêu ở mục trước không trán khỏi những hạn chế nhất định. Áp dụng các phương pháp phát hiện vấn đề đã được học, ta có thể thấy còn rất nhiều vướng mắc cần giải quyết. Áp dụng nguyên tắc thứ 4, từ thực tiễn quan sát và sử dụng các phương án đã nêu nhiều năm nay, ta nhận thấy còn một số vướng mắc: 1. Có nhiều phương án bị lệ thuộc vào một nhà cung cấp dịch vụ thứ 3. Khi tập tin được tải lên một dịch vụ chia sẻ file hay truyền qua một ứng dụng chat nào đó thì cả bên truyền và bên nhận đều phải tiếp cận được dịch vụ này. Bất kỳ sự cố nào khi kết nối với nhà cung cấp dịch vụ cũng khiến việc truyền tải tập tin không thực hiện được, mặc dù người gửi và nhận vẫn có thể kết nối trực tiếp với nhau. 2. Có nhiều phương án quá chuyên sâu về kỹ thuật. Việc thiết lập một mạng ngang hàng hoặc một máy chủ là một mảng khá chuyên biệt trong GVHD: Hoàng Văn Kiếm Trang 19/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học công nghệ thông tin. Và các công cụ để thực hiện việc này không được thiết kế dành cho người dùng ít kinh nghiệm. Áp dụng nguyên tắc thứ 5, lắng nghe những phàn nàn từ người dùng chúng ta có thể thấy còn những điểm sau: 1. Nhiều phương án không chú trọng tính năng tạm dừng truyền tải file và tiếp tục truyền tải khi thuận tiện. A truyền cho B một file khá lớn, giữa chừng A có việc phải đi không thể tiếp tục truyền file, khi A quay lại việc truyền file phải bắt đầu lại từ đầu. Hoặc A và B đang truyền file thì mạng có sự cố, khi sự cố được khắc phục việc truyền file phải bắt đầu lại từ đầu. Người dùng rất khó chịu khi truyền những file lớn bằng các phương án bất ổn như vậy. 2. Nhiều phương án không chú trọng đến việc kiểm tra file đã truyền đi có nguyên vẹn hay không: A send cho B một file video khá lớn, B mở ra xem và thấy có vẻ bình thường. Tuy nhiên, khi xem đến gần cuối video thì phát hiện file bị lỗi và video không hiển thị được phần cuối. Lúc này A đã đi đâu đó và không thể truyền lại tập tin. Mặc dù kết nối internet ngày nay dùng giao thức TCP/IP có khả năng kiểm tra lỗi. Tuy nhiên, với những sự cố phát sinh không phải trong lúc truyền mà trong lúc lưu dữ liệu trên máy hay lúc ngắt rồi tiếp tục quá trình truyền thì giao thức TCP/IP không can thiệp được. 3. Có thể phương án kiểm tra được file truyền đi có lỗi hay không nhưng không có cách sửa lỗi: A truyền cho B một file nén, các chuẩn nén file hiện nay có tích hợp chức năng kiểm tra tính toàn vẹn, nếu file bị lỗi sẽ không giải nén được. Tuy nhiên dù file chỉ bị lỗi nhỏ nhưng B không có cách nào khác ngoài việc báo A truyền lại toàn bộ file. c. Xác định lại vấn đề. Để giải quyết các vướng mắc trên, em quyết định cố gắng tạo ra một chương trình nhỏ gọn, có khả năng send file qua mạng, nhưng hội tụ đầy đủ tính năng cần thiết. Các yêu cầu mà em đặt ra cho chương trình của mình là: 1. Gọn nhẹ, đơn giản, dễ sử dụng. Chương trình sẽ có dung lượng cỡ 1 MB, để thuận lợi trong việc chia sẻ vì trước khi chia sẻ file, người dùng phải GVHD: Hoàng Văn Kiếm Trang 20/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học chia sẻ chính bản thân của chương trình. 2. Có thể send một file cho nhiều người, những người đang nhận file có thể cùng send cho nhau. Ý tưởng từ giao thức truyền dữ liệu bittorrent, tính năng này giúp quá trình chia sẽ dữ liệu sẽ nhanh chóng hơn. Đặc biệt là khi có nhiều người cùng tham gia quá. 3. Có khả năng resume sau khi bị gián đoạn. Tính năng cơ bản nhưng hầu hết nhung chương trình send file thông dụnng thường “quên” đưa vào. Nhờ tính năgn này, công việc chia sẽ trở nên thuận tiện và ngươi dùng có thể chủ động hơn về thời gian, nhất là với file có kích thước lớn 4. Có khả năng kiểm tra tính toàn vẹn của file sau khi send, những phần send sai sẽ bị phát hiện và send lại, không nhất thiết phải send lại toàn bộ file. 5. Hỗ trợ file với kích thước không giới hạn. Chỉ cần .Net framework có thể open file đó chương trình có thể send được, không có giới hạn về dung lượng. GVHD: Hoàng Văn Kiếm Trang 21/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học III. Sáng tạo, phát triển từ những công cụ đã có: Không ai có thể sáng tạo tất cả mọi thứ bắt nguồn từ con số 0 nên việc khắc phục các hạn chế nêu trên cũng phải bắt nguồn từ những phương án, giải pháp, công nghệ, công cụ đã có sẵn. Ở đây phương án được chọn để cải tiến là giao thức chia sẻ file qua mạng ngang hàng bittorrent. Nền tảng công nghệ được sử dụng là Windows và Microsoft .NET Framework. a. Giao thức bittorrent. Bittorrent là một giao thức được dùng để chia sẻ file trên mạng ngang hàng (peer-to-peer), được dùng để chuyển những file và dữ liệu lớn và rất lớn. Được thiết kế và cài đặt bởi Bram Cohen, phiên bản đầu tiên của bittorrent ra mắt vào ngày 2/7/2001 [1], hiện Bitttorrent là một trong những phương thức chia sẻ file phổ biến nhất thế giới. Năm 2002, bittorrent chiếm 35% tổng dung lượng truyền tải trên internet[2]. Torrent hoạt động bằng cách chia file thành nhiều “piece” kích thước mỗi piece dao động từ 256KiB đến 4MiB. Mỗi piece này được đánh số bắt đầu từ 0, SHA-1 Hash của mỗi piece cũng được tính và lưu vào một file siêu dữ liệu với phần đuôi thường là .torrent. Trước khi chia sẻ được dữ liệu thật, người dùng phải tìm cách chia sẻ file siêu dữ liệu này với nhau. Để máy của người dùng (peers) có thể kết nối với nhau, torrent sử dụng một server làm trung gian (tracker), server này không tham gia truyền dữ liệu mà chỉ lưu trữ thông tin về IP và port của những peers đang chia sẻ cùng file torrent đó và gửi thông tin này đến cho các peers. Trong giao thức bittorrent có 8 thông điệp (message) khác nhau, mỗi thông điệp mang một ý nghĩa riêng và không nhất thiết phải đi đồng bộ với nhau. Khi nhận thông điệp, clients có thể trả lời hoặc không, và nếu trả lời cũng không nhất thiết phải theo một quy ước nào. Việc sử dụng 8 thông điệp đó như thế nào là tùy vào clients. Cơ chế thoáng, không gò bó này cho phép mở ra nhiều kỹ thuật nhằm tận dụng hiệu quả giao thức bittorrent. Trong 8 thông điệp đó có 4 thông điệp chính phục vụ cho việc truyền dữ liệu: GVHD: Hoàng Văn Kiếm Trang 22/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học Thông điệp Tham số Ý nghĩa 4 – Have Integer Peers vừa download hoàn chỉnh một piece 5 – Bitfield Một dãy bit chiều dài tương ứng số pieces Được send một lần ngay khi 2 peers vừa kết nối. Cho biết peers đang có những pieces nào. 6 – Request 3 số nguyên Yêu cầu dữ liệu từ peers. 3 số nguyên bao gồm:Số_thứ_tự_peice, Vị_trí_Byte_bắt_đầu, Kích_thước_dữ_liệu. 7 – Piece 2 số nguyên + 1 dãy bytes Thông điệp này chứa dữ liệu gửi. Tham số gồm: Số_thứ_tự_peice, Vị_trí_Byte_bắt_đầu, Dữ_liệu Được thiết kế dành riêng cho việc chia sẻ file giữa các máy trạm, có thể nói giao thức bittorrent cung cấp nền tảng cho mọi nhu cầu chía sẻ file. Tuy nhiên, các chương trình sử dụng giao thức bittorrent vẫn còn chịu một số hạn chế đã được nêu. Áp dung nguyên tắc phân nhỏ và tách khỏi ta sẽ lọc ra những phẩm chất cần thiết của giao thức bittorrent đồng thời loại bỏ những phẩm chất tiêu cực như: - Không để người dùng phải tự quản lý các file siêu dữ liệu. Thực tế cho thấy, khúc mắc của những người mới dùng torrent hầu hết là không hiểu được khái niệm và vai trò của file siêu dữ liệu .torrent. Với chương trình của em việc tạo ra file siêu dữ liệu, lưu trữ và send file này giữa các clients là hoàn toàn tự động. Đảm bảo tính thân thiện và dễ sử dụng với người dùng. - Không có tracker. Do chỉ nhằm đáp ứng nhu cầu send file giữa một nhóm người có quen biết trước và số lượng người không đông lắm nên chương trình hoạt động không cần một server lưu thông tin về IP và port, người dùng sẽ tự nhập thông tin này. Chương trình sẽ có chức năng tự động tìm IP đễ hỗ trợ người dùng. - Các thông điệp giờ đây là đồng bộ, không đặt nặng vấn đề “bánh ít đi bánh quy lại” (tick-tack-toe). Trong giao thức torrent có 4 thông điệp để quản lý peers, torrent clients thường chỉ ưu tiên send dữ liệu cho peers nào có dữ liệu để trao đổi với nó. Các peers mới tham gia chia sẻ file, không có tí dữ liệu nào sẽ bị chặn (choke) và được send dữ liệu một cách rất hạn chế. GVHD: Hoàng Văn Kiếm Trang 23/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học Do chương trình của em phục vụ việc chia sẻ file giữa bạn bè với nhau nên mọi đối tượng tham gia chia sẻ file đều bình đẳng, khi nhận được thông điệp chương trình sẽ trả lời ngay. b. SHA-1 Hash và file checksum Giải thuật băm (hash) là thuật toán mã hóa, chuyển đổi một khối dữ liệu cho trước thành một đoạn dữ liệu có kích thước cố định gọi là hash value, sao cho với mỗi khối dữ liệu chỉ có thể có một hash value duy nhất. Một thuật toán hash được gọi là có khả năng “chống trùng lặp” (collision resistance)[5] nếu không thể tìm được hai khối dữ liệu khác nhau lại có hash value giống nhau, và khi khối dữ liệu này thay đổi thì hash value cũng sẽ thay đổi. Thực tế rất khó có giải thuật nào đảm bảo 100% khả năng chống trùng lặp, tuy nhiên ta vẫn có thể chấp nhận giải thuật có trùng lặp của nó là thấp. Các giải thuật hash chống trùng lặp được ứng dụng phổ biến vào các chiến thuật checksum, trong đó SHA-1 và MD5 là hai giải thuật hash được biết đến hơn cả. MD5(Message-Digest algorithm 5) được thiết kế bởi Ron Rivest [4] vào năm 1991 để thay thế giải thuật hash MD4, MD5 được ứng dụng vào các phần mềm đảm bảo độ tin cậy khi chuyển file . Năm 1993, Den Boer và Bosselaers đã đưa ra lời cảnh báo về lỗ hổng của giải thuật MD5. Năm 1996, Dobbertin đã tuyên bố về lỗi của MD5 và khuyên mọi người thay thế MD5 bằng SHA-1 hay RIPED-160. Kích thước của hash(128 bit) là khá nhỏ đủ cho các sự tấn công. Tháng 3 năm 2004 một dự án mang tên MD5CRK với mục đích chứng minh MD5 trên thực tế không an toàn bằng việc tìm các lỗi bởi các sự tấn công. Ngày 17 tháng 4 năm 2004, MD5CRK đã được kết thúc, khi mà Xiaoyun Wang, Dengguo Feng, Xuejia Lai, và Hongbo Yu tuyên bố đã tìm được lỗi của MD5. Hiện nay MD5 đã không còn được công nhận là chống trùng lặp, nhưng khả năng của nó vẫn còn đủ để dùng trong việc checksum file và một số ứng dụng cần bảo mật thấp. SHA (Secure Hash Algorithm) được phát triển bởi NSA (National Security Agency) và được xuất bản thành chuẩn của chính phủ Mỹ bởi viện công nghệ và chuẩn quốc gia Mỹ (National Institute of Standards and Technology hay NIST). SHA được chấp nhận bởi FIPS nhờ khả năng chống trùng lặp tốt. SHA có 5 thuật toán khác nhau: SHA-1, SHA-224, SHA-256, SHA-384, SHA-512. Trong đó, SHA-1 được sử dụng rộng rãi trong nhiều ứng dụng và giao thức khác nhau, SHA-1 sẽ cho ra đoạn mã hóa (hash value) có độ dài 160 bit từ một dữ liệu có kích thước tối đa là (2^64 – 1) bit. GVHD: Hoàng Văn Kiếm Trang 24/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học SHA-1 được dùng trong việc checksum dữ liệu, bên gửi khi chuyển dữ liệu cho bên nhận sẽ chuyển kèm hash value của khối dữ liệu, khi đã hoàn tất việc truyền dữ liệu bên nhận sẽ đối chiếu (checksum) hash value nhận được với hash value của dữ liệu vừa nhận, nếu giống nhau thì chứng tỏ dữ liệu đã được truyền chính xác. SHA-1 dựa trên cơ sở MD4 và MD5 của Ron Rivest, nhưng thiết kế phức tạp hơn. Lưu đồ SHA-1: Trước khi bắt đầu tính hash, giá trị hash value ban đầu phải được khởi tạo (số ghi ở dạng thập lục phân) A= 67452301 B= efcdab80 C= 98badcfe D= 10325476 E = c3d2e1f0. 5 giá trị hash value A, B, C, D, E này cuối cùng sẽ được ghép với nhau thành giá trị hash cho dữ liệu. Tuy nhiên, trước đó, dữ liệu sẽ được chia thành những khối 512 bit và được xử lý qua hai bước như hai hình bên dưới hình dưới:fffffff Bước 1: Mỗi khố 512 bit (bao gồm 16 từ, mỗi từ 32bit) sẽ được mở rộng thành 80 từ. GVHD: Hoàng Văn Kiếm Trang 25/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học Bước 2: 80 từ đó sẽ XOR và dịch với các hash value A, B, C, D, E. Đây là quy trình tính toán chính của SHA-1 (SHA-1 Compress Function) c. Giao diện người dùng Trong giao diện người dùng của một số chương trình truyền file, giao diện trình GVHD: Hoàng Văn Kiếm Trang 26/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học bài chủ yếu là dạng bảng. Trong đó mỗi file đang được truyền chiếm một dòng, mỗi cột biểudiễn một thông tin trong quá trình truyền (tên file, dung lượng, tốc độ, thời gian, mức độ hoàn thành, v.v....). Cách bố trí giao diện này được hỗ trợ trong hầu hết các công cụ lập trình nhờ ưu thế đơn giản, dễ thiết kế, cho người dùng tầm nhìn bao quát trên toàn bộ các file đang được truyền tải. Tuy nhiên giao diện như vậy có nhược điểm chết người là khi ta điều chỉnh độ rộng một cột nào đó thì tất cả các hàng đều bị ảnh thưởng theo, hơn nữa bảng quá rộng sẽ khiến người dùng khó quan sát. Để khắc phục nhược điểm này ta sẽ áp dụng nguyên tắc tổ hợp. Ta gom nhiều thông tin liên quan đến một quá trình truyền tải vào cùng một mục và xếp chúng lên 2 hàng thay vì 1 như thường thấy. Ví dụ về giao diện truyền file với mỗi file được đặt trên 2 hàng. .Net cho phép tạo một control hòan tòan mới, kết thừa từ control cũ hoặc tạo một control trống rỗng, kế thừa từ class UserControl. Trong tình huống này, em cần một control với giao diện tương tự như danh sách download của các phần mềm firefox[3] và transmission[4]. Ý tưởng ban đầu là tạo một control thừa kế từ control ListView của .NET. Tuy nhiên control này có cấu trúc phức tạp và có nhiều tính năng không cần thiết, hơn nữa yêu cầu lớn nhất đặt ra là mỗi items phải có một thanh progressbar và hiển thị trên nhiều hành thì ListView lại thiếu. Cuối cùng em chọn giải pháp tạo một đối tượng mới hoàn toàn, bao gồm 2 control là ListItems và TheList ListItems bao gồm 1 picture box để, thể hiện icon; 3 label lần lượt cho Tên đối tượng, khối lượng dữ liệu đã gửi/nhận và tốc độ truyền dữ; 1 thanh progressbar. Trong GVHD: Hoàng Văn Kiếm Trang 27/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học các thông số thể hiện của items không thể truy cập vào mà chỉ được thay đổi bằng hàm update. Control TheList bao gồm một danh sách các ListItems ( List) và một thanh scroll bar. TheList có nhiệm vụ chứa các ListItems và hiển thị các ListItems này sao cho các items có màu xen kẽ nhau. Trước khi thực hiện một thay đổi nào đối với items người dùng phải báo hiệu cho TheList bằng cách gọi hàm StartUpdate(), sau khi hoàn tất thay đổi phải gọi hàm EndUpdate() để List vẽ lại các items. Trong khoảng thời gian từ lúc gọi StarUpdate đến lúc gọi EndUpdate, Control List sẽ không được vẽ lại tránh việc phải cập nhật danh sách các đối tượng (ListItems) trong khi chúng đang bị người dùng thay đổi. GVHD: Hoàng Văn Kiếm Trang 28/45 Giao diện chính.i i í . Bộ thư viện lõi t i l i Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học IV. Chi tiết thiết kế, mô tả hoạt động. a. Kết cấu chương trình. Khi người dùng sử dụng chương trình để chia sẻ file, họ được biết đến như một user. Mỗi user được đặc trưng bằng 3 thông số: Alias – bí danh người dùng chọn để miêu tả mình, IP – địa chỉ IP của máy người dùng, Port – port mà từ đó máy khác có thể connect vào máy người dùng. Chương trình quản lý các tác vụ chia sẻ file như là một task. Mỗi task có thể bao gồm nhiều file một danh sách các user cùng tham gia chia sẻ file các file đó (User có thể chọn chỉ tham gia chia sẻ một phần trong số các file của task) Chương trình có thể được chia làm hai thành phần chính, kết nối chặt chẽ với nhau: Phần lõi đảm nhận các công việc xử lý nền, phía sau giao diện chính. Cung cấp các công cụ để quản lý các task, tính toán thông tin cùng những thông tin cần thiết. Quản lý các kết nối đế từ máy khác, từ đó điều phối việc send file. Lưu lại dữ liệu đã nhận cùng với các thông tin mô tả cần thiết để phục hồi quá trình send file khi gặp sự cố. GVHD: Hoàng Văn Kiếm Trang 29/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học Giao diện chính: Gồm các form và controls cần thiết để làm nhiệm vụ giao tiếp với người dùng, nhận lệnh và hiển thị thông tin. V. Giao diện chính. Sơ đồ các form trong giao diện. Theo như sơ đồ kết cấu bên trên thì ta thấy được giao diện gồm nhiều form nhỏ. Trong đó form Main là cửa sổ làm việc chính, từ đó người dùng điều khiể và tương tác với chương trình, các form khác sẽ được gọi ra ứng với mỗi tình huống tương ứng. Main Form GVHD: Hoàng Văn Kiếm Trang 30/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học • Thực hiện công việc tự động load các task trong thư mục TaskList, bao gồm cả những cái đã thuc hiện xong và những task còn đang dở dang. • Thiết lập cấu hình mặc định cho chương trình trong lần chạy đầu tiên, lưu các tùy chọn cấu hình của người dùng. • Tự động mở một kết nối lắng nghe trên port do người dùng chọn, sẵn sàng thực hiện việc chia sẻ dữ liệu giữa các máy tính với nhau. Chương trình có khả năng thu gọn xuống system tray GVHD: Hoàng Văn Kiếm Trang 31/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học Các button phía dưới thanh toolbar được dùng để lọc (filter) các task dựa theo trạng thái của chúng. Create Task form: Form này cho phép người dùng tạo một task. Form sẽ gọi các hàm tương ứng trong bộ thư viện lõi để tính hash và các thông số cần thiết khác của task. Quá trình tính hash thường chiếm một thời gian tương đối lâu nên chương trình cung cấp khả năng hủy bỏ quá trình hash (tính năng pause quá trình hash không được đưa vào do mức độ cần thiết không cao và để đảm bảo giao diện ). Form Peer Input: GVHD: Hoàng Văn Kiếm Trang 32/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học Được dùng nhưng một dialog box đặc biệt, dành riêng cho việc nhập các thông số đặc trưng cho user. Các textbox nhập IP và port đã được thiết kế kỹ để đảm bảo người dùng không thể thông số không hợp lý (dù là cố ý hay vô tình). Detail form Từ form này người dùng có thể xem lại các thông tin liên quan đến task, danh sách các file được chia sẻ và có thể điều chỉnh thêm hoặc bớt user trong danh sách. Option form Đây la nơi chứa các thiết lập của chuong trình, bên trong sẽ bao gồm các tính năng cơ bản nhung sẽ ảnh hưởng đến toàn bộ các hoạt động của chương trình. Request form GVHD: Hoàng Văn Kiếm Trang 33/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học Form này chỉ được mở lên khi chương trình nhân được tín hiệu bắt đầu chia sẻ file từ user khác. Người dùng có thể chấp nhận chia sẻ hoặc không, và có quyền lựa chọn file mình sẽ nhận. a. Bộ thư viện lõi. Công cụ tính Hash: .NET hỗ trợ sẵn các hàm cần thiết để tính Md5 và SHA-1 hash trong namespace System.Security.Cryptograph. Tuy nhiên, qua thực tế sử dụng của em, các công cụ có sẵn này không phù hợp với việc tính Hash của một file, nhất là các file có kích thước lớn. Hơn nữa nếu dùng các hàm có sẵn này, không thể biết được quá trình tính hash đã chạy tới đâu và ước lượng thời gian tính toán cần thiết. Vì thế em tự cài đặt các công cụ để tính hash theo hai thuật toán MD5 và SHA-1 đã đề cập trong phần hai. GVHD: Hoàng Văn Kiếm Trang 34/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học Interface IHash bao gồm ba phương thức dữ liệu đầu vào được nạp vào bằng hàm input. Hàm result được dùng để báo hiệu việc nhập dữ liệu kết thúc và trả về kết quả tính toán sau cùng. Hai clash MD5 và SHA1 implement Interface này và chứa các hàm cụ thể cho từng thuật toán. Class Task, là đơn vị quản lý các tác vụ send file mà chương trình đang thực hiện thông tin về task được lưu trong đĩa cứng, hiện tại định dạng file được sử dụng là dạng chữ trơn, một file thông tin sẽ có dạng thức như sau: 17/06/2009 1:09:46 SA /* Thời điểm task được tạo ra */ 01/01/0001 12:00:00 SA /* Thời điểm task hoành thành */ </ 3 dòng lưu thông tin về giới hạn tốc độ, hiện chưa cài đặt /> 1 /* Số lượng user tham gia task */ </Thông tin về user, mỗi user 3 dòng theo thứ tự: Alias IP Port /> 1 /* Số lượng file trong task */ </ Thông tin về file, mỗi file gồm Đường dẫn Kích thước Số mảnh Hash của từng mảnh /> /* Dòng cuối cùng: task hash */ GVHD: Hoàng Văn Kiếm Trang 35/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học Các file thông tin này được lưu trong thư mục TaskList ở cùng thư mục với file thực thi chương trình. Thời task hoàn thất được để mặc định là ngày 1/1/1 để báo hiệu task chưa hoàn tất. Một task được tạo ngay trên máy (máy bắt đầu tiến hành chia sẻ) sẽ không có ngày hoàn tất. Task Hash được tính bằng cách lấy SHA-1 hash của chính phần hashcode của từng file. Class transmission và class peer, mỗi instance class task sẽ chứa một instance của class transmission, class này có nhiệm vụ quản lý hoạt động chia sẻ dữ liệu của task. Class peers đại diện cho một user khác đang kết nối vào máy. Trong class transmission sẽ có một list các peers hiện đang cùng chia sẻ dữ liệu. Một user nếu tham gia chia sẻ nhiều task sẽ được đại diện bằng nhiều peer trong các class transmission tương ứng. Khi người dùng Start một task, class transmission sẽ tạo ra một thread riêng biệt để chạy hàm private void download() hàm này lặp đến khi người dùng download hoàn chỉnh hoặc người dùng ra lệnh stop. Class peers có nhiệm vụ gửi message đến user và nhận các message từ user gửi đến, một peers có thể có tối đa 4 kết nối, mỗi kết nối có 1 hàm ListenToPeer để nhận các message được gửi đến từ kết nối này, hàm này được chạy trên một thread riêng, khi cả 4 kết nối cùng bị ngắt, peers sẽ bị hủy bỏ. Mối quan hệ giữa hai class trên và class task được được thể hiện bằng sơ đồ dưới đây: b. Cơ chế send file Khi chương trình bắt đầu chạy, form Main sẽ tạo một socket và listen trên port do người dùng chỉ định trong form Options. Các connections do main nhận được sẽ được giao cho các class tương ứng xử lý. Sau khi đã kết nối thành công việc send file sẽ diễn ra theo một giao thức gần tương tự bittorrent. Một file được chia làm nhiều piece - 2MiB, chương trình giữ hash code của từ piece để checksum ngay sau khi nhận dữ liệu. Mỗi piece lại được chia làm nhiều block – 16KiB, đây là đơn vị dữ liệu sẽ được gửi đi. Việc truyền – nhận dữ liệu thực hiện thông qua các message. Peers chỉ trả lời các message khi thật sự cần thiết. GVHD: Hoàng Văn Kiếm Trang 36/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học Để cài đặt khả năng resume em dùng cách cơ bản nhất là tạo một file đánh dấu, nội dung file là một chuỗi các số 0,1 mỗi số tương ứng với trạng thái đã nhân, chưa nhận của một block. Mỗi file sẽ được lưu bằng một hàng riêng. Tên message Chú thích Announce Message bắt đầu quá trình chia sẻ file, sau message này sẽ là một chuỗi các message đồng bộ nhau nhằm gửi cho user toàn bộ thông tin về task. Connect Message báo hiệu bắt đầu hay chấp nhận một kết nối. Accept Trả lời cho connect, báo hiệu chấp nhận kết nối. Disconnect Message thông báo hủy bỏ kết nối. Have Peers gửi message này sau khi đã nhận hoàn chỉ một piece hoặc để trả lời cho message Ask Ask Dùng message để hỏi xem peers có một piece nào đó hay không. Nếu có peers sẽ trả lời bằng message have. Request Yêu cầu peers gửi một block xác định nào đó, nếu có peers sẽ trả lời bằng message block Block Gửi dữ liệu của block tới cho peers, dùng để trả lời cho message Request Bảng chú giải các message mà chương trình sử dụng: VI. Một số mẹo dùng trong lúc cài đặt chương trình a. Background Do đặc thù chương trình phải xử lý những công việc việc đòi hỏi nhiều thời gian như tính hash, chờ kết nối v.v… nên việc dùng kỹ thuật đa luồng (multi thread) là bắt buộc đảm bảo khả năng đáp ứng (responsiveness). Và BackgroundWorker là một đối tượng (control) sẵn có của .NET Framework nhằm đơn giản hóa việc lập trình đa luồng. Không như đa số control khác, BackgroundWorker nằm trong namespace System.ComponentModel. Hỗ trợ 3 sự kiện: DoWork, ProgressChage và RunWorkerComplete. BackgroundWorker được điều khiển thông qua các hàm: GVHD: Hoàng Văn Kiếm Trang 37/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học RunWorkAsync() có nhiệm vụ raise event DoWork, eventHandler của DoWork được thực hiện trong một tiến trình khác với tiến trình chạy RunWorkAsync(), sau khi kết thúc DoWork, sự kiện RunWorkerComplete được raise và eventHandler của sự kiện này thực thi thread đang điều khiển BackgroundWorker và thread trước đó được thu hồi. Em thường hay sử dụng chung BackgroundWorker với ProgressBar và timer (xem hình trên), để thể hiện cho người dùng biết được quá trình hoạt động của BackgroundWorker đang làm gì và chừng nào thì kết thúc. Tuy đơn giản hóa công việc lập trình đa luồng đi rất nhiều, nhưng khi sử dụng BackgroundWorker cũng không tránh khỏi một số khó khăn đặc trưng của việc lập trình luồng, sẽ đề cập chi tiết sau. b. Synchronous socket programming Để send dữ liệu qua mạng chúng ta phải quản lý được kết nối giữa hai máy. NET mô hình hóa kết nối này thông qua đối tượng socket. Một socket bao gồm hai IPEndPoint, hai đối tượng IPEndPoint này lần lượt chứa thông tin về IP, port của máy chủ và IP, Port của máy khách – nhưng thành phần đại diện cho một kết nối. Việc gửi và nhận dữ liệu được thực hiện thông qua hai Phương thức có sẵn của socket là Socket.Send() và Socket.Receive() Đối tượng socket trong .NET hỗ trợ nhiều giao thức transport khác nhau như GVHD: Hoàng Văn Kiếm Trang 38/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học TCP, IPX, UDP v.v… Do không có nhiều yêu cầu đặt biệt về giao thức transport nền cho chương trình nên em chọn sử dụng giao thức TCP phổ biến có sẵn khả năng checksum tương đối. Ở đây để đơn giản hóa những công việc liên quan nhiều đến network và kiến thức mạng máy tính. em chọn lập trình socket đồng bộ, tức là mỗi khi gọi phương thức Socket.Send() hoặc Socket.Receive(), chương trình sẽ bị khóa (block) cho đến khi dữ liệu được gửi/nhận thành công. Cách này có thể hạn chế tình trạng máy bị tràn ngập bởi tín hiệu gửi đến từ các máy khác, nhất là trong trường hợp một máy khi chia sẻ file phải kết nối với nhiều máy, mỗi máy lại có nhiều socket khác nhau. Tuy nhiên synchronous socket đôi khi khiến chương trình bị treo, đòi hỏi phải áp dụng thêm kỹ thuật lập trình đa luồng trong việc quản lý và sử dụng các socket này. c. Thread synchronization Việc trang bị khả năng đa luồng cho phép chương trình tận dụng tốt tài nguyên hệ thống, đảm bảo vẫn đáp ứng (responsiveness) ngay cả khi đang phải thực hiện những công việc nặng. Đổi lại, chương trình trở nên cực kỳ phức tạp so với ứng dụng đơn luồng và phát sinh nhiều vấn đề đặt trưng của lập trình đa xử lý. Ngày nay mọi chương trình hầu như đều đa luồng. Một chương trình có dùng window form của .NET chắc chắn là đa luồng, dù người lập trình không có ý định đụng đến đa luồng thì bên dưới những dòng code của người lập trình, bao giờ cũng là những đoạn code có sẵn của thư viện .NET và luôn luôn có luồng chạy song song đảm nhận việc vẽ lại các control. Thế nên việc sử dụng đa luồng khi lập trình ngày nay gần như là bắt buộc. Để một chương trình đa luồng có thể hoạt động suôn sẻ, các luồng này phải được đồng bộ hóa (synchronization) tốt. Đồng bộ hóa là quy tắc đảm bảo các tiến trình này chạy một cách “có tổ chức” và không xung đột với nhau về tài nguyên dùng chung. Đây là một công việc phức tạp, khó có thể lường hết các tình huống có thể xảy ra trên thực tế khi nhiều luồng cùng một lúc tranh giành nhau tài nguyên hệ thống. Và một sơ sẩy của người lập trình có thể dẫn đến hàng loạt vấn đề. Một trong những lỗi mà em thường hay gặp nhất là “Cross-thread operation not valid “ , như trong hình: GVHD: Hoàng Văn Kiếm Trang 39/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học Lỗi thường gặp khi lập trình multi thread Lỗi này phát sinh khi một thread thay đổi thuộc tính một control được tạo ra bởi một thread khác. Do control có thể đang được redraw ngay tại thời điểm thread khác truy cập vào nên để đảm bảo nhất quán và tránh xung đột, .NET cấm việc thay đổi controls từ thread khác. Vấn đề này có thể được khắc phục bằng các sử dụng hàng loạt biến trung gian để giao tiếp giữa 2 thread thay vì can thiệp trực tiếp vào control của thread kia hoặc triệt để hơn là sử dụng cơ chế Invoke. Và cuối cùng là vấn đề lớn nhất phải đối mặt khi lập trình đa xử lý: chương trình có thể bị deadlock. Deadlock xảy ra khi một thread hay tiến trình nào đó không thể được kết thúc do nó đang chờ một điều kiện nào đấy từ thread khác, mà điều kiện này không bao giờ xảy ra. Điều này rất dễ gặp phải trong thực tế. Có bốn điều kiện để xảy ra deadlock (Coffman conditions) [6] 1. Tài nguyên không thể được dùng bởi nhiều thread (Mutual Exclusion). 2. Thread đang giữ tài nguyên vẫn cần có thêm một tài nguyên gì khác (Hold and wait). 3. Thread phải tự trả lại tài nguyên dùng chung, không ai có thể giành (No Premption). 4. Ít nhất hai thread hình thành một vòng tròn chờ tài nguyên lẫn nhau (circular wait). Trong trường hợp cụ thể của em, có rất nhiều khả năng có thể gây deadlock GVHD: Hoàng Văn Kiếm Trang 40/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học như: thread A vừa nhận dữ liệu và ghi vào file x, đang chờ truy cập file y từ thread B để hoàn tất. Thread B đang giữ file y, nhưng lại chờ truy cập file x từ A. Điểm đáng sợ của deadlock là nó không thể được khắc phục, chỉ có 2 chiến lược để lựa chọn khi deadlock: Cố tránh deadlock bằng cách đồng bộ hóa các tiến trình tốt hơn và tốt hơn nữa. Hoặc chúng ta phải chấp nhận deadlock, restart chương trình và hy vọng lần sau sẽ không gặp tình huống tương tự. Cách lấy external IP Để thực hiện kết nối, chương trình cần biết đến IP của máy đích, tuy nhiên ngay với hầu hết người hiểu biết về địa chỉ IP còn khá mập mờ. Để tiện sử dụng, chương trình tích hợp khả năng tự xác định địa chỉ IP khi truy cập internet của người dùng và hiển thị nó trong form options. Cần lưu ý rằng chỉ có gateway (thường là router) mà từ đó người dùng truy cập vào internet mới nắm được external IP, và việc truy cập vào gateway để lấy IP không phải lúc nào cũng làm được, mỗi thiết bị có một cách giao tiếp khác nhau hơn nữa cũng có thể máy người dùng không đủ quyền truy cập vào tran cung cấp thông tin của gateway. Để có thể lấy được một external IP trong mọi trường hợp, cách đơn giản nhất là nhờ vào một máy khác trên internet với công năng đặc biệt: Khi chúng ta gửi một gói tin đến máy này, máy này sẽ bóc phần source IP trong gói tin và gửi lại cho ta. Có nhiều trang web thực hiện việc này nhưng hầu hết bị chèn quảng cáo khá rối rắm vì thế, ta sẽ tự tạo ra một trang web chỉ hiển thị duy nhất một thứ là địa chỉ IP của máy vừa truy cập. + Đối với ASP, chỉ cần tạo một trang duy nhất một dòng: + Đối với PHP, : Sau khi tạo ra một trang có nội dung như trên , ta cần upload file lên một host thường trực nào đó. Ở đây địa chỉ em đã thực hiện là: GVHD: Hoàng Văn Kiếm Trang 41/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học Dữ liệu trả về sẽ có dạng: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ""> Untitled Document 118.69.168.69 Nếu ta để ý ở xung quanh IP trên, ta sẽ thấy nó nằm ngay sau chữ và cả chuỗi chỉ có duy nhất một dòng , công việc còn lại chỉ là xử lý chuỗi đơn giản. d. Lấy Icon của file – task Trong ListItem, với mỗi file hay task đều có Icon tương ứng để hiển thị cho file hay task đó. Với các file không thể lấy được Icon thì Icon của file đó sẽ là Icon chung được mặc định sẵn bởi chương trình. .Net cung cấp sẵn công cụ để lấy icon của một file: Namespace: system.Drawing Cú pháp: Icon.ExtractAssociatedIcon public static Icon ExtractAssociatedIcon( string filePath ) Trả về Icon của file được chỉ ra. Tham số cần truyền vào là đường dẫn của file(string filepath). Icon của task sẽ được được đại diện bằng Icon của loại file có tổng dung lượng lớn nhất. Để làm việc này ta dùng phương thức GetIcon được viết trong task.cs. Public string GetIcon() GVHD: Hoàng Văn Kiếm Trang 42/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học Tất cả các file của task sẽ được phân thành từng nhóm, mỗi nhóm tương ứng với một loại của file, và mỗi loại file này có dung lượng bằng tổng dung lượng của tất cả các file có cùng loại, sau đó ta sẽ so sánh dung lượng của các loại file với nhau, kết quả trả về là đường dẫn của 1 file với dung lượng của loại của file đó là lớn nhất. Dựa vào đường dẫn của file này, ta dùng phương thức Icon.ExtractAssociatedIcon để xác định Icon cho task. e. Cách dừng một thread Thread trong .NET hỗ trợ phương thức suspend và resume, tuy nhiên việc dùng hai phương thức này vào xử lý trong thực tế có thể dẫn đến một số bất cập. Ta không thể biết thread đang làm gì lúc nó dừng, nếu thread đang nắm một tài nguyên dùng chung nào đó đột ngột bị dừng, nó có thể khiến các thread khác gặp exception hoặc tệ hơn gây deadlock. Để dừng một thread cách tốt nhất là sử dụng biến dùng chung và thay đổi giá trị biến ấy từ bên ngoài. Khi thread thực hiện công việc nó sẽ định kỳ kiểm tra biến này và dừng khi đến đúng điểm định trước và gặp đúng giá trị thích hợp. Một trong những cách dừng cơ bản nhất là dùng một biến làm cờ và bên trong đoạn code mà thread thực thi, ta đặt tại vị trí thích hợp một vòng lặp, có tác dụng như một bẫy: while (pauseFlag == true) ; Thread sẽ bị mắc bẫy và dừng đến khi nào ta đặt lại giá trị của pauseFlag từ bên ngoài thành false. Ngoài phương pháp thô sơ trên, ta có thể sử dụng cơ chế đồng bộ hóa hỗ trợ sẵn trong .NET để dừng thread: khai báo một biến dùng chung: ManualResetEvent PauseEvent = new ManualResetEvent(true); Bên trong thread, ta lại đặt tại vị trí thích hợp lệnh: ResumeEvent.WaitOne(); Để dừng thread ta dùng: ResumeEvent.Reset(); và ResumeEvent.Set(); để thread tiếp tục thực thi. f. Cách ngăn không cho hệ thống vẽ lại chương trình. Việc vẽ lại các control được thực hiện tự động từ base class, đây là công việc đòi hỏi khá nhiều khả năng xử lý của hệ thống. Chúng ta có thể handle sự kiện OnPaint để xử lý mỗi khi control được vẽ lại nhưng không thể can thiệp vào quá trình GVHD: Hoàng Văn Kiếm Trang 43/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học vẽ này. Tuy nhiên trong một số tình huống đặc biệt, sẽ phát sinh nhu cầu tạm hoãn việc vẽ lại control. Nếu ta sắp thực hiện một loạt thay đổi lớn thì việc vẽ lại control liên tục sẽ tốn rất nhiều tìa nguyên hệ thống, nếu hoãn cơ chế redraw này đến khi tòan bộ thay đổi hoàn tất sẽ hợp lý hơn nhiều. Việc override hàm OnPaint không thể giải quyết được vấn đề, để chặn hệ thống tự vẽ lại chương trình, ta phải gọi hàm API: [DllImport("user32.dll")] public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam); Để chặn việc vẽ lại chương trình: SendMessage(Parent.Handle, WM_SETREDRAW, false, 0); Để cho phép quá trình vẽ lại bắt đầu: SendMessage(Parent.Handle, WM_SETREDRAW, true, 0); GVHD: Hoàng Văn Kiếm Trang 44/45 Phạm Nguyễn Trường An Phương pháp nghiên cứu khoa học trong tin học D.TÀI LIỆU THAM KHẢO: 1. Cohen, Bram (2001-07-02). "BitTorrent — a new P2P app" 2. 3. Microsoft Developer Network www.msdn.com 4. 5. 6. Giáo sư Coffman, đại học columbia: 7. Slide Phương pháp nghiên cứu khoa học - GS-TSKH Hoàng Văn Kiếm 8. Các thủ thuật sáng tạo cơ bản – Phan Dũng 9. IBM Archives: 1960s - 03.ibm.com/ibm/history/history/year_1964.html GVHD: Hoàng Văn Kiếm Trang 45/45

Các file đính kèm theo tài liệu này:

  • pdfpham_nguyen_truong_an_ch1101062_ppnckhtth_3097.pdf