CĂN BẢN VỀ MẠNG MÁY TÍNH
Định nghĩa mạng máy tính
Mạng máy tính là một hệ thống gồm nhiều máy tính kết nối với nhau qua các đường truyền, cho phép trao đổi thông tin Đường truyền có thể là thiết bị truyền dẫn có dây hoặc không dây, chuyển tín hiệu điện tử giữa các máy tính dưới dạng xung nhị phân Tất cả tín hiệu đều thuộc dạng sóng điện từ, và tùy thuộc vào tần số, có thể sử dụng các loại đường truyền vật lý khác nhau như cáp đồng trục, cáp xoắn, cáp quang, dây điện thoại, hoặc sóng vô tuyến Hai khái niệm đường truyền và cấu trúc mạng là những đặc trưng cơ bản của mạng máy tính.
Hình 1.1- Một mô hình các máy tính liên kết trong mạng
Nhu cầu phát triển mạng máy tính
Hiện nay, với sự gia tăng nhanh chóng số lượng máy tính trong các văn phòng và cơ quan, việc kết nối chúng trở nên thiết yếu Việc này không chỉ giúp nâng cao hiệu quả làm việc mà còn mang lại nhiều lợi ích cho người sử dụng.
Mạng máy tính đã trở thành một phần thiết yếu trong cuộc sống hàng ngày, đáp ứng nhu cầu xử lý thông tin ngày càng tăng trong nhiều lĩnh vực như khoa học, quân sự, quốc phòng, thương mại, dịch vụ và giáo dục.
Người ta thấy được việc kết nối các máy tính thành mạng cho chúng ta những khả năng mới to lớn như:
Sử dụng tài nguyên chung cho phép mọi thành viên trong mạng tiếp cận các thiết bị, chương trình và dữ liệu mà không cần quan tâm đến vị trí của những tài nguyên này Điều này tạo ra sự thuận tiện và hiệu quả trong việc chia sẻ và sử dụng tài nguyên.
Để tăng độ tin cậy của hệ thống, việc bảo trì máy móc trở nên dễ dàng hơn, cùng với khả năng lưu trữ dữ liệu chung (backup) hiệu quả Khi xảy ra sự cố trong hệ thống, dữ liệu có thể được khôi phục nhanh chóng Ngoài ra, nếu một trạm làm việc gặp trục trặc, người dùng có thể dễ dàng sử dụng các trạm khác để thay thế, đảm bảo hoạt động liên tục và ổn định.
Nâng cao chất lượng và hiệu quả trong việc khai thác thông tin là yếu tố quan trọng, khi thông tin có thể được sử dụng chung, nó giúp người sử dụng tổ chức lại công việc một cách linh hoạt và thích ứng với những thay đổi về chất.
+ Ðáp ứng những nhu cầu của hệ thống ứng dụng kinh doanh hiện đại + Cung cấp sự thống nhất giữa các dữ liệu
+ Tăng cường năng lực xử lý nhờ kết hợp các bộ phận phân tán
+ Tăng cường truy nhập tới các dịch vụ mạng khác nhau đang được cung cấp trên thế giới
Với sự gia tăng nhu cầu trong xã hội, vấn đề kỹ thuật mạng trở thành mối quan tâm hàng đầu của các chuyên gia công nghệ thông tin Việc truy xuất thông tin nhanh chóng và tối ưu là rất quan trọng, đặc biệt khi lượng thông tin trên mạng ngày càng lớn, có thể dẫn đến tình trạng tắc nghẽn và mất mát dữ liệu Hiện nay, việc xây dựng một hệ thống mạng hoạt động hiệu quả, an toàn và mang lại lợi ích kinh tế cao đang được chú trọng.
Phân loại mạng máy tính
Hiện nay, mạng máy tính phát triển rộng rãi với nhiều ứng dụng đa dạng, dẫn đến việc phân loại mạng máy tính trở nên phức tạp hơn bao giờ hết.
Dựa theo phạm vi phân bố của mạng ta có thể phân ra các loại mạng như sau:
Mạng cục bộ LAN (Local Area Network) là một hệ thống kết nối giữa các máy tính và thiết bị truyền thông trong một khu vực hạn chế, chẳng hạn như tòa nhà, khuôn viên trường đại học hoặc khu giải trí.
Các mạng LAN thường có đặc điểm sau:
+ Băng thông lớn, có khả năng chạy các ứng dụng trực tuyến như xem phim, hội thảo qua mạng
+ Kích thước mạng bị giới hạn bởi các thiết bị
+ Chi phí các thiết bị mạng LAN tương đối rẻ
Hình 1.2- Mô hình mạng cục bộ LAN
Mạng đô thị MAN (Metropolitan Area Network) tương tự như mạng LAN nhưng phạm vi hoạt động của nó rộng hơn, bao phủ một thành phố hoặc một quốc gia Mạng MAN kết nối các mạng LAN khác nhau thông qua nhiều phương tiện truyền dẫn như cáp quang, cáp đồng và sóng, cùng với các phương thức truyền thông đa dạng Những đặc điểm nổi bật của mạng MAN bao gồm khả năng mở rộng và tính linh hoạt trong việc kết nối các mạng cục bộ.
Băng thông mức trung bình là yếu tố quan trọng, đáp ứng nhu cầu cho các ứng dụng cấp thành phố và quốc gia, bao gồm chính phủ điện tử, thương mại điện tử và các dịch vụ ngân hàng.
+ Do MAN nối kết nhiều LAN với nhau nên độ phức tạp cũng tăng đồng thời công tác quản trị sẽ khó khăn hơn
+ Chi phí các thiết bị mạng MAN tương đối đắt tiền
Mạng diện rộng WAN (Wide Area Network) là loại mạng bao phủ một vùng địa lý rộng lớn, có thể là một quốc gia, lục địa hoặc toàn cầu, thường được sử dụng bởi các công ty đa quốc gia Mạng WAN bao gồm nhiều mạng LAN kết nối với nhau thông qua các phương tiện như vệ tinh, sóng vi ba, cáp quang và cáp điện thoại Đặc điểm nổi bật của mạng WAN là khả năng kết nối các địa điểm xa xôi, tạo điều kiện cho việc truyền tải dữ liệu trên quy mô lớn.
+ Băng thông thấp, dễ mất kết nối, thường chỉ phù hơp với các ứng dụng offine như e-mail, web, ftp…
+ Phạm vi hoạt động rộng lớn không giới hạn
Mạng toàn cầu, được hình thành từ việc kết nối nhiều LAN và WAN, có cấu trúc phức tạp và thường được quản lý bởi các tổ chức quốc tế.
+ Chi phí cho các thiết bị và các công nghệ mạng WAN rất đắt tiền
Hình 1.3- Mô hình mạng diện rộng(WAN)
Mạng Internet là một dạng đặc biệt của mạng WAN, cung cấp các dịch vụ toàn cầu như email, web, chat và FTP, đồng thời phục vụ miễn phí cho tất cả người dùng.
Một số topo mạng thông dụng
Mạng máy tính được định nghĩa là tập hợp các máy tính được kết nối với nhau qua các đường truyền vật lý theo một kiến trúc nhất định, gọi là Topology Có ba loại kiến trúc mạng phổ biến: mạng hình sao (Star Topology), mạng dạng tuyến (Bus Topology) và mạng dạng vòng (Ring Topology).
Topology vòng (Ring Topology) là một mạng được thiết kế theo hình dạng vòng tròn, với cáp được kết nối thành một vòng khép kín Tín hiệu trong mạng này di chuyển theo một chiều duy nhất, và tại mỗi thời điểm, chỉ có một nút có khả năng truyền tín hiệu cho các nút khác Một ưu điểm của mạng vòng là khả năng mở rộng dễ dàng, tuy nhiên, nếu đường dây bị ngắt ở bất kỳ vị trí nào, toàn bộ hệ thống sẽ bị gián đoạn.
Bus Topology là một dạng mạng trong đó tất cả các nút được kết nối qua một đường truyền chính (bus), được giới hạn bởi các đầu nối đặc biệt gọi là Terminator Khi một nút truyền dữ liệu, tín hiệu sẽ được phát đi theo hai chiều trên bus, và mọi nút khác sẽ nhận tín hiệu trực tiếp Mạng này sử dụng ít cáp và dễ lắp đặt, nhưng cũng gặp phải một số bất lợi như ùn tắc khi lưu lượng lớn và khó phát hiện sự cố ở các đoạn cáp Nếu một nút ngừng hoạt động, toàn bộ hệ thống sẽ bị ảnh hưởng.
Hình 1.5- Bus Topology Hình 1.6- Star Topology
Mạng hình sao (Star Topology) bao gồm một bộ trung tâm và các nút thông tin như trạm cuối, máy tính hoặc thiết bị mạng khác Nguyên lý hoạt động của mạng này là nối song song, cho phép mạng vẫn duy trì hoạt động bình thường ngay cả khi một nút bị hỏng Mạng hình sao có khả năng mở rộng hoặc thu hẹp linh hoạt theo nhu cầu của người sử dụng, tuy nhiên, việc mở rộng phụ thuộc vào khả năng của bộ trung tâm.
Giao thức mạng
Giao thức mạng là tập hợp các quy tắc và quy ước cho việc trao đổi thông tin giữa các hệ thống máy tính hoặc thiết bị máy tính Nó có thể được hiểu như một ngôn ngữ mà các máy tính trong mạng sử dụng để giao tiếp và truyền dữ liệu Trong số nhiều loại giao thức mạng như Apple Talk, DLC, và NetBEUI, giao thức TCP/IP hiện đang là giao thức phổ biến nhất trong các mạng máy tính.
1.5.1 Giao thức TCP Định nghĩa: TCP(Transmission Control Protocol) là giao thức hướng kết nối, nó cung cấp một đường truyền dữ liệu tin cậy giữa hai máy tính Tính tin cậy thể hiện ở việc nó đảm bảo dữ liệu được gửi sẽ đến được đích và theo đúng thứ tự như khi nó được gửi
Khi hai ứng dụng cần giao tiếp một cách tin cậy, chúng sẽ thiết lập một kết nối để gửi dữ liệu, tương tự như cách chúng ta gọi điện thoại Ví dụ, khi bạn quay số để gọi người thân, một kết nối được tạo ra giữa hai điện thoại, cho phép bạn gửi và nhận dữ liệu dưới dạng âm thanh Toàn bộ quá trình kết nối và truyền dữ liệu diễn ra nhờ công ty điện thoại qua các trạm và đường dây, trong khi bạn chỉ cần cung cấp số điện thoại Tương tự, trong việc truyền dữ liệu qua mạng, TCP đóng vai trò như nhà cung cấp dịch vụ điện thoại, tạo kết nối và đảm bảo dữ liệu được truyền đi một cách an toàn và đúng thứ tự Tính tin cậy của đường truyền được thể hiện qua hai điểm quan trọng.
Mỗi gói tin cần gửi sẽ đến đích thông qua việc gửi và nhận xác nhận từ bên nhận Nếu bên gửi không nhận được xác nhận trong một khoảng thời gian nhất định, gói tin sẽ được phát lại Quá trình phát lại sẽ tiếp tục cho đến khi truyền tin thành công Tuy nhiên, nếu sau một số lần phát lại tối đa mà vẫn không thành công, bên gửi sẽ kết luận rằng không thể truyền tin và sẽ dừng việc phát tin.
Các gói tin được gửi qua mạng có thể đến đích không theo thứ tự, do chúng có thể đi qua nhiều đường khác nhau Để đảm bảo thứ tự chính xác khi nhận, giao thức TCP gán thông tin thứ tự cho mỗi gói tin trong khối dữ liệu Nhờ vậy, bên nhận có thể sắp xếp lại các gói tin theo đúng thứ tự như khi chúng được gửi.
TCP cung cấp một kênh truyền thông điểm-điểm đáng tin cậy cho các ứng dụng như HTTP, FTP và Telnet, nơi mà thứ tự dữ liệu gửi và nhận là rất quan trọng cho sự thành công Ví dụ, khi sử dụng HTTP để truy cập thông tin từ một URL, dữ liệu cần được nhận theo đúng thứ tự gửi; nếu không, người dùng có thể nhận được một trang HTML lộn xộn hoặc một file zip bị lỗi không thể giải nén.
1.5.2 Giao thức UDP Định nghĩa: UDP (User Datagram Protocol) là giao thức không hướng kết nối, nó gửi các gói dữ liệu độc lập gọi là datagram từ máy tính này đến máy tính khác mà không đảm bảo việc dữ liệu sẽ tới đích Ở phần trước chúng ta đã thấy trong giao thức TCP khi hai chương trình muốn giao tiếp với nhau qua mạng chúng tạo ra một kết nối liên kết hai ứng dụng và trao đổi dữ liệu qua kết nối đó Trái lại ở giao thức UDP khi hai ứng dụng muốn giao tiếp với nhau chúng không tạo ra kết nối mà chỉ đơn thuần gửi các gói tin một cách độc lập từ máy này tới máy khác.Các gói tin như vậy gọi là các datagram Việc gửi các gói tin như vậy tương tự như việc chúng ta gửi thư qua đường bưu điện Các bức thư bạn gửi độc lập với nhau, thứ tự các thư là không quan trọng và không có gì đảm bảo là thư sẽ đến được đích Trong truyền thông bằng UDP thì các datagram giống như các lá thư, chúng chứa thông tin cần gửi đi cùng thông tin về địa chỉ đích mà chúng phải đến, tuy nhiên chúng khác với các lá thư ở một điểm là nếu như trong việc gửi thư, nếu lá thư của bạn không đến được đích thì nó sẽ được gửi trả lại nơi gửi nêu trên lá thư đó bạn có đề địa chỉ gửi còn UDP sẽ không thông báo gì cho phía gửi về việc lá thư đó có tới được đích hay không
Mặc dù UDP là một giao thức không đảm bảo giao tiếp tin cậy, nhưng nó vẫn được sử dụng trong nhiều trường hợp Điều này là do giao thức TCP, mặc dù cung cấp kết nối tin cậy, lại yêu cầu thời gian truyền tải lâu hơn do cần kiểm tra các header và đảm bảo thứ tự các gói tin, cũng như phát lại các gói tin bị mất Trong một số tình huống, việc đảm bảo độ tin cậy không phải là điều cần thiết, và dưới đây là một số trường hợp mà giao thức không hướng kết nối như UDP lại phù hợp hơn so với giao thức hướng kết nối như TCP.
Khi việc truyền một gói dữ liệu không cần thiết phải đảm bảo đến đích, giao thức UDP là lựa chọn tối ưu vì loại bỏ các thủ tục kết nối phức tạp So với giao thức TCP, cần tới bảy gói tin để gửi một gói do yêu cầu và xác nhận kết nối, trong khi UDP chỉ sử dụng một gói tin duy nhất để truyền dữ liệu.
Một ví dụ điển hình về server đồng hồ là khi nó gửi thời gian hiện tại đến các ứng dụng trên client khi có yêu cầu Nếu gói tin chứa thời gian bị mất trên đường truyền, client sẽ không yêu cầu server gửi lại gói tin đó, vì thông tin thời gian trong gói tin phát lại sẽ không còn chính xác Khi client gửi hai yêu cầu và nhận gói tin không theo thứ tự, client vẫn có thể suy ra thứ tự bằng cách kiểm tra thời gian trong các gói Do đó, tính tin cậy của TCP không cần thiết trong trường hợp này, vì nó có thể làm giảm hiệu suất và cản trở hoạt động của server.
Giao thức UDP thường được sử dụng trong các ứng dụng đòi hỏi độ trễ thấp, như nghe audio thời gian thực Trong trường hợp này, việc có một kênh giao tiếp tin cậy không phải là ưu điểm, mà ngược lại, có thể gây ra sự chậm trễ khi chờ nhận gói tin bị mất, ảnh hưởng đến trải nghiệm người dùng Các ứng dụng không hướng kết nối, như RealAudio, đã được phát triển để truyền tải dữ liệu âm thanh qua mạng một cách hiệu quả hơn.
Bảng sau so sánh sự khác biệt giữa hai chế độ giao tiếp hướng kết nối và không hướng kết nối
Chế độ có hướng kết nối(TCP) Chế độ không hướng kết nối(UDP)
Tồn tại kênh giao tiếp ảo giữa hai bên giao tiếp
Không tồn tại kênh giao tiếp ảo giữa hai bên giao tiếp
Dữ liệu được truyền đi một cách an toàn, với cơ chế kiểm tra lỗi giúp phát hiện và sửa chữa các gói tin bị lỗi hoặc mất thứ tự trong quá trình gửi.
Dữ liệu được gửi đi theo chế độ không bảo đảm, tức là không có kiểm tra lỗi, không phát hiện và không truyền lại các gói tin bị lỗi hoặc mất, cũng như không đảm bảo thứ tự đến của các gói tin.
Dữ liệu chính xác, tốc độ truyền chậm Dữ liệu không chính xác, tốc độ truyền nhanh
Thích hợp cho các ứng dụng cần tốc độ, không cần chính xác cao: Truyền âm thanh, hình ảnh
Các mô hình hoạt động của mạng máy tính
Mô hình hoạt động của mạng máy tính có hai loại:
- Mô hình hoạt động peer to peer
- Mô hình hoạt động clients/server
1.6.1 Mô hình hoạt động peer to peer
Trong mạng lưới máy tính, không có máy chuyên dụng hay cấu trúc phân cấp; mọi máy tính đều bình đẳng và thực hiện cả vai trò máy khách lẫn máy chủ Điều này có nghĩa là không có máy nào được chỉ định để quản lý toàn bộ mạng Người dùng trên từng máy tự quyết định dữ liệu nào sẽ được chia sẻ để sử dụng chung trong mạng.
Hình 1.7- Mô hình peer to peer
1.6.2 Mô hình hoạt động clients/ server
Trong mô hình mạng Clients/Server, có một hoặc nhiều máy chủ (server) cung cấp dịch vụ cho các máy tính khác trong mạng, được gọi là máy khách (clients).
Mô hình mạng Clients/Server là một cấu trúc tổng quát, cho phép nhiều máy chủ kết nối với nhau để nâng cao hiệu suất làm việc Khi nhận được yêu cầu từ client, server có khả năng xử lý trực tiếp yêu cầu đó hoặc chuyển tiếp yêu cầu đến một server khác để xử lý.
Máy chủ (server) thực hiện các nhiệm vụ theo yêu cầu từ máy khách (client) Nhiều dịch vụ trực tuyến hoạt động dựa trên nguyên tắc nhận yêu cầu từ client, xử lý thông tin và trả về kết quả cho client.
CĂN BẢN VỀ NGÔN NGỮ LẬP TRÌNH JAVA
Giới thiệu Java
Java là một ngôn ngữ lập trình được Sun Microsystems giới thiệu vào tháng
Java, ra mắt vào năm 1995, đã nhanh chóng trở thành công cụ lập trình ưa chuộng của các lập trình viên chuyên nghiệp Được phát triển dựa trên nền tảng của C và C++, Java không chỉ kế thừa cú pháp của C mà còn tích hợp các đặc trưng hướng đối tượng của C++.
Vào năm 1991, nhóm kỹ sư của Sun Microsystems đã phát triển một ngôn ngữ lập trình mới nhằm điều khiển các thiết bị điện tử như TV, máy giặt và lò nướng Mặc dù ngôn ngữ C và C++ có thể thực hiện nhiệm vụ này, nhưng chúng lại phụ thuộc vào từng loại CPU, gây khó khăn trong việc áp dụng rộng rãi.
Trình biên dịch thường tốn nhiều thời gian và chi phí để xây dựng, do đó việc phát triển một trình biên dịch riêng cho mỗi loại CPU là rất tốn kém Nhu cầu thực tế hiện nay đòi hỏi một ngôn ngữ lập trình nhanh, gọn, hiệu quả và độc lập với thiết bị, cho phép chạy trên nhiều loại CPU và trong các môi trường khác nhau.
Ngôn ngữ lập trình "Oak" được ra mắt và đổi tên thành Java vào năm 1995 Mặc dù không được thiết kế ban đầu cho Internet, nhưng với tính năng không phụ thuộc vào thiết bị, Java nhanh chóng trở thành ngôn ngữ phổ biến cho phát triển ứng dụng trên Internet.
Một số tính chất của ngôn ngữ Java
- Độc lập phần cứng và hệ điều hành
Các nhà thiết kế Java hướng đến việc phát triển một ngôn ngữ lập trình dễ học và quen thuộc với nhiều lập trình viên Vì vậy, Java đã loại bỏ những đặc trưng phức tạp, giúp người dùng dễ dàng tiếp cận và sử dụng.
- Loại bỏ thao tác con trỏ, thao tác định nghĩa chồng toán tử
- Không cho phép đa kế thừa mà sử dụng các giao diện
- Không sử dụng lệnh “goto” cũng như file header (.h)
- Loại bỏ cấu trúc “struct” và “union”
Java là ngôn ngữ lập trình hoàn toàn hướng đối tượng, yêu cầu mọi chương trình phải được xây dựng dựa trên các đối tượng Khác với C/C++, nơi có thể tạo ra các hàm độc lập, Java chỉ cho phép tạo các phương thức gắn liền với đối tượng Ngoài ra, Java không hỗ trợ đa kế thừa cho các đối tượng, mà thay vào đó sử dụng giao diện để thực hiện tính năng này.
2.2.3 Độc lập phần cứng và hệ điều hành Đối với các ngôn ngữ lập trình truyền thống như C/ C++, phương pháp biên dịch được thực hiện như sau :
Hình 2.1- Cách biên dịch chương trình truyền thống
Mỗi nền tảng phần cứng yêu cầu một trình biên dịch riêng để biên dịch mã nguồn chương trình Khi chuyển sang nền tảng phần cứng khác, mã nguồn cần được biên dịch lại Tuy nhiên, với các chương trình Java, trình biên dịch Java chuyển mã nguồn thành bytecode Khi chạy trên nền tảng khác, máy ảo Java sử dụng trình thông dịch để chuyển đổi bytecode thành mã có thể chạy trên phần cứng tương ứng, do đó không cần biên dịch lại mã nguồn Java khi thay đổi nền tảng phần cứng.
Hình 2.2- Dịch chương trình Java
Java là ngôn ngữ yêu cầu chặt chẽ về kiểu dữ liệu
- Kiểu dữ liệu phải khai báo tường minh
- Java không sử dụng con trỏ và các phép toán con trỏ
- Java kiểm tra tất cả các truy nhập đến mảng, chuỗi khi thực thi để đảm bảo rằng các truy nhập đó không ra ngoài giới hạn kích thước
Trong lập trình truyền thống, lập trình viên phải tự quản lý bộ nhớ, bao gồm việc cấp phát và giải phóng bộ nhớ trước khi chương trình kết thúc Tuy nhiên, điều này có thể dẫn đến lỗi nếu họ quên giải phóng bộ nhớ đã cấp Ngược lại, trong Java, lập trình viên không cần lo lắng về việc này, vì quá trình cấp phát và giải phóng bộ nhớ được tự động hóa thông qua dịch vụ thu nhặt rác (garbage collection), giúp giảm thiểu rủi ro và tăng hiệu quả lập trình.
- Cơ chế bẫy lỗi của java giúp đơn giản hóa quá trình xử lý lỗi và hồi phục sau lỗi
Java cung cấp một môi trường quản lý thực thi chương trình với nhiều mức để kiểm soát tính an toàn:
- Ở mức thứ nhất, dữ liệu và các phương thức được đóng gói bên trong lớp Chúng chỉ được truy xuất thông qua các giao diện mà lớp cung cấp
- Ở mức thứ hai, trình biên dịch kiểm soát để đảm bảo mã là an toàn, và tuân theo các nguyên tắc của java
- Mức thứ ba được đảm bảo bởi trình thông dịch Chúng kiểm soát xem bytecode có đảm các quy tắc an toàn trước khi thực thi
- Mức thứ tư kiểm soát việc nạp các lớp vào bộ nhớ để giám sát việc vi phạm giới hạn truy xuất trước khi nạp vào hệ thống
Java được phát triển để hỗ trợ các ứng dụng mạng thông qua các lớp mạng (java.net) Ngoài ra, Java tương thích với nhiều nền tảng khác nhau, khiến nó trở thành công cụ phát triển phổ biến trên Internet, nơi có sự đa dạng về nền tảng sử dụng.
Chương trình Java hỗ trợ giải pháp đa luồng (Multithreading) cho phép thực hiện các công việc đồng thời, đồng thời cung cấp cơ chế đồng bộ giữa các luồng Tính năng này giúp xây dựng các ứng dụng mạng hiệu quả hơn.
Java được phát triển như một ngôn ngữ động, phù hợp với các môi trường mở Chương trình Java chứa nhiều thông tin thực thi, giúp kiểm soát và truy cập đối tượng trong thời gian chạy, từ đó cho phép liên kết động mã hiệu quả.
Các dạng chương trình ứng dụng của Java
2.3.1 Chương trình ứng dụng độc lập (Application)
Chương trình ứng dụng dạng độc lập là một chương trình nguồn có thể thực hiện trực tiếp sau khi được biên dịch Trong Java, chương trình độc lập bắt đầu và kết thúc tại phương thức main(), tương tự như hàm main() trong các chương trình C/C++.
Khi xây dựng một ứng dụng độc lập cần lưu ý:
1 Tạo lập một lớp được định nghĩa bởi người sử dụng có phương thức main() gọi là lớp chính và bảo đảm nó được định nghĩa đúng theo đúng nguyên mẫu được quy định bởi java
2 Kiểm tra xem liệu tệp chương trình có tên trùng với tên của lớp chính và đuôi là “.java” hay không
3 Dịch tệp chương trình nguồn “.java” để tạo ra các tệp mã bytecode có đuôi “.class” tương ứng
4 Sử dụng chương trình thông dịch của Java để chạy chương trình đã dịch
2.3.2 Chương trình ứng dụng nhúng(Applet)
Applet là một chương trình Java đặc biệt, yêu cầu mã lệnh phải được nhúng vào trang web (các file có đuôi HTM hoặc HTML) Trình duyệt web như Netscape hoặc Internet Explorer sẽ thực thi các thẻ HTML, trong khi đoạn mã của Applet sẽ được máy ảo Java thực hiện trong trình duyệt Ngoài ra, người dùng cũng có thể sử dụng trình Appletviewer của JDK để chạy một Applet.
Một chương trình dạng Applet bao gồm hai tệp: “.java ” và “.html ”
Chu trình hoạt động cuả Applet:
Chương trình ứng dụng Applet được thực hiện như sau:
Khi một applet được nạp và chạy trên trình duyệt web, nó sẽ gửi thông điệp init() kèm theo dữ liệu và kích thước của cửa sổ, giúp khởi động chương trình applet.
- Khi bắt đầu thực hiện, Web Browser thông báo cho applet bắt đầu bằng cách gọi phương thức start()
- Khi rời khỏi trang Web có chứa applet thì chương trình applet này nhận được thông điệp stop() để dừng chương trình
Hoạt động của chương trình applet được mô tả như hình dưới:
Hình 2.3- Chu trình hoạt động của applet
- init(): phương thức này được gọi khi applet được nạp lần đầu và được xem như là toán tử tạo lập cho applet
- start(): được gọi khi applet bắt đầu thực hiện, xuất hiện khi:
- stop(): được gọi khi applet dừng thực hiện, nhưng chưa bị loại bỏ khỏi bộ nhớ
- destroy(): được gọi ngay trước khi applet kết thúc, khi trình duyệt Web được đóng lại và applet bị loại bỏ khỏi bộ nhớ
2.3.3 Chương trình ứng dụng dạng lai ghép
Java cho phép phát triển chương trình có khả năng chạy trên cả trình duyệt web (Applet) và dưới dạng ứng dụng độc lập (Application) Để tạo ra một chương trình như vậy, cần thực hiện một số bước nhất định.
- Định nghĩa lớp ứng dụng mở rộng từ lớp Applet
- Trong lớp ứng dụng phải có hàm main()
Cấu trúc của tệp chương trình Java
Tệp chương trình java có thể có các phần được đặc tả như sau:
Một gói trong lập trình được định nghĩa thông qua định danh của nó, bao gồm tất cả các lớp và interface có trong tệp chứa gói Nếu không chỉ định gói, các định nghĩa trong tệp sẽ thuộc về gói mặc định.
- Một số lệnh nhập import
- Một số định nghĩa lớp và interface có thể định nghĩa theo thứ tự bất kỳ Trong đó thường là lớp public
Như vậy, cấu trúc của một tệp chương trình Java có thể khái quát như sau:
// Định nghĩa gói package Têngói;
// các gói cần sử dụng import java.io.*;
// Định nghĩa các lớp và các interface public class New{ } class C1 { } interface I1 { }
LẬP TRÌNH SOCKET TRONG JAVA
Khái niệm Socket
Khái niệm Socket ra đời vào những năm 1980 tại trường đại học Berkeley, Mỹ, với mục tiêu giúp các máy tính kết nối mạng và trao đổi thông tin Ban đầu, Socket được sử dụng trên các hệ thống Unix và được gọi là Berkeley Socket Interface.
Với sự phát triển của các ứng dụng mạng, socket hiện được hỗ trợ trong nhiều ngôn ngữ lập trình và hoạt động trên nhiều hệ điều hành khác nhau Chẳng hạn, WinSock được sử dụng cho các ứng dụng của Microsoft, trong khi Socket++ phục vụ cho các lập trình viên trên nền tảng Unix.
Câu hỏi đặt ra là lý do tại sao Socket lại được sử dụng trong việc truyền thông giữa các máy tính Để hiểu rõ, chúng ta cần xem xét bối cảnh trước khi Socket được phát minh.
Trong hệ thống Unix, việc vào/ra dữ liệu được thực hiện theo mô hình 3 bước: Open-Read/Write-Close Đầu tiên, chương trình cần tạo kết nối với tài nguyên như bàn phím, bộ nhớ trong hoặc file Sau khi kết nối được thiết lập, chương trình có thể trao đổi dữ liệu thông qua các thao tác Read để đưa dữ liệu vào chương trình và Write để xuất dữ liệu ra tài nguyên Một ví dụ điển hình cho quy trình này là thao tác với file dữ liệu, mà lập trình viên thường thực hiện trong các ngôn ngữ lập trình.
+ Mở file cần sử dụng với các quyền thích hợp trên đó
+ Thực hiện việc đọc dữ liệu từ file để xử lý hay đưa dữ liệu để xử lý để ghi vào file
+ Đóng file sau khi đã sử dụng xong
Socket là một công cụ quan trọng trong hệ thống Unix, cho phép việc trao đổi dữ liệu giữa các chương trình diễn ra theo mô hình ba bước của vào/ra dữ liệu Khi hai chương trình muốn giao tiếp, mỗi chương trình sẽ tạo ra một socket, đóng vai trò là điểm cuối trong kết nối và thực hiện việc trao đổi thông tin Đối với lập trình viên, socket được coi như một tài nguyên hệ thống cần thiết cho giao tiếp, cho phép họ tương tác theo mô hình ba bước tương tự như vào/ra dữ liệu Sự phát triển của socket phản ánh nhu cầu ngày càng tăng về truyền thông máy tính.
- Có nhiều định nghĩa khác nhau về socket tùy theo cách nhìn của người sử dụng
- Một cách tổng quát nhất có thể định nghĩa: Một Socket là một điểm cuối trong một kết nối giữa hai chương trình đang chạy trên mạng
Socket là phương pháp thiết lập kết nối truyền thông giữa chương trình yêu cầu dịch vụ (Client) và chương trình cung cấp dịch vụ (Server) trên mạng hoặc cùng một máy tính, từ góc nhìn của nhà phát triển ứng dụng.
Đối với lập trình viên, Socket được coi là một giao diện quan trọng nằm giữa tầng ứng dụng và các tầng khác trong mô hình mạng OSI, có chức năng chính là thực hiện giao tiếp giữa chương trình ứng dụng và các tầng mạng bên dưới.
Hình 3.1- Mô hình OSI rút gọn
Hiện nay, các lập trình viên thường gặp khó khăn trong việc tạo socket thủ công, bất kể là sử dụng Java, servlet, CGI hay PHP, vì việc mở cổng một cách tường minh gần như không khả thi Thay vào đó, họ thường sử dụng các thư viện socket có sẵn trong ngôn ngữ lập trình Mặc dù socket vẫn đóng vai trò quan trọng trong việc kết nối các ứng dụng, nhưng các chi tiết kỹ thuật của chúng được ẩn sâu để người dùng không cần phải can thiệp.
Số hiệu cổng của Socket
Để thực hiện giao tiếp giữa các quá trình, một trong hai quá trình cần công bố số hiệu cổng của socket mà mình sử dụng Mỗi cổng giao tiếp đại diện cho một địa chỉ xác định trong hệ thống Khi một quá trình được gán số hiệu cổng, nó có khả năng nhận dữ liệu từ các quá trình khác gửi đến cổng đó Đồng thời, quá trình còn lại cũng cần tạo ra một socket để thiết lập kết nối.
Để giao tiếp qua mạng TCP/IP, ngoài việc biết số hiệu cổng, các thiết bị còn cần phải biết địa chỉ IP của nhau Địa chỉ IP đóng vai trò phân biệt các máy tính khác nhau trên mạng, trong khi số hiệu cổng giúp phân biệt các tiến trình khác nhau trên cùng một máy tính.
Trong hình trên, địa chỉ của quá trình B1 được xác định bằng hai thông tin quan trọng: (Host B, Port B1) Địa chỉ máy tính có thể là địa chỉ IP như 203.162.88.162 hoặc dưới dạng tên miền như www.hpu.edu.vn.
Số hiệu cổng gán cho Socket phải là duy nhất trong máy tính và nằm trong khoảng từ 0 đến 65535 (16 bit) Các cổng từ 0 đến 1023 (tổng cộng 1024 cổng) đã được phân bổ cho các dịch vụ phổ biến như HTTP.
80, telnet:21, ftp:23,… Nếu chúng ta không phải là người quản trị thì nên dùng từ cổng 1024 trở lên
Các cổng mặc định của 1 số dịch vụ mạng thông dụng:
Số hiệu cổng Quá trình hệ thống
Mô hình Clients/Server sử dụng Socket ở chế độ hướng nối kết TCP
Giai đoạn 1: Server tạo socket, gán số hiệu cổng và lắng nghe yêu cầu kết nối
Socket(): Server yêu cầu tạo một socket để có thể sử dụng các dịch vụ của tầng vận chuyển
Bind(): Server yêu cầu gán số hiệu cổng (port) cho socket
Listen(): Server lắng nghe các yêu cầu nối kết từ các client trên cổng đã được gán
Giai đoạn 2: Client tạo socket, yêu cầu thiết lập một nối kết với Server
Hàm Socket() cho phép Client tạo một socket để truy cập các dịch vụ của tầng vận chuyển, và hệ thống thường tự động gán một số hiệu cổng chưa sử dụng cho socket của Client.
Connect(): Client gửi yêu cầu nối kết đến server có địa chỉ IP và Port xác định
Hàm Accept() cho phép server chấp nhận kết nối từ client, từ đó tạo ra một kênh giao tiếp ảo Qua kênh này, client và server có thể trao đổi thông tin một cách hiệu quả.
Giai đoạn 3: Trao đổi thông tin giữa Client và Server
Sau khi chấp nhận yêu cầu kết nối, server thường thực hiện lệnh read() và chờ đợi thông điệp yêu cầu từ client.
Server phân tích và thực thi yêu cầu Kết quả sẽ được gửi về client bằng lệnh write()
Sau khi gửi yêu cầu bằng lệnh write(), client chờ nhận thông điệp kết quả (Reply Message) từ server bằng lệnh read()
Socket trong Java
* Xây dựng chương trình Client ở chế độ có nối kết
- Mở một socket nối kết đến server đã biết địa chỉ IP(hay tên miền) và số hiệu cổng
- Lấy InputStream và OutputStream gán với socket
- Tham khảo protocol của dịch vụ để định dạng đúng dữ liệu trao đổi với server
-Trao đổi dữ liệu với server nhờ vào các InputStream và OutputStream
- Đóng socket trước khi kết thúc chương trình
The socket class provides essential methods for developing client applications that utilize sockets in a connected mode Key methods commonly used for building clients include the constructor public Socket(String HostName, int PortNumber) throws IOException.
Phương thức này kết nối đến một server có tên gọi là Hostname qua cổng PortNumber Khi kết nối thành công, một kênh ảo sẽ được thiết lập giữa clients và server.
HostName: Địa chỉ IP hoặc tên logic theo dạng tên miền
PortNumber: Có giá trị từ 0 65535 public InputStream getInputStream()
Phương thức này trả về InputStream nối với Socket Chương trình clients dùng InputStream này để nhận dữ liệu từ server gửi về public OutputStream getOutputStream()
Phương thức này trả về OutputStream nối với socket Chương trình client dùng OutputStream này để gửi dữ liệu cho server public close()
Phương thức này sẽ đóng socket lại, giải phóng kênh ảo, xóa nối kết giữa clients và server
Trên hệ thống UNIX, dịch vụ Echo hoạt động theo kiến trúc Client/Server, sử dụng socket để giao tiếp Cổng mặc định cho Echo Server là 7, hỗ trợ cả hai chế độ kết nối và không kết nối.
Chương trình TCPEchoClient kết nối với EchoServer ở chế độ có kết nối, gửi lần lượt 10 ký tự từ "0" đến "9" Sau khi gửi, chương trình chờ nhận kết quả từ EchoServer và hiển thị các kết quả này trên màn hình.
Hãy lưu chương trình sau vào tệp tin TCPEchoClient.java
Public static void main(String arg[]){
Socket s=new socket(args[0],7); // Nối kết đến Server
InputStream is =s.getInputStream(); // Lấy InputStream OutputStream os = s.getOutputStream();
System.out.print((char)ch);
System.out.println(“Loi khong tao duoc socket”);
Biên dich và thực thi chương trình như sau:
Chương trình này chấp nhận một địa chỉ IP hoặc tên miền của máy tính chạy EchoServer Trong mạng TCP/IP, mỗi máy tính được gán địa chỉ IP cục bộ 127.0.0.1, hay còn gọi là localhost Trong ví dụ này, chương trình client kết nối đến EchoServer trên cùng một máy tính.
Một số lớp trong lập trình Java Socket
Java cung cấp hỗ trợ lập trình mạng qua các lớp trong gói java.net Một số lớp quan trọng cho lập trình client/server sử dụng socket làm phương tiện giao tiếp bao gồm:
InetAddress: Lớp này quản lý địa chỉ Internet bao gồm địa chỉ IP và tên máy tính
Socket: Hỗ trợ các phương thức liên quan đến socket cho chươnng trình clients ở chế độ có kết nối
ServerSocket: Hỗ trợ các phương thức liên quan đến socket cho chương trình server ở chế độ có kết nối
DatagramSocket: Hỗ trợ các phương thức liên quan đến socket ở chế độ không kết nối cho cả clients và server
DatagramPacket: Lớp cài đặt gói tin dùng thư tín người dùng (Datagram Packet) trong giao tiếp giữa clients và server ở chế độ không kết nối.
XÂY DỰNG CHƯƠNG TRÌNH ỨNG DỤNG
Giới thiệu
Trao đổi dữ liệu giữa hai máy tính trong mạng thực chất là sự tương tác giữa hai chương trình ứng dụng, với một chương trình đóng vai trò là server và một chương trình là client Phương pháp phổ biến để xây dựng ứng dụng mạng là lập trình ứng mạng dựa trên cơ chế socket Chương này sẽ giới thiệu một ứng dụng của lập trình socket TCP, cụ thể là xây dựng chương trình truyền file qua mạng giữa hai máy tính bằng Java Socket TCP.
Phân tích chương trình
Chương trình ứng dụng được thiết kế theo mô hình client/server, bao gồm hai mô-đun chính là server và client Người dùng có khả năng truyền tệp tin giữa client và server một cách dễ dàng, cho phép trao đổi dữ liệu linh hoạt.
Tạo server socket và lắng nghe kết nối từ client
Chọn file cần gửi cho client chấp nhận kết nối từ client đúng sai báo lỗi
Cơ chế hoạt động của chương trình
client tạo socket kết nối đến socket server
Chọn file cần gửi cho server kết nối thành công đúng sai báo lỗi
Gửi file mới? đúng sai
Chương trình gồm hai mô đun Phía server là file chương trình có tên là
FileTransferServer.java, phía client là file chương trình có tên là
FileTransferClient.java là một tệp mã nguồn Java Sau khi biên dịch, ta sẽ nhận được các tệp class tương ứng Để thực thi chương trình, sử dụng cú pháp tại dấu nhắc hệ thống: c:\>java FileTransferServer và c:\>java FileTransferClient.
Chạy chương trình ở server mode:
Chương trình chạy ở chế độ server sẽ chờ kết nối từ các máy client, yêu cầu nhập port number lớn hơn 1024 do các port dưới 1024 đã được hệ thống giữ Ngoài ra, chương trình hỗ trợ giao nhận file giữa một server và nhiều máy client đồng thời, vì vậy cần xác định số lượng máy client tối đa có thể kết nối đến server.
Chạy chương trình ở client mode:
Để kết nối với server, chương trình yêu cầu người dùng nhập địa chỉ server (host address), có thể là địa chỉ IP hoặc tên máy chạy server mode Ví dụ, trong hình minh họa, máy chạy server mode có địa chỉ IP trong mạng LAN là 192.168.1.43 Sau đó, người dùng cần nhập số hiệu cổng (port number) của server socket mà họ muốn kết nối đến.
Giao diện chương trình
Hình 4.1- Lựa chọn số hiệu cổng của Server và số lượng Client cần kết nối
Hình 4.2- Giao diện chính của chương trình phía Server
Hình 4.3- Giao diện phía server khi chọn file truyền đi
Hình 4.4- Thông báo gửi file thành công từ Server đến Client
Hình 4.5- Thông báo bên Clien đang gửi file tới cho Server
Hình 4.6- Thông báo bạn đã nhận thành công file được gửi từ Client
Hình 4.7- Nhập địa chỉ máy Server và số hiệu cổng của Server để kết nối
Hình 4.8- Giao diện chính của chương trình phía Client
Hình 4.9- Thông báo bên Server đang gửi file tới cho Client
Hình 4.10- Thông báo bạn đã nhận thành công file được gửi từ Server
Hình 4.11- Giao diện phía server khi chọn file truyền đi
Hình 4.12- Thông báo gửi file thành công từ Client đến Server
Nhận xét
Chương trình ứng dụng được lựa chọn viết bằng ngôn ngữ Java, ta chọn
Java vì những lý do sau đây:
Việc sử dụng Java cho các ứng dụng mạng kiểu này mang lại sự gọn gàng hơn, vì nó yêu cầu ít dòng mã hơn Mỗi dòng mã cũng dễ dàng được giải thích, ngay cả đối với những lập trình viên mới bắt đầu.
Các chương trình ứng dụng mô hình client/server lập trình bằng Java ngày càng trở nên phổ biến và có khả năng trở thành tiêu chuẩn cho lập trình mạng trong tương lai Java, với tính độc lập nền tảng, cung cấp cơ chế xử lý ngoại lệ hiệu quả, giúp quản lý các lỗi trong quá trình nhập/xuất và hoạt động mạng Ngoài ra, khả năng phân luồng mạnh mẽ của Java cũng tạo điều kiện thuận lợi cho việc xây dựng các server mạnh mẽ và hiệu quả.