Đề tài xây dựng chương trình lan chat

26 1.2K 10
Đề tài xây dựng chương trình lan chat

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Đề tài xây dựng chương trình lan chat Đề tài xây dựng chương trình lan chatĐề tài xây dựng chương trình lan chatĐề tài xây dựng chương trình lan chatĐề tài xây dựng chương trình lan chatĐề tài xây dựng chương trình lan chatĐề tài xây dựng chương trình lan chatĐề tài xây dựng chương trình lan chatĐề tài xây dựng chương trình lan chatĐề tài xây dựng chương trình lan chatĐề tài xây dựng chương trình lan chatĐề tài xây dựng chương trình lan chatĐề tài xây dựng chương trình lan chat

ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CƠNG NGHỆ THƠNG TIN Lớp WINP1.B21 – Nhóm 26 BÁO CÁO ĐỒ ÁN LẬP TRÌNH TRÊN WINDOWS ĐỀ TÀI Xây Dựng Chương Trình LAN Chat GIÁO VIÊN HƯỚNG DẪN: THS.PHẠM THI VƯƠNG NHĨM SINH VIÊN THỰC HIỆN: NGƠ DUY KHÁNH (09520414) NGUYỄN TRỌNG NHÂN (09520425) VĂN PHÚ HIẾU (09520409) TP HỒ CHÍ MINH, 6/2011 Mục Lục I- Giới thiệu Net Remoting: 1/ Net Remoting 2/ NET Remoting so với Web Services 3/ Remote Objects NET Remoting 4/ Domain 5/ Channel 6/ Object Activation: 7/ Client Activated Objects: 8/ Tạo Remotable Object: II- Giới thiệu Socket: 1/ Socket 2/ Chức 3/ Phân loại 4/ Thành phần 5/ Các chế độ giao tiếp 6/ Xây dựng ứng dụng Client-Server với Socket 10 III- Chương trình LAN Messenger: 13 1/ Tổng quan Form chương trình 13 2/ Các thư viện kèm theo chương trình 14 3/ Các kỹ thuật dùng chương trình 14 4/ Các tính làm cho chương trình Chat qua mạng LAN 14 5/ Các tính chưa làm được, cải thiệt phát triển phiên 15 6/ Hướng dẫn sử dụng chương trình: 15 IV- Tài liệu tham khảo: 25 I- Giới thiệu Net Remoting: 1- Net Remoting: Net Remoting chế giao tiếp đối tượng (object) mà không thuộc Process Giúp lớp đối tượng thuộc ứng dụng khác liên lạc với Các đối tượng ứng dụng thiết lập máy tính hay máy tính khác giao tiếp từ xa thông qua giao thức kết nối HTTP, TCP Microsft Net Remoting giới thiệu từ Net Framework 1.1 với Webservice Cung cấp kĩ thuật cho phép đối tượng truy xuất đến đối tượng khác nằm Application Domain khác 2- NET Remoting so với Web Services: Về khía cạnh xử lý từ xa Web Services hồn tồn tương tự NET Remoting Thậm chí người ta làm cho NET Remoting trở thành Web Services cách host IIS Web Services cho phép ứng dụng giao tiếp với mà khơng phụ thuộc platform, ngơn ngữ lập trình, … Tuy nhiên Web Services mơi trường “stateless”, có nghĩa khơng lưu lại trạng thái lần gọi trước khơng biết phía client thực request Client server Web Services trao đổi với thông điệp SOAP Những điều sau điểm khác NET Remoting Web Serices, chúng nhân tố để ta chọn lựa cơng nghệ này: • ASP.NET Web Services truy xuất qua HTTP cịn NET Remoting dùng nhiều giao thức khác TCP, HTTP • • • Web Services mơi trường stateless Khi có request từ phía client, có object tạo để thực request server Cịn NET Remoting lại hỗ trợ nhiều lựa chọn state management thực nhiều request từ client, đồng thời có hỗ trợ callbacks Web Services serialize đối tượng thành XML bên SOAP message truyền tải thông tin thành phần miễn chuyển thành XML Cịn NET Remoting tùy giao thức định dạng message mà truyền thơng tin Ngồi theo giới thiệu NET Remoting có cho phép đối tượng truyền vào theo kiểu tham chiếu(reference) tham trị (value) Web services hoạt động platform môi trường khác NET Remoting yêu cầu phía clients phải NET application 3- Remote Objects NET Remoting: Nếu chương trình đơn đối tượng thuộc ứng dụng đó, chúng dễ dàng giao tiếp với nhau; coi Local Objects Tuy nhiên đối tượng lại thuộc ứng dụng khác (các Application domain khác nhau) cần có Remote Object để giao tiếp với Remote Object dẫn xuất từ MarshalByRefObject hay sử dụng [Serializable] tag cách tạo giao diện ISerializable Các loại Remote Object: Trong NET Remoting, có hai chế để tạo instance Remote Object từ thực thi request Đó Singleton Singlecall Tùy vào mục đích sử dụng, nhu cầu ứng dụng mà server khai báo theo chế WellKnownObjectMode.SingleCall, hay WellKnownObjectMode.Singleton - - - Single Call Object: Remote Object sinh ra, thực thi request, trả lời cho client, sau Object lưu lại không bị hủy Đến process chạy chương trình Server kết thúc instance bị trình hốt rác Garbage Collection hốt Singleton Object: Ngược lại với Single Call, khai báo Remote Object Singleton Remote Object khởi tạo hủy lần nhận request từ phía Client Cơ chế tương tự mơ hình NET Webservice truyền thống Client-Activated Objects (CAO): Thuộc kiểu “Server-side object”, chúng kích hoạt có request đến từ Client Khi Client gửi request tới Server sử dụng tốn tử “new”, thơng điệp gửi tới Remote Application Server sau tạo Instance lớp yêu cầu, trả ObjRef cho Client Application 4- Domain: Trong NET, ứng dụng nạp vào nhớ, tiến trình tạo ra, trình này, miền ứng dụng (Application Domain) tạo Trên thực tế, ứng dụng nạp vào Application Domain Mỗi ứng dụng có thuộc Application Domain khác nhau, chúng muốn giao tiếp với phải sử dụng Remoting khơng thể giao tiếp trực tiếp với Các Application Domain thuộc process khác process 5- Channel: Trong kĩ thuật NET Remoting Channel hiểu kênh để giao tiếp client server Một Object từ Client thông qua Channel để giao tiếp với Object phía server, Channel truyền tải message từ hai phía Như giới thiệu phía có hai channel TcpChannel HttpChannel tương ứng với giao thức TCP HTTP Ngoài ra, TcpChannel HttpChannel có khả extend thành Custom Channel Các nguyên tắc thiết lập Channel: Cần có Channel đăng ký với NET Remoting trước Remote Object gọi Và Channels cần đăng ký trước Remote Object - Channel đăng ký Application Domain nhiều Application Domain thuộc Process Khi Process kết thúc Channel tự động hủy - Không thể đăng ký Channel khác port thuộc máy tính Channel Application Domai khác Khi thiết lập nhiều Channel máy tính chúng cần listen port khác - Client liên lạc với Remote Object thông qua kênh đăng ký việc gọi RegisterChannel lớp ChannelService 6- Object Activation: - Server Actived Object tạo lần Client thiết lập gọi tới Remote Method Hay nói cách khác, Khi Client yêu cầu tạo Remote Object proxy cục tạo Client, Remote Object thực tế nằm Server Các Remote Object khởi tạo lần Client thiếp lập gọi cho Server Ví dụ tạo Proxy sau: // Trên Server RemotingConfiguration.RegisterWellKnownServiceType( typeof (RemoteServerObject), "Test", WellKnownObjectMode.SingleCall); // Trên Client IRemoteCom obj = (IRemoteCom)Activator.GetObject(typeof(IRemoteCom), "tcp://localhost:1002/Test"); Như nói trên, có hai chế để tạo instance Remote Object Single Call Singleton Đoạn mã ví dụ sau: RemotingConfiguration.RegisterWellKnownServiceType( "Test", WellKnownObjectMode.SingleCall); typeof(RemoteServerObject), RemotingConfiguration.RegisterWellKnownServiceType( "Test", WellKnownObjectMode.Singleton); typeof(RemoteServerObject), 7- Client Activated Objects: Đối tượng Client Activated Object tạo Server có request từ Client tạo từ khóa new Activator.CreateInstance(…) // On the Server RemotingConfiguration.ApplicationName = "TestCAO"; RemotingConfiguration.RegisterActivatedServiceType(typeof(RemoteObjectCAO)); // On the Client RemotingConfiguration.RegisterActivatedClientType(typeof(RemoteObjectCAO), "tcp://localhost:1002/TestCAO"); obj = new RemoteObjectCAO(); Tùy thuộc vào hoàn cảnh nhu cầu mà ta sử dụng loại khác Ví dụ: - Singleton object dùng để tham chiếu đến đối tượng server, thay đổi Client “visible” (hiện hữu) với Client khác Ví dụ hệ điều hành Windows, chương trình thay Client Program khác biết Dữ liệu lưu máy chủ truy cập tất Client - Chúng ta sử dụng SingleCall muốn cung cấp môi trường “stateless” (Kiểu giống Web services truyền thống - Chúng ta sử dụng Client Activation đối đượng cần phải trùy trạng thái kết nối liên tục, trao đổi thông tin với client khác 8- Tạo Remotable Object: Một Remote Object đối tượng kế thừa từ lớp MarshalByRefObject Trong C#, tạo lớp thư viện Ta Add thêm lớp có tên MarshalByRefObject nói Khai báo using System.Runtime.Remoting để sử dụng TcpChannel hay HttpChannel Ví dụ: MyRemotableObject.cs namespace RemotableObjects { public class MyRemotableObject : MarshalByRefObject { public MyRemotableObject() { } public void SetMessage(string message) { Cache.GetInstance().MessageString = message; } } } II- Giới thiệu Socket: 1- Socket: Socket phương pháp để thiết lập kết nối truyền thông chương trình yêu cầu dịch vụ ( client) chương trình cung cấp dịch vụ (server) mạng LAN, WAN hay Internet đôi lúc trình bên máy tính Mỗi socket xem điểm cuối kết nối Một socket máy yêu cầu dịch vụ có địa mạng cấp sẵn để “gọi” socket máy cung cấp dịch vụ Một socket thiết lập phù hợp, hai máy tính trao đổi dịch vụ liệu Socket giới thiệu lần ấn UNIX - BSD 4.2 dạng hàm hệ thống theo cú pháp ngôn ngữ C (socket(), bind(), connect(), send(), receive(), read(), write(), close() , ) Ngày nay, Socket hỗ trợ hầu hết hệ điều hành MS Windows (WinSock), Linux sử dụng nhiều ngôn ngữ lập trình khác nhau: C, C++, C#, Java, Visual Basic, Visual C++ 2- Chức năng: Socket cho phép thiết lập kênh giao tiếp mà hai đầu kênh xác định hai cổng (port) Thông qua cổng tiến trình nhận gởi liệu với tiến trình khác 3- Phân loại: Có loại Socket là: + Socket kiểu AF_UNIX cho phép giao tiếp tiến trình máy tính + Socket kiểu AF_INTET cho phép giao tiếp tiến trình máy tính khác mạng Phân loại theo kiểu kết nối: + Socket hướng kết nối (TCP Socket) + Socket không hướng kết nối (UDP Socket) 4- Thành phần: 4.1- Số hiệu cổng (Port Number) Socket Để thực giao tiếp, hai tiến trình phải cho biết số hiệu cổng socket mà sử dụng Mỗi cổng giao tiếp thể địa xác định hệ thống Khi tiến trình gán số hiệu cổng (Server), nhận dư liệu gởi đến cổng từ tiến trình khác (Client) Tiến trình cịn lại u cầu tạo socket 4.2- Địa IP Ngoài số hiệu cổng, hai bên giao tiếp phải biết địa IP Trong số hiệu cổng dùng để phân biệt trình khác máy tính IP dùng để phân biệt máy tính khác mạng TCP/IP Trong hình trên, địa tiến trình B1 xác định thông tin: (Host B, Port B1) + Địa máy tính địa IP dạng 118.69.123.139 địa theo dạng domain www.uit.edu.vn + Số hiệu cổng gán cho Socket phải phạm vi máy đó, có giá trị khoảng từ 0-65535 (16 bits) Trong cổng từ 1-1023 gọi cổng hệ thống dành riêng cho tiến trình hệ thống Số hiệu cổng Quá trình hệ thống 21 Dịch vụ FTP 23 Dịch vụ telnet 25 Dịch vụ mail (SMTP) 80 HTTP 110 Mail (POP3) 443 HTTPS 5- Các chế độ giao tiếp: Xét kiến trúc hệ thống mạng TCP/IP Tầng vận chuyển (Transport Layer) giúp chuyển tiếp thơng điệp chương trình với Nó hoạt động theo hai chế độ: + Giao tiếp có nối kết, chúng sử dụng giao thức TCP + Giao tiếp không kết nổi, sử dụng giao thức UDP Socket giao diện chương trình lớp vận chuyển Nó cho phép ta chọn giao thức sử dụng tầng vận chuyển TCP hay UDP cho chương trình ứng dụng Bảng so sánh khác biện hai chế độ giao tiếp có kết nối khơng kết nối Chế độ có nối kết + Tồn kênh giao tiếp ảo hai bên giao tiếp + Dữ liệu gởi theo bảo đảm: có kiểm tra lỗi, truyền lại gói tin lỗi hay mất, đảm báo thứ tự gói tin + Dữ liệu xác tốc độ truyền chậm Chế độ không nối kết + Không tồn kênh giao tiếp ảo hai bên + Dữ liệu gởi không đảm bảo: Không kiểm tra lỗi, khơng phát truyền lại gói tin bị lỗi hay mất, không đảm bảo thứ tự đến gói tin + Dữ liệu khơng xác, tốc độ truyền nhanh Ta thấy Server khởi tạo Socket gồm IP port 6565 sẵn sàng lắng nghe kết nối cổng 6565 từ Client Giai đọan 2: Client tạo Socket, yêu cầu thiết lập nối kết với Server private void btnSend_Click(object sender, EventArgs e) { Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); byte[] fileName = Encoding.UTF8.GetBytes(fName); // tên file byte[] fileData = File.ReadAllBytes(txtFileLink.Text); // liệu byte[] fileNameLen = BitConverter.GetBytes(fileName.Length); // độ dài tên file clientData = new byte[4 + fileName.Length + fileData.Length]; fileNameLen.CopyTo(clientData, 0); fileName.CopyTo(clientData, 4); 10 fileData.CopyTo(clientData, + fileName.Length); 11 lblStatus.Text = "Đang kết nối tới người nhận "; 12 clientSock.Connect(IP, 6565); // IP máy đích 13 lblStatus.Text = "Đang truyền tải liệu Làm ơn đợi "; 14 clientSock.Send(clientData); 15 clientSock.Close(); 16 17 lblStatus.Text = "File chuyển thành công!"; } - Client yêu cầu khởi tạo socket để sử dụng dịch vụ tầng vận chuyển, hệ thống kiểm tra xem port trống tự động gán cho socket Client Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - Client gởi yêu cầu kết nối đến Server có địa IP port xác định: clientSock.Connect(IP, 6565); 11 - Sau Server chấp nhận kết nối Client, kênh giao tiếp ảo hình thành, Client Server trao đổi thông tin với Giai đọan 3: Trao đổi thông tin Client Server - Sau chấp nhận yêu cầu kết nối, Server đợi Clinet gởi yêu cầu đến Ở đây, Client dùng clientSock.Send(clientData)gởi byte liệu lên Server Sau nhận liệu từ Client, Server tiến hàng chuyển đổi liệu nhận byte liệu thành tên file mà Client gởi liệu file Trong trình này, Client Server liên tục trao đổi thông tin với các liệu nhận được, tuân thủ theo quy tắc giao thức xác lập từ trước Giai đoạn 4: Kết thúc phiên làm việc Sau liệu gởi xong, client gởi yêu cầu hủy kết nối clientSock.Close(); kênh ảo kết nối với Server bị đóng Như vậy, tồn q trình diễn sau 12 III- Chương trình LAN Messenger: 1/ Tổng quan Form chương trình: Tên Form Form1 FormAbout FormAddContact FormChangeDisplayName FormChangePassword FormChatRoom FormJoinRoom FormCreateAccount FormFileSender FormFileReceive FormLogsReader FormMessage FormMusicPlayer FormNetworkSetting FormOfflineMessage FormOption FormPhotoSend FormPhotoReceive FormSelectContact FormSignIn FormWebcam Chức năg Giao diện chương trình Thơng tin tác giả Thêm bạn chat vào danh sách bạn bè Thay đổi tên hiển thị (Aliass) nick chat Thay đổi mật Giao diện Room chat chức Tham gia vào mổ Room chat tạo Giao diện tạo người dùng Giao diện chức gửi file bên người gửi Giao diện chức gửi file bên người nhận Xem lại lịch sử chat nick hành Giao diện cửa sổ chat, sử dụng thao tác nâng cao Webcam, SendFile, Music,… Chương trình nghe nhạc online, mời bạn nghe nhạc Thiết lập IP máy chủ Xem tin nhắn Offline Chức tùy chỉnh chương trình Giao diện chia hình ảnh bên người gửi Giao diện chia hình ảnh bên người nhận Xóa nick chat khỏi list Giao diện đăng nhập Xem webcam người dùng chat trực tiếp 13 2/ Các thư viện kèm theo chương trình: Tên thư viện AxInterop.WMPLib.dll Interop.WMPLib.dll DirectX.Capture.dll DShowNET.dll Khendys.Controls.ExRichTextBox.dll LanMessengerNotify.dll LanMessengerContact.dll LanMessengerChatRoomBase.dll Chức Các thư viện giúp sử dụng Windows Media Player có sẵn Windows dùng cho tính “Nghe nhạc trực tuyến” Thư viện đồ họa, hỗ trợ cho tính “Chat Webcam” Thư viện bổ sung cho Control RichtextBox Giúp chèn mặt cười vào Richtextbox dễ dàng Thư viện sử dụng tính báo trạng thái nick Online/ Offline hay Invisible UserControl sử dụng cho Listchat (danh bạ) Lớp sở tính Room chat, sử dụng Net Remoting 3/ Các kỹ thuật dùng chương trình: - Net Remoting sử dụng Singleton Đăng ký kênh Httpchannel TCPchannel Socket sử dụng giao thức TCP Các hàm xử lý I/O, xử lý tiến trình Regular Expression Truyền giá trị Form sử dụng Delegate thông qua Construtor Xử lý mã HTML hiển thị lên Webrowser … 4/ Các tính làm cho chương trình Chat qua mạng LAN: - Có thể Chat qua mạng LAN với nội dung text Hỗ trợ quản lý nhiều bạn chat danh bạ, chat với nhiều người lúc Hỗ trợ tạo Room Chat, chat theo nhóm Phân quyền mời bạn chat vào Room Chat Hỗ trợ gửi xem tin nhắn Offline Hỗ trợ gửi file Hỗ trợ chia hình ảnh kèm theo tính SlideShow Hỗ trợ xem Webcam Hỗ trợ tìm kiếm nghe nhạc trực tuyến Mời bạn chat nghe nhạc Hỗ trợ xem lại Log chat Hỗ trợ tùy chỉnh cho người dùng Cho phép thao tác danh bạ menu Thơng báo trạng thái nick xác (Online/Offline/Invisible) Chương trình sử dụng tài ngun hệ thống … 14 5/ Các tính chưa làm được, cải thiệt phát triển phiên kế tiếp: - Voice Chat Chia sẻ hình ảnh theo hai chiều Hiển thị Avatar người dùng đăng nhập nhiều máy khác Thay đổi cửa sổ chat từ Richtextbox sang sử dụng Web browser Cải tiến giao diện cửa sổ Chat Phát triển rộng theo hướng hoạt động môi trường Internet … 6/ Hướng dẫn sử dụng chương trình: Giao diện Server: Hiển thị IP Server log Giao diện người dùng: Thiết lập mạng: Từ giao diện chương trình, đóng cửa sổ đăng nhập Vào phần Mở rộng ->Thiết lập mạng 15 Trong cửa sổ mới, nhập IP máy tính làm Server Ở 192.168.1.99, chọn Đồng ý Bắt đầu đăng nhập vào chương trình Vào Messenger -> Đăng nhập 16 Tạo tài khoản: Tại cửa sổ đăng nhập, chọn Tạo tài khoản để sử dụng Trong Form Đăng ký, cung cấp thông tin tên tài khoản, mật tên hiển thị Sau chọn Tạo 17 MessageBox thơng báo việc tạo tài khoản thành cơng Chúng ta sử dụng tài khoản để đăng nhập vào chương trình Chọn Đăng nhập Và vào giao diện chương trình Giao diện chính: 18 Chức Menu Bar Menu Ctrl+T Xóa bạn bè Mở rộng Phím tắt Ctrl+G Thêm bạn bè Messenger Chức Gửi tin nhắn Ctrl+Shift+X Lịch sử chat Đăng nhập tài khoản khác Đăng xuất Thu nhỏ xuống khay hệ thống Thoát Ctrl+L Tùy chỉnh Thiết lập mạng Đổi tên hiển thị với bạn bè Nghe nhạc online Mở Room Chat Trợ giúp Tham gia Room Chat Hướng dẫn sử dụng Thông tin Ctrl+D Ctrl+M Alt+F4 Mô tả Gởi tin nhắn tới người Thêm người vào danh sách bạn bè (Friend List) Xóa người danh sách bạn bè (Friend List) Xem lại Log chat gần Đăng nhập tài khoản khác Đăng xuất Thu nhỏ xuống khay hệ thống Thốt chương trình Thay đổi cài đặt âm thanh, nơi lưu file, lịch sử chat Tùy chỉnh IP Server chat Đổi tên hiển thị với bạn bè Nghe nhạc trực tuyến từ mp3.zing.vn Tìm kiếm, download hát Mời bạn chát nghe nhạc Tạo Room chat cho nhiều người tham gia Tham gia Room chat co sẵn Hướng dẫn sử dụng Nhóm thực Cửa sổ chat: Cửa sổ Chat: 19 Menu Chức Phím tắt Gởi Emoticons tới bạn Chat Gởi tiếng Buzz tới bạn Chat Mô tả Gởi Emoticons tới bạn Chat Ctrl+G Gởi tiếng Buzz tới bạn Chat Chia sẻ file tới bạn Chat Gởi file tới bạn Chat Chia sẻ hình ảnh Chia sẻ hình ảnh Chia sẻ File Chia sẻ File Chia sẻ file: Gởi file: Bấm "Chọn file cần gửi" chọn file muốn chia sẻ Hỗ trợ tất loại file Sau chọn Gởi Kết trình gởi file cập nhận Trạng thái Lúc chưa gởi: Gởi thành công: 20 Chia sẻ hình ảnh: Gởi ảnh: Sau chọn nút gởi ảnh, cửa sổ Chia sẻ hình ảnh bật lên bên Hình ảnh gởi lên bên, dạng slide hình ảnh Bên gửi ảnh: 21 Bên nhận ảnh: Webcam Hiển thị webcam người chat trực tiếp với 22 Nghe nhạc: Menu Nhập tên hát cần tìm (1) Danh sách hát tìm (2) Thơng tin hát (3) Mời bạn list nghe nhạc (4) Tìm kiếm(5) Tải máy (6) Chức Phím tắt Mơ tả Tìm kiếm hát từ mp3.zing.vn Tìm kiếm hát từ mp3.zing.vn Kết tìm kiếm hát Kết tìm kiếm hát Thông tin liên quan tới hát bao gồm tên hát người trình bày Thơng tin liên quan tới hát bao gồm tên hát người trình bày Mời bạn có danh sách nghe nhạc Mời bạn có danh sách nghe nhạc Tìm kiếm hát Tìm kiếm hát Download hát chọn máy Download hát chọn máy 23 Tạo Room Chat Menu Chức Mô tả Nội dung chat (1) Hiển thị nội dung chat phòng chat Hiển thị nội dung chat phòng chat Danh sách nick tham gia room chat Danh sách nick tham gia room chat Mời bạn có danh sách bạn bè tham gia vào phịng chat Mời bạn có danh sách bạn bè tham gia vào phòng chat Khung soạn nội dung chat Khung soạn nội dung chat Nick Room (2) Mời thêm bạn chat (3) Khung soạn thảo (4) 24 IV- Tài liệu tham khảo: Diễn đàn Cộng đồng C việt - http://www.congdongcviet.com Cộng đồng CodeProject – http://www.codeproject.com 25

Ngày đăng: 12/05/2014, 08:22

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan