Tóm lại, xây dựng một chương trình chat client-server không chỉ giúp chúng tahiểu rõ hơn về cách thức hoạt động của các ứng dụng chat, mà còn cung cấp cơ hội đểhọc hỏi và phát triển kỹ n
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
HOÀNG THỊ DIÊ:U HƯƠNG
Giảng viên hướng dẫn : TS.NGUYỄN HỮU NHẬT MINH
Đà Nẵng, tháng 12 năm 2023
Trang 2TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
HOÀNG THỊ DIÊ:U HƯƠNG
Giảng viên hướng dẫn : TS.NGUYỄN HỮU NHẬT MINH
Đà Nẵng, tháng 12 năm 2023
Trang 3Chương trình chat client-server
LỜI CẢM ƠN
Lời đầu tiên, em xin gửi lời cảm ơn chân thành đến các thầy cô trong trường đãdạy em những kiến thức hay, và các thầy cô trong bộ môn đã truyền đạt những kiếnthức chuyên ngành bổ ích cũng như các kỹ năng trong cuộc sống Giúp cho chúng emtrưởng thành hơn trong quá trình làm đồ án môn học
Đặc biệt, em xin cảm ơn sâu sắc tới giáo viên hướng dẫn TS.Nguyễn Hữu NhậtMinh - Giảng viên khoa Khoa học máy tính, Trường Đại học Công nghệ Thông tin &Truyền thông Việt Hàn - Đại học Đà Nẵng đã tận tình hướng dẫn chu đáo, góp ý theosát giúp em có thể hoàn thành đồ án tốt nhất
Trong quá trình thực hiện đề tài nghiên cứu, bản thân chúng em đã cố gắng nỗ lực,tuy nhiênkhông tránh khỏi sai sót Chúng em mong nhận được sự góp ý của thầy côgiáo, và từ phía hội đồng để đề tài nghiên cứu của chúng em được hoàn thiện hơn.Xin chân thành cảm ơn!
i
Trang 4Chương trình chat client-server
NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN
ii
Trang 5Chương trình chat client-server
MỤC LỤC
LỜI CẢM ƠN i
NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN ii
MỤC LỤC iii DANH MỤC HÌNH ẢNH v
DANH MỤC CÁC TỪ VIẾT TẮT vi
MỞ ĐẦU 1 I.Lý do chọn đề tài 1
II.Mục tiêu của đề tài 1
III.Nội dung chính 1
IV.Kết quả 1
V.Bố cục báo cáo 2
CHƯƠNG 1 CƠ SỞ LÝ THUYẾT 3
1.1 Sơ lược về lập trình hệ thống 3
1.1.1 Khái niệm 3
1.1.2 Tổng quan lập trình hệ thống 3
1.2 Tìm hiểu về truyền thông giữa các tuyến trình – Interprocess Communication 4
1.2.1 Khái niệm Process và IPC 4
1.2.2 Vì sao các process phải giao tiếp với nhau 7
1.2.3 Shared Memory-Trao đổi bằng phân đoạn nhớ chung 7
1.2.4 Một số cơ chế giao tiếp giữa các process trong Linux 8
1.3 Lập trình Socket trên 8
1.3.1 Mô hình client-server 8
1.3.2 Sơ lược về Socket 8
1.3.3 Minh họa lập trình socket 10
1.4 Ngôn ngữ lập trình và các tools 10
1.4.1 C++ 11
iii
Trang 6Chương trình chat client-server
1.4.2 Vmware 13
CHƯƠNG 2 TRIỂN KHAI 15
2.1 Demo chương trình 15
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 18
I.Kết quả đạt được 18
II.Hướng phát triển 18
TÀI LIỆU THAM KHẢO 19
iv
Trang 7Chương trình chat client-server
DANH MỤC HÌNH ẢNH
Hình 1 Sơ lược về lập trình hệ thống 3
Hình 2 Quy trình 6
Hình 3 Share Memory 7
Hình 4 Sơ đồ Stream sockets 9
Hình 5 Sơ đồ Datagram Socket 10
Hình 6 C++ 11
Hình 7 Ưu điểm của ngôn ngữ lập trình C++ 12
Hình 8 Logo VMWare 13
Hình 9 Cấu trúc thư mục 15
Hình 10 Màn hình đăng nhập 16
Hình 11 Màn hình tin nhắn 16
Hình 12 Ghi log tin nhắn 17
Hình 13 Database 17
v
Trang 8Chương trình chat client-server
DANH MỤC CÁC TỪ VIẾT TẮT
1 CNPM Công nghệ phần mềm
2 CNTT Công nghệ thông tin
3 5E Engagement, Exploration, Explanation, Elaboration, Evaluation
vi
Trang 9MỞ ĐẦUI.Lý do chọn đề tài
Hiện nay, với sự phát triển của công nghệ thông tin và mạng internet, việc giaotiếp qua chat trở nên phổ biến và cần thiết hơn bao giờ hết Việc tìm hiểu và xây dựngmột ứng dụng chat client-server giúp chúng ta hiểu rõ hơn về cách thức hoạt động củacác ứng dụng chat thực tế và có thể áp dụng kiến thức này vào các dự án thực tế khác.Xây dựng ứng dụng chat client-server là một dự án phù hợp để học và nghiên cứu
về mạng máy tính, giao thức truyền thông, mã hóa và bảo mật dữ liệu Đề tài này cungcấp cơ hội để làm việc với các khái niệm và công nghệ quan trọng trong lĩnh vực mạng
và bảo mật
Tóm lại, xây dựng một chương trình chat client-server không chỉ giúp chúng tahiểu rõ hơn về cách thức hoạt động của các ứng dụng chat, mà còn cung cấp cơ hội đểhọc hỏi và phát triển kỹ năng lập trình, hiểu về mạng và bảo mật thông tin
II.Mục tiêu của đề tài
- Xây dựng giao diện đơn giản nhưng chi tiết giúp người dùng chat với nhau
- Xây dựng được chương trình chat cục bộ và toàn cục
III.Nội dung chính
- Tìm hiều, ứng dụng các ngôn ngữ lập trình vào thiết kế ứng dụng (C++)
- Tìm hiểu về hiểu giao thức TCP/IP
- Tìm hiểu về mô hình client-server
- Tìm hiểu về lập trình Socket trên Linux
- Tìm hiểu về Shared memory
IV.Kết quả
- Xây dựng thành công chương trình chat theo mô hình client-server
- Có thể tự vận dụng lại các kiến đã được học
- Với quy mô ứng dụng vừa và nhỏ, cộng thêm thời gian không cho phép nên đềtài “Xây dựng chương trình chat theo mô hình client-server” có thể chưa có đầy
đủ các chức năng hoàn thiện của một ứng dụng chat Trong quá trình làm cònnhều sai sót, do kiến thức có hạn chết còn ít nhiều thiếu sót về việc hiển thị
Trang 10Chương trình chat client-server
cũng như tối ưu thuật toán, thời gian thực hiện Cũng như giao diện chưa đượcthân thiện với người dùng Một số lỗi còn xảy ra trong lúc chạy chương trình.Trong tương lai chúng tôi sẽ cố gắng khắc phục những sai sót này
V.Bố cục báo cáo
- Các phần của báo cáo được chia ra thành các chương như sau:
- Chương 1: Cơ sở lý thuyết
- Gồm các cơ sở lý thuyết về các đối tượng được nhắm đến
- Chương 2: Triển khai
- Cuối cùng là sẽ là các phần như: kết luâ †n, hướng phát triển và danh mụctài liệu tham khảo
2
Trang 11CHƯƠNG 1 CƠ SỞ LÝ THUYẾT
1.1 Sơ lược về lập trình hệ thống
1.1.1 Khái niệm
Lập trình hệ thống là quá trình phát triển phần mềm hệ thống So với lập trìnhứng dụng, lập trình hệ thống tập trung vào việc tạo ra phần mềm cung cấp dịch vụ chophần cứng máy tính Mục tiêu của lập trình hệ thống là tạo ra những phần mềm hỗ trợhoạt động và quản lý của hệ thống máy tính
Hình 1 Sơ lược về lập trình hệ thống
Lập trình hệ thống đòi hỏi một sự hiểu biết sâu về phần cứng máy tính Nhà lậptrình hệ thống cần phải nắm vững kiến thức về kiến trúc hệ thống, hệ điều hành, quản
lý tài nguyên và các khái niệm cơ bản của lập trình
Các nhiệm vụ của lập trình hệ thống có thể bao gồm:
- Quản lý tài nguyên: Lập trình hệ thống liên quan đến việc quản lý và phân phối tàinguyên phần cứng, như bộ nhớ, CPU, đĩa cứng và mạng Điều này bao gồm việctối ưu hóa việc sử dụng tài nguyên và đảm bảo tính hiệu quả và đáng tin cậy của hệthống
- Quản lý quá trình: Lập trình hệ thống đảm nhiệm việc quản lý các quá trình, baogồm tạo, kết thúc, lập lịch thực thi và quản lý bộ nhớ
- Giao tiếp với phần cứng: Lập trình hệ thống liên quan đến việc giao tiếp và điềukhiển các thiết bị phần cứng như bàn phím, chuột, máy in, đầu đĩa và các thiết bịngoại vi khác
Lập trình hệ thống đóng vai trò quan trọng trong việc xây dựng các hệ thốngphức tạp như hệ thống điều khiển, máy chủ, hệ thống nhúng và các ứng dụng yêu cầuhiệu năng cao và tương tác trực tiếp với phần cứng
1.1.2 Tổng quan lập trình hệ thống
Những điểm đặc biệt hơn trong lập trình hệ thống:
Trang 12Chương trình chat client-server
- Những nhà lập trình sẽ tạo những gánh vác về phần cứng và một số thuộc tínhkháccủa những chương trình chạy trên hệ thống đó, và sẽ thường khai thácnhững thuộc tính đó (choví dụ bởi việc sử dụng một giải thuật mà được biết màhiệu quả khi nào được sử dụng với phầncứng đặc biệt)
- Thông thường một ngôn ngữ lập trình cấp thấp hoặc tiếng địa phương ngôn ngữlậptrình sử dụng đó là:
Có thể hoạt động trong những môi trường tài nguyên bắt buộc
Là rất hiệu quả và có thể thực hiện một ít ở trên đầu
Có một thư viện thực hiện nhỏ, hoặc không ở mọi thứ
Cho phép trực tiếp và “thô” mà điều khiển qua truy cập bộ nhớ và điềukhiểnchảy tràn
Để cho người lập trình viết những phần của chương trình ngay tức khắctrên ngôn ngữ assembly
Những nhà lập trình hệ thống một cách đầy đủ thì khác với lập trình ứng dụng
mà những ngườilập trình hướng tới chuyên về một hoặc cái khác
Trong lập trình hệ thống, những phương tiện lập trình có hạn thường sẵn có Sự
sử dụng của tập hợp rác tự động thì không phải là phổ biến và gỡ rối là không đổi đôikhi để làm Thư việnthực hiện, nếu sẵn có ở mọi nơi, thì ít mạnh hơn nhiều thôngthường, và làm ít sợ kiểm tra lỗi hơn Bởi vì những sự hạn chế đó, màn hình và sựđăng ký thường được sử dụng; những hệ điềuhành có thể có vô cùng chi tiết hóanhững hệ thống con đăng ký.Thực hiện những phần nhất định trong Hệ điều hành vànhững quy định hoạt động mạng những nhà lập trình hệ thống (cho ví dụ thi hành phântrang (bộ nhớ ảo) hoặc một trình điều khiểnthiết bị cho một hệ điều hành)
1.2 Tìm hiểu về truyền thông giữa các tuyến trình – Interprocess Communication
1.2.1 Khái niệm Process và IPC
- Inter-process communication (IPC) là một cơ chế cho phép trao đổi dữ liệu giữacác quá trình.Bằng cách cung cấp một người dùng với một tập hợp các giao diệnlập trình, IPC giúp một lậptrình tổ chức thực hiện hoạt động giữa các quá trình
4
Trang 13Chương trình chat client-server
khác nhau IPC cho phép một ứng dụng để kiểm soát một ứng dụng khác, do đócho phép chia sẻ dữ liệu mà không cần can thiệp
- Một quy trình là một chuỗi chương trình đang chạy cùng với tất cả các tài nguyên
mà mã của nó có thể ảnh hưởng (còn được gọi là bối cảnh quy trình) Bối cảnh củaquy trình bao gồm trạng thái quy trình, hình ảnh của mã máy thực thi tương ứngvới chương trình, bộ nhớ được phân bổ, bộ mô tả tài nguyên được quy trình sửdụng như bộ mô tả hoặc trình xử lý tệp, các thuộc tính bảo mật như chủ sở hữu quytrình và quyền của quy trình, và cuối cùng, nhưng không kém phần quan trọng,trạng thái bộ xử lý như nội dung của các thanh ghi và địa chỉ bộ nhớ vật lý Trạngthái tiến trình thể hiện trạng thái của tiến trình liên quan đến việc sử dụng thời giancủa bộ xử lý Một tiến trình có thể ở một trong ba trạng thái:
Đang chạy - Tiến trình đang sử dụng CPU (nó đã được phân bổ thời gian xử lý
và mã máy của tiến trình được bộ xử lý thực thi về mặt vật lý)
Bị chặn - Quá trình không thể chạy cho đến khi một số sự kiện bên ngoài xảy ra(ví dụ: dữ liệu được nhận từ mạng) CPU có thể rảnh trong thời gian này nếukhông có tiến trình hiện có nào sẵn sàng để chạy
Ready (Runnable) - Tiến trình đã sẵn sàng để chạy (không phải đợi sự kiện nàoxảy ra), nhưng nó được hệ điều hành tạm dừng để cho các tiến trình khác chạytrên cùng CPU
- Hình 1.2 trình bày bằng đồ họa các chuyển đổi trạng thái xảy ra trong vòng đời củamột quy trình Tùy thuộc vào thuật toán lập lịch của hệ điều hành và đặc thù củaquy trình (ứng dụng người dùng), trạng thái của quy trình sẽ dao động định kỳ giữa
ba trạng thái được mô tả trong hình Hình 1.2 minh họa tất cả các chuyển đổi trạngthái có thể xảy ra trong các tình huống sau:
Transition 1 - Xảy ra khi một tiến trình không thể tiếp tục vì nó đang chờ một
sự kiện bên ngoài nào đó Ví dụ: khi một tiến trình bắt đầu kết nối đến máy chủ,tiến trình đó sẽ bị chặn cho đến khi máy chủ phản hồi
Chuyển tiếp 2 - Gây ra bởi bộ lập lịch tiến trình khi nó quyết định tạm dừngviệc thực thi tiến trình hiện tại và cho một tiến trình khác có cơ hội chạy Quá
5
Trang 14Chương trình chat client-server
trình bị gián đoạn và trạng thái của nó được lưu lại để tiếp tục hoạt động từcùng thời điểm mà nó bị gián đoạn mà không bị gián đoạn
Chuyển tiếp 3 - Gây ra bởi bộ lập lịch quy trình khi nó quyết định cho một quytrình sẵn sàng có cơ hội chạy Chuyển tiếp 2 và 3 về cơ bản đang tạo ra ảo giác
về việc xử lý song song
Hình 2 Quy trình
Chuyển tiếp 4—Xảy ra khi xảy ra sự kiện bên ngoài mà quá trình bị chặn đangchờ đợi (chẳng hạn như sự xuất hiện của một số thông báo đầu vào) Quá trìnhchuyển đổi này thường được kích hoạt bởi tín hiệu gián đoạn bộ xử lý được tạobởi thiết bị ngoại vi I/O tương ứng hoặc giao diện mạng
- Khi nhiều tiến trình ở trạng thái SẴN SÀNG, hệ điều hành phải quyết định tiếntrình nào trong số chúng sẽ chạy trước Nó sử dụng thuật toán lập lịch để xác địnhcác quy trình sẽ được phân bổ thời gian xử lý và theo thứ tự nào Các thuật toán lập
kế hoạch, như được mô tả bằng đồ họa trong Hình 1.3, đồng thời xác định thờiđiểm dừng một tiến trình và dành thời gian cho CPU cho một tiến trình khác Cácthuật toán lập lịch có thể thực hiện việc này một cách tự nguyện (“lập lịch không
ưu tiên”) hoặc bắt buộc (“lập lịch ưu tiên”) Lập lịch không ưu tiên liên quan đếnviệc các tiến trình sẵn sàng từ bỏ thời gian của bộ xử lý để cho phép các tiến trìnhkhác chạy Điều này thường xảy ra khi tiến trình hiện đang chạy phải chuyển sangtrạng thái BLOCKED, trong khi chờ sự kiện bên ngoài Khi lập lịch ưu tiên được
sử dụng, quy trình hiện đang chạy sẽ bị buộc vào trạng thái SẴN SÀNG để cho
6
Trang 15Chương trình chat client-server
phép các quy trình khác chạy Lập lịch ưu tiên có thể được thực hiện theo chínhsách lập lịch
1.2.2 Vì sao các process phải giao tiếp với nhau
Việc cho phép truyền data giữa các process là do những lý do sau:
- Giúp chia sẻ thông tin giữa các users
- Giúp speech up các tác vụ trong máy tính
- Giúp xây dựng modun
- Giúp thuận tiện trong chạy nhiều tác vụ cùng một lúc
1.2.3 Shared Memory-Trao đổi bằng phân đoạn nhớ chung
Shared memory (bộ nhớ được chia sẻ) là cơ chế giao tiếp liên tiến trình (IPC) cósẵn trong Linux và các hệ thống giống Unix khác, khi một bộ nhớ chung được sử dụngcho hai hoặc nhiều tiến trình khác nhau
Trong các cơ chế giao tiếp giữa các tiến trình khác như các pipe (đường ống) haymessage queue (hàng đợi tin nhắn), cần thực hiện các bước gửi dữ liệu từ tiến trìnhnày sang trình khác Tuy nhiên, đối với shared memory, không có bất kỳ hành vitruyền dữ liệu nào cần phải thực hiện ở đây cả, các tiến trình đều có thể truy cập vào
bộ nhớ chung Và giao tiếp được thực hiện thông qua bộ nhớ được chia sẻ này, nơi cácthay đổi được thực hiện bởi một tiến trình có thể được xem bởi tiến trình khác
Hình 3 Share Memory
7
Trang 16Chương trình chat client-server
Ở đây, các tiến trình chia sẻ một vùng nhớ vật lý thông qua trung gian không gianđịa chỉ của chúng Một vùng nhớ chia sẻ tồn tại độc lập với các tiến trình, và khi mộttiến trình muốn truy xuất đến vùng nhớ này, tiến trình phải kết gắn vùng nhớ chung đóvào không gian địa chỉ riêng của từng tiến trình, và thao tác trên đó như một vùng nhớriêng của mình
1.2.4 Một số cơ chế giao tiếp giữa các process trong Linux
Linux cung cấp một số cơ chế giao tiếp giữa các tiến trình gọi là IPC(Inter-ProcessCommunication):
Signals handling - Trao đổi bằng tín hiệu
Pipe -Trao đổi bằng cơ chế đường ống
Message Queues - Trao đổi thông qua hàng đợi tin nhắn
Shared Memory - Trao đổi bằng phân đoạn nhớ chung
Giao tiếp thông qua socket
Giao tiếp đồng bộ dùng semaphore
- Mỗi khi kết nối được thiết lập, cả 2 bên đều có thể trao đổi (gửi và nhận dữ liệu)
- Để thiết lập một kết nối cho cả 2 phía, cần xây dựng một socket Có thể hiểu socketnhư một điểm đầu cuối của kênh kết nối giữa 2 tiến trình
1.3.2 Sơ lược về Socket
Socket là điểm cuối end-point trong liên kết truyền thông hai chiều (two-waycommunication)biểu diễn kết nối giữa Client – Server Các lớp Socket được ràng buộcvới một cổng port (thểhiện là một con số cụ thể) để các tầng TCP (TCP Layer) có thểđịnh danh ứng dụng mà dữ liệu sẽ được gửi tới
Có 2 loại socket được sử dụng rộng rãi là: stream sockets và datagram sockets
8
Trang 17Chương trình chat client-server
- Stream sockets: Dựa trên giao thức TCP (Tranmission Control Protocol), là giaothức hướngluồng (stream oriented) Việc truyền dữ liệu chỉ thực hiện giữa 2 tiếntrình đã thiết lập kết nối.Giao thức này đảm bảo dữ liệu được truyền đến nơi nhậnmột cách đáng tin cậy, đúng thứ tựnhờ vào cơ chế quản lý luồng lưu thông trênmạng và cơ chế chống tắc nghẽn
Hình 4 Sơ đồ Stream sockets
- Datagram sockets: Dựa trên giao thức UDP (User Datagram Protocol), là giao thứchướngthông điệp (message oriented) Việc truyền dữ liệu không yêu cầu có sự thiếtlập kết nối giữatiến quá trình Ngược lại với giao thức TCP thì dữ liệu được truyềntheo giao thức UDP khôngđược tin cậy, có thế không đúng trình tự và lặp lại Tuynhiên vì nó không yêu cầu thiết lập kếtnối không phải có những cơ chế phức tạpnên tốc độ nhanh… ứng dụng cho các ứng dụng truyền dữ liệu nhanh như chat,game…
9