[{"content":"Sau khi hiểu JavaScript là gì, chúng ta sẽ đi sâu vào phần quan trọng nhất khiến trang web trở nên tương tác: DOM và Event.\nDOM giúp JavaScript \u0026ldquo;nhìn thấy\u0026rdquo; và thay đổi cấu trúc HTML, còn Event giúp bắt các hành động của người dùng như click, nhập liệu\u0026hellip;\nCấu trúc cây DOM của một trang HTML đơn giản (Nguồn: W3Schools)\nDOM là gì? Document Object Model (Mô hình Đối tượng Tài liệu) là cách trình duyệt biểu diễn trang HTML dưới dạng cây đối tượng.\nMỗi thẻ HTML là một node (nút). JavaScript có thể truy cập, thêm, sửa, xóa các node này. Ví dụ: Thẻ \u0026lt;h1\u0026gt; trở thành một object mà bạn có thể thay đổi nội dung.\nCác phương thức DOM phổ biến Phương thức Mô tả Ví dụ document.getElementById() Lấy phần tử theo ID document.getElementById(\u0026quot;title\u0026quot;) document.querySelector() Lấy phần tử đầu tiên khớp CSS selector document.querySelector(\u0026quot;.button\u0026quot;) element.innerHTML Đọc/ghi nội dung HTML bên trong element.innerHTML = \u0026quot;\u0026lt;strong\u0026gt;Mới\u0026lt;/strong\u0026gt;\u0026quot; element.textContent Đọc/ghi chỉ text (an toàn hơn) element.textContent = \u0026quot;Hello\u0026quot; element.style.property Thay đổi CSS inline element.style.color = \u0026quot;red\u0026quot; document.createElement() Tạo phần tử mới let btn = document.createElement(\u0026quot;button\u0026quot;) Ví dụ trước/sau khi thao tác DOM (Nguồn: Medium)\nEvent là gì và cách xử lý Event là các sự kiện xảy ra trên trang: click chuột, nhấn phím, load trang, submit form\u0026hellip;\nJavaScript có thể lắng nghe (listen) và phản hồi các event này.\nCách thêm Event Listener 1 2 3 4 5 6 7 8 9 // Cách hiện đại (khuyến nghị) element.addEventListener(\u0026#34;click\u0026#34;, function() { alert(\u0026#34;Bạn đã click!\u0026#34;); }); // Hoặc dùng arrow function element.addEventListener(\u0026#34;click\u0026#34;, () =\u0026gt; { console.log(\u0026#34;Click rồi!\u0026#34;); }); ","permalink":"https://hoangduccudcud.github.io/posts/08-dom-event-co-ban/","summary":"\u003cp\u003eSau khi hiểu \u003cstrong\u003eJavaScript\u003c/strong\u003e là gì, chúng ta sẽ đi sâu vào phần quan trọng nhất khiến trang web trở nên \u003cstrong\u003etương tác\u003c/strong\u003e: \u003cstrong\u003eDOM\u003c/strong\u003e và \u003cstrong\u003eEvent\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eDOM giúp JavaScript \u0026ldquo;nhìn thấy\u0026rdquo; và thay đổi cấu trúc HTML, còn Event giúp bắt các hành động của người dùng như click, nhập liệu\u0026hellip;\u003c/p\u003e\n\u003cp\u003e\u003cgrok-card data-id=\"00f4b6\" data-type=\"image_card\"  data-arg-size=\"LARGE\" \u003e\u003c/grok-card\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e\u003cp style=\"text-align:center; font-size:0.9rem; opacity:0.8;\"\u003eCấu trúc cây DOM của một trang HTML đơn giản (Nguồn: W3Schools)\u003c/p\u003e","title":"DOM Và Event Cơ Bản Trong JavaScript"},{"content":"Socket là gì? Socket là điểm cuối (endpoint) của một kết nối mạng hai chiều giữa hai chương trình.\nTrong Java:\nServerSocket: Dùng phía Server để chờ kết nối từ Client. Socket: Dùng phía Client để kết nối, hoặc phía Server sau khi accept kết nối. TCP là gì và tại sao quan trọng? TCP (Transmission Control Protocol) là giao thức hướng kết nối, đảm bảo:\nDữ liệu đến đúng thứ tự Không mất gói tin Kiểm soát lưu lượng (flow control) Xử lý lỗi tự động Phù hợp cho các ứng dụng cần độ tin cậy cao: chat, tải file, web\u0026hellip;\nCấu trúc cơ bản 1 2 3 4 5 6 // Server ServerSocket server = new ServerSocket(8080); Socket clientSocket = server.accept(); // Chờ client kết nối // Client Socket socket = new Socket(\u0026#34;127.0.0.1\u0026#34;, 8080); ","permalink":"https://hoangduccudcud.github.io/posts/03-java-socket-tcp-la-gi/","summary":"\u003ch2 id=\"socket-là-gì\"\u003eSocket là gì?\u003c/h2\u003e\n\u003cp\u003eSocket là điểm cuối (endpoint) của một kết nối mạng hai chiều giữa hai chương trình.\u003c/p\u003e\n\u003cp\u003eTrong Java:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eServerSocket\u003c/code\u003e: Dùng phía Server để chờ kết nối từ Client.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eSocket\u003c/code\u003e: Dùng phía Client để kết nối, hoặc phía Server sau khi accept kết nối.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"tcp-là-gì-và-tại-sao-quan-trọng\"\u003eTCP là gì và tại sao quan trọng?\u003c/h2\u003e\n\u003cp\u003eTCP (Transmission Control Protocol) là giao thức hướng kết nối, đảm bảo:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDữ liệu đến đúng thứ tự\u003c/li\u003e\n\u003cli\u003eKhông mất gói tin\u003c/li\u003e\n\u003cli\u003eKiểm soát lưu lượng (flow control)\u003c/li\u003e\n\u003cli\u003eXử lý lỗi tự động\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePhù hợp cho các ứng dụng cần độ tin cậy cao: chat, tải file, web\u0026hellip;\u003c/p\u003e","title":"Java Socket TCP Là Gì?"},{"content":"Rất nhiều người mới học lập trình thường nhầm lẫn giữa Java và JavaScript vì tên gọi tương tự. Thực tế, chúng hoàn toàn khác nhau – giống như \u0026ldquo;Car\u0026rdquo; và \u0026ldquo;Carpet\u0026rdquo; vậy!\nMeme kinh điển minh họa sự khác biệt (Nguồn: Programmer Humor)\nBảng so sánh nhanh Tiêu chí Java JavaScript Ra đời 1995 bởi Sun Microsystems (nay là Oracle) 1995 bởi Brendan Eich (Netscape) Loại ngôn ngữ Biên dịch (compiled), statically-typed Thông dịch (interpreted), dynamically-typed Chạy ở đâu Trên JVM (Java Virtual Machine) – cross-platform Chủ yếu trên trình duyệt, Node.js (server) Ứng dụng chính Backend, Android app, enterprise software Frontend web, full-stack (với Node.js) Hướng đối tượng OOP nghiêm ngặt (class-based) OOP linh hoạt (prototype-based) Ví dụ framework Spring Boot, Hibernate React, Vue, Angular, Express Infographic so sánh chi tiết (Nguồn: Unstop)\nLogo Java và JavaScript bên nhau để dễ hình dung sự khác biệt\nChi tiết sự khác biệt Cách thực thi\nJava: Code được biên dịch thành bytecode chạy trên JVM → hiệu suất cao, kiểm tra lỗi sớm. JavaScript: Code chạy trực tiếp trên engine trình duyệt (V8, SpiderMonkey) → nhanh thay đổi, nhưng lỗi runtime nhiều hơn. Kiểu dữ liệu\nJava: Phải khai báo kiểu (int, String\u0026hellip;) → an toàn hơn. JavaScript: Không cần khai báo kiểu (var/let/const) → linh hoạt nhưng dễ bug. Ứng dụng thực tế\nJava: Xây dựng hệ thống lớn, ngân hàng, Android app, backend mạnh mẽ. JavaScript: Làm web tương tác, single-page app, realtime (chat, game web). Khi nào học cái nào? Nếu bạn thích backend vững chắc, hệ thống lớn → học Java trước (như mình đang làm). Nếu muốn xây dựng web đẹp, tương tác nhanh → học JavaScript. Tốt nhất: Học cả hai để trở thành Full-stack Developer! Series lập trình mạng Java của mình đến đây tạm dừng. Cảm ơn bạn đã theo dõi!\nNếu có thắc mắc về Java hay JavaScript, comment bên dưới nhé 🚀\n","permalink":"https://hoangduccudcud.github.io/posts/09-java-vs-javascript/","summary":"\u003cp\u003eRất nhiều người mới học lập trình thường nhầm lẫn giữa \u003cstrong\u003eJava\u003c/strong\u003e và \u003cstrong\u003eJavaScript\u003c/strong\u003e vì tên gọi tương tự. Thực tế, chúng hoàn toàn khác nhau – giống như \u0026ldquo;Car\u0026rdquo; và \u0026ldquo;Carpet\u0026rdquo; vậy!\u003c/p\u003e\n\u003cp\u003e\u003cgrok-card data-id=\"129523\" data-type=\"image_card\"  data-arg-size=\"LARGE\" \u003e\u003c/grok-card\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e\u003cp style=\"text-align:center; font-size:0.9rem; opacity:0.8;\"\u003eMeme kinh điển minh họa sự khác biệt (Nguồn: Programmer Humor)\u003c/p\u003e\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"bảng-so-sánh-nhanh\"\u003eBảng so sánh nhanh\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eTiêu chí\u003c/th\u003e\n          \u003cth\u003eJava\u003c/th\u003e\n          \u003cth\u003eJavaScript\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eRa đời\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003e1995 bởi Sun Microsystems (nay là Oracle)\u003c/td\u003e\n          \u003ctd\u003e1995 bởi Brendan Eich (Netscape)\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eLoại ngôn ngữ\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eBiên dịch (compiled), statically-typed\u003c/td\u003e\n          \u003ctd\u003eThông dịch (interpreted), dynamically-typed\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eChạy ở đâu\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eTrên JVM (Java Virtual Machine) – cross-platform\u003c/td\u003e\n          \u003ctd\u003eChủ yếu trên trình duyệt, Node.js (server)\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eỨng dụng chính\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eBackend, Android app, enterprise software\u003c/td\u003e\n          \u003ctd\u003eFrontend web, full-stack (với Node.js)\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eHướng đối tượng\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eOOP nghiêm ngặt (class-based)\u003c/td\u003e\n          \u003ctd\u003eOOP linh hoạt (prototype-based)\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eVí dụ framework\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eSpring Boot, Hibernate\u003c/td\u003e\n          \u003ctd\u003eReact, Vue, Angular, Express\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cgrok-card data-id=\"718542\" data-type=\"image_card\"  data-arg-size=\"LARGE\" \u003e\u003c/grok-card\u003e\u003c/p\u003e","title":"Java vs JavaScript: Đừng Nhầm Lẫn Nữa!"},{"content":"JavaScript (thường viết tắt là JS) là một trong ba ngôn ngữ cốt lõi của web hiện đại (cùng với HTML và CSS). Đây là ngôn ngữ lập trình chạy trực tiếp trên trình duyệt, giúp tạo ra các trang web tương tác, động và sống động.\nLogo chính thức của JavaScript\nJavaScript dùng để làm gì? Thao tác với trang web: Thay đổi nội dung, kiểu dáng mà không cần reload trang. Xử lý sự kiện người dùng: Click, scroll, nhập form, keyboard\u0026hellip; Giao tiếp với server: Gửi/nhận dữ liệu qua AJAX/Fetch API (ví dụ: tải dữ liệu realtime). Xây dựng ứng dụng web đầy đủ: Với Node.js, JS còn chạy được phía server. Ngày nay, hầu hết các website lớn (Facebook, Netflix, YouTube, Google) đều sử dụng JavaScript nặng nề.\nCách JavaScript hoạt động trong trình duyệt Trình duyệt có một JavaScript Engine (như V8 của Chrome) để biên dịch và thực thi code JS.\nSơ đồ kiến trúc trình duyệt và cách JavaScript được thực thi\nVí dụ đơn giản đầu tiên 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 \u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;title\u0026gt;Hello JS\u0026lt;/title\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;h1 id=\u0026#34;title\u0026#34;\u0026gt;Chào mừng bạn!\u0026lt;/h1\u0026gt; \u0026lt;button onclick=\u0026#34;changeText()\u0026#34;\u0026gt;Click tôi\u0026lt;/button\u0026gt; \u0026lt;script\u0026gt; function changeText() { document.getElementById(\u0026#34;title\u0026#34;).innerText = \u0026#34;Bạn đã click nút!\u0026#34;; alert(\u0026#34;Hello from JavaScript!\u0026#34;); } \u0026lt;/script\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; ","permalink":"https://hoangduccudcud.github.io/posts/07-javascript-la-gi/","summary":"\u003cp\u003eJavaScript (thường viết tắt là \u003cstrong\u003eJS\u003c/strong\u003e) là một trong ba ngôn ngữ cốt lõi của web hiện đại (cùng với HTML và CSS). Đây là ngôn ngữ lập trình chạy trực tiếp trên trình duyệt, giúp tạo ra các trang web tương tác, động và sống động.\u003c/p\u003e\n\u003cp\u003e\u003cgrok-card data-id=\"f4afb6\" data-type=\"image_card\"  data-arg-size=\"LARGE\" \u003e\u003c/grok-card\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e\u003cp style=\"text-align:center; font-size:0.9rem; opacity:0.8;\"\u003eLogo chính thức của JavaScript\u003c/p\u003e\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"javascript-dùng-để-làm-gì\"\u003eJavaScript dùng để làm gì?\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eThao tác với trang web\u003c/strong\u003e: Thay đổi nội dung, kiểu dáng mà không cần reload trang.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXử lý sự kiện người dùng\u003c/strong\u003e: Click, scroll, nhập form, keyboard\u0026hellip;\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGiao tiếp với server\u003c/strong\u003e: Gửi/nhận dữ liệu qua AJAX/Fetch API (ví dụ: tải dữ liệu realtime).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXây dựng ứng dụng web đầy đủ\u003c/strong\u003e: Với Node.js, JS còn chạy được phía server.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eNgày nay, hầu hết các website lớn (Facebook, Netflix, YouTube, Google) đều sử dụng JavaScript nặng nề.\u003c/p\u003e","title":"JavaScript Là Gì? Giới Thiệu Cơ Bản"},{"content":"Mô hình Client – Server là gì? Mô hình Client – Server là kiến trúc phổ biến nhất trong lập trình mạng, trong đó:\nClient: Ứng dụng khởi tạo kết nối, gửi yêu cầu (request). Server: Ứng dụng lắng nghe kết nối, xử lý yêu cầu và trả về phản hồi (response). Cách hoạt động Server khởi động và mở một port để lắng nghe. Client kết nối đến địa chỉ IP + port của Server. Sau khi kết nối thành công, hai bên có thể trao đổi dữ liệu. Kết nối có thể duy trì lâu dài hoặc đóng sau mỗi lần giao tiếp. Ưu điểm Quản lý tập trung (Server kiểm soát dữ liệu và logic chính). Dễ mở rộng (thêm nhiều Client mà không ảnh hưởng Server). Bảo mật tốt hơn (Server kiểm soát truy cập). Ví dụ thực tế Trình duyệt web (Client) ↔ Web Server Ứng dụng chat (Client) ↔ Server chat Game online multiplayer Bài tiếp theo sẽ đi sâu vào cách Java hiện thực hóa mô hình này qua Socket TCP.\n","permalink":"https://hoangduccudcud.github.io/posts/02-mo-hinh-client-server/","summary":"\u003ch2 id=\"mô-hình-client--server-là-gì\"\u003eMô hình Client – Server là gì?\u003c/h2\u003e\n\u003cp\u003eMô hình Client – Server là kiến trúc phổ biến nhất trong lập trình mạng, trong đó:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eClient\u003c/strong\u003e: Ứng dụng khởi tạo kết nối, gửi yêu cầu (request).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eServer\u003c/strong\u003e: Ứng dụng lắng nghe kết nối, xử lý yêu cầu và trả về phản hồi (response).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"cách-hoạt-động\"\u003eCách hoạt động\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eServer khởi động và mở một port để lắng nghe.\u003c/li\u003e\n\u003cli\u003eClient kết nối đến địa chỉ IP + port của Server.\u003c/li\u003e\n\u003cli\u003eSau khi kết nối thành công, hai bên có thể trao đổi dữ liệu.\u003c/li\u003e\n\u003cli\u003eKết nối có thể duy trì lâu dài hoặc đóng sau mỗi lần giao tiếp.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"ưu-điểm\"\u003eƯu điểm\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eQuản lý tập trung (Server kiểm soát dữ liệu và logic chính).\u003c/li\u003e\n\u003cli\u003eDễ mở rộng (thêm nhiều Client mà không ảnh hưởng Server).\u003c/li\u003e\n\u003cli\u003eBảo mật tốt hơn (Server kiểm soát truy cập).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"ví-dụ-thực-tế\"\u003eVí dụ thực tế\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eTrình duyệt web (Client) ↔ Web Server\u003c/li\u003e\n\u003cli\u003eỨng dụng chat (Client) ↔ Server chat\u003c/li\u003e\n\u003cli\u003eGame online multiplayer\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eBài tiếp theo sẽ đi sâu vào cách Java hiện thực hóa mô hình này qua \u003cstrong\u003eSocket TCP\u003c/strong\u003e.\u003c/p\u003e","title":"Mô Hình Client – Server Trong Lập Trình Mạng"},{"content":"Giới thiệu Lập trình mạng là một phần quan trọng trong phát triển phần mềm hiện đại. Java cung cấp bộ công cụ mạnh mẽ thông qua gói java.net để xây dựng các ứng dụng mạng đáng tin cậy.\nBài viết này mở đầu cho series về lập trình mạng Java, giúp bạn hiểu rõ các khái niệm nền tảng trước khi đi sâu vào thực hành.\nCác khái niệm cơ bản Mô hình Client – Server: Cách phổ biến nhất để các máy tính giao tiếp qua mạng. Giao thức truyền tải: TCP (đáng tin cậy) và UDP (nhanh, không kết nối). Socket: Điểm cuối giao tiếp giữa hai chương trình qua mạng. Port: Số hiệu để định danh dịch vụ (ví dụ: HTTP dùng port 80). Tại sao chọn Java cho lập trình mạng? API Socket đơn giản, ổn định và cross-platform. Hỗ trợ đa luồng tốt (dễ xử lý nhiều client cùng lúc). Thư viện chuẩn phong phú, không cần phụ thuộc bên ngoài. Nội dung series sắp tới Mô hình Client – Server Java Socket TCP cơ bản Xây dựng TCP Client – Server đơn giản Xử lý nhiều Client với Multithreading TCP vs UDP Ứng dụng thực tế: Hệ thống chat realtime Hãy tiếp tục theo dõi để cùng xây dựng các dự án mạng thực tế bằng Java!\n","permalink":"https://hoangduccudcud.github.io/posts/01-tong-quan-lap-trinh-mang-java/","summary":"\u003ch2 id=\"giới-thiệu\"\u003eGiới thiệu\u003c/h2\u003e\n\u003cp\u003eLập trình mạng là một phần quan trọng trong phát triển phần mềm hiện đại. Java cung cấp bộ công cụ mạnh mẽ thông qua gói \u003ccode\u003ejava.net\u003c/code\u003e để xây dựng các ứng dụng mạng đáng tin cậy.\u003c/p\u003e\n\u003cp\u003eBài viết này mở đầu cho series về \u003cstrong\u003elập trình mạng Java\u003c/strong\u003e, giúp bạn hiểu rõ các khái niệm nền tảng trước khi đi sâu vào thực hành.\u003c/p\u003e\n\u003ch2 id=\"các-khái-niệm-cơ-bản\"\u003eCác khái niệm cơ bản\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eMô hình Client – Server\u003c/strong\u003e: Cách phổ biến nhất để các máy tính giao tiếp qua mạng.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGiao thức truyền tải\u003c/strong\u003e: TCP (đáng tin cậy) và UDP (nhanh, không kết nối).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSocket\u003c/strong\u003e: Điểm cuối giao tiếp giữa hai chương trình qua mạng.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePort\u003c/strong\u003e: Số hiệu để định danh dịch vụ (ví dụ: HTTP dùng port 80).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"tại-sao-chọn-java-cho-lập-trình-mạng\"\u003eTại sao chọn Java cho lập trình mạng?\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAPI Socket đơn giản, ổn định và cross-platform.\u003c/li\u003e\n\u003cli\u003eHỗ trợ đa luồng tốt (dễ xử lý nhiều client cùng lúc).\u003c/li\u003e\n\u003cli\u003eThư viện chuẩn phong phú, không cần phụ thuộc bên ngoài.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"nội-dung-series-sắp-tới\"\u003eNội dung series sắp tới\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eMô hình Client – Server\u003c/li\u003e\n\u003cli\u003eJava Socket TCP cơ bản\u003c/li\u003e\n\u003cli\u003eXây dựng TCP Client – Server đơn giản\u003c/li\u003e\n\u003cli\u003eXử lý nhiều Client với Multithreading\u003c/li\u003e\n\u003cli\u003eTCP vs UDP\u003c/li\u003e\n\u003cli\u003eỨng dụng thực tế: Hệ thống chat realtime\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eHãy tiếp tục theo dõi để cùng xây dựng các dự án mạng thực tế bằng Java!\u003c/p\u003e","title":"Tổng Quan Lập Trình Mạng Với Java"},{"content":"Trong bài này, chúng ta sẽ xây dựng một ứng dụng TCP Client-Server đơn giản nhất để hiểu rõ cách giao tiếp mạng trong Java: Client gửi \u0026ldquo;Hello\u0026rdquo;, Server nhận và trả về \u0026ldquo;OK\u0026rdquo;.\nSơ đồ minh họa Client kết nối đến Server qua Socket\nMục tiêu Server lắng nghe trên port 8080 Client kết nối và gửi tin nhắn Server nhận tin, xử lý và trả phản hồi Code Server 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import java.io.*; import java.net.*; public class TcpServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8080); System.out.println(\u0026#34;Server đang chạy trên port 8080...\u0026#34;); Socket clientSocket = serverSocket.accept(); System.out.println(\u0026#34;Client đã kết nối!\u0026#34;); BufferedReader in = new BufferedReader( new InputStreamReader(clientSocket.getInputStream())); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); String message = in.readLine(); System.out.println(\u0026#34;Nhận từ Client: \u0026#34; + message); out.println(\u0026#34;OK - Server đã nhận: \u0026#34; + message); clientSocket.close(); serverSocket.close(); System.out.println(\u0026#34;Kết nối đã đóng.\u0026#34;); } } ","permalink":"https://hoangduccudcud.github.io/posts/04-tcp-client-server-hello/","summary":"\u003cp\u003eTrong bài này, chúng ta sẽ xây dựng một ứng dụng TCP Client-Server đơn giản nhất để hiểu rõ cách giao tiếp mạng trong Java: Client gửi \u0026ldquo;Hello\u0026rdquo;, Server nhận và trả về \u0026ldquo;OK\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Mô hình TCP Client-Server cơ bản\" loading=\"lazy\" src=\"https://scaler.com/topics/images/tcp-ip-ports-and-sockets.webp\"\u003e\n\u003cem\u003e\u003cp style=\"text-align:center; font-size:0.9rem; opacity:0.8;\"\u003eSơ đồ minh họa Client kết nối đến Server qua Socket\u003c/p\u003e\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"mục-tiêu\"\u003eMục tiêu\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eServer lắng nghe trên port 8080\u003c/li\u003e\n\u003cli\u003eClient kết nối và gửi tin nhắn\u003c/li\u003e\n\u003cli\u003eServer nhận tin, xử lý và trả phản hồi\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"code-server\"\u003eCode Server\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003ejava.io.*\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003ejava.net.*\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eTcpServer\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estatic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"o\"\u003e[]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eIOException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eServerSocket\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eserverSocket\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eServerSocket\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e8080\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Server đang chạy trên port 8080...\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eSocket\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eclientSocket\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eserverSocket\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eaccept\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Client đã kết nối!\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eBufferedReader\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ein\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eBufferedReader\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eInputStreamReader\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eclientSocket\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetInputStream\u003c/span\u003e\u003cspan class=\"p\"\u003e()));\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ePrintWriter\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eout\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ePrintWriter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eclientSocket\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetOutputStream\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emessage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ein\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ereadLine\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Nhận từ Client: \u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emessage\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;OK - Server đã nhận: \u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emessage\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eclientSocket\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eserverSocket\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Kết nối đã đóng.\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"Xây Dựng TCP Client – Server Đơn Giản Với Java"},{"content":"Trong bài trước, chúng ta đã xây dựng một Server TCP đơn giản chỉ xử lý được một Client tại một thời điểm. Nếu Client thứ hai kết nối, nó phải chờ đến khi Client đầu tiên ngắt kết nối.\nBài này sẽ nâng cấp Server để hỗ trợ nhiều Client đồng thời bằng cách sử dụng Multithreading – một kỹ thuật rất quan trọng trong lập trình mạng.\nMục tiêu Server chấp nhận nhiều kết nối từ các Client. Mỗi Client được xử lý trong một luồng riêng (Thread). Server tiếp tục lắng nghe kết nối mới ngay cả khi đang xử lý Client cũ. Cách hoạt động Server mở ServerSocket và chờ kết nối (vòng lặp vô hạn). Khi một Client kết nối → tạo một Thread mới để xử lý Client đó. Thread riêng: nhận tin nhắn từ Client, trả phản hồi, rồi đóng kết nối. Server quay lại chờ Client mới. Code Server (Multithreaded) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 import java.io.*; import java.net.*; public class MultiThreadServer { public static void main(String[] args) { try (ServerSocket serverSocket = new ServerSocket(8080)) { System.out.println(\u0026#34;Server đang chạy trên port 8080...\u0026#34;); // Vòng lặp vô hạn để chấp nhận nhiều Client while (true) { Socket clientSocket = serverSocket.accept(); System.out.println(\u0026#34;Client mới đã kết nối!\u0026#34;); // Tạo Thread mới để xử lý Client này new Thread(() -\u0026gt; handleClient(clientSocket)).start(); } } catch (IOException e) { e.printStackTrace(); } } // Hàm xử lý từng Client trong Thread riêng private static void handleClient(Socket clientSocket) { try { BufferedReader in = new BufferedReader( new InputStreamReader(clientSocket.getInputStream())); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); String message = in.readLine(); if (message != null) { System.out.println(\u0026#34;Nhận từ Client: \u0026#34; + message); out.println(\u0026#34;OK - Server đã nhận: \u0026#34; + message); } clientSocket.close(); System.out.println(\u0026#34;Kết nối với Client đã đóng.\u0026#34;); } catch (IOException e) { e.printStackTrace(); } } } ","permalink":"https://hoangduccudcud.github.io/posts/05-multithread-nhieu-client/","summary":"\u003cp\u003eTrong bài trước, chúng ta đã xây dựng một Server TCP đơn giản chỉ xử lý được \u003cstrong\u003emột Client\u003c/strong\u003e tại một thời điểm. Nếu Client thứ hai kết nối, nó phải chờ đến khi Client đầu tiên ngắt kết nối.\u003c/p\u003e\n\u003cp\u003eBài này sẽ nâng cấp Server để hỗ trợ \u003cstrong\u003enhiều Client đồng thời\u003c/strong\u003e bằng cách sử dụng \u003cstrong\u003eMultithreading\u003c/strong\u003e – một kỹ thuật rất quan trọng trong lập trình mạng.\u003c/p\u003e\n\u003c!--\n![Minh họa Multithread Server](https://media.geeksforgeeks.org/wp-content/uploads/20220502163844/MultiThreadedServer-660x396.png)\n\u003cp style=\"text-align:center; font-size:0.9rem; opacity:0.8;\"\u003e\nSơ đồ Server TCP đa luồng xử lý nhiều Client cùng lúc (Nguồn: GeeksforGeeks)\n\u003c/p\u003e","title":"Xử Lý Nhiều Client Cùng Lúc Với Multithreading"},{"content":"Trong bài trước, chúng ta đã xây dựng một Server TCP đơn giản chỉ xử lý được một Client tại một thời điểm. Nếu Client thứ hai kết nối, nó phải chờ đến khi Client đầu tiên ngắt kết nối.\nBài này sẽ nâng cấp Server để hỗ trợ nhiều Client đồng thời bằng cách sử dụng Multithreading – một kỹ thuật rất quan trọng trong lập trình mạng.\nSơ đồ Server TCP đa luồng xử lý nhiều Client cùng lúc (Nguồn: GeeksforGeeks)\nMục tiêu Server chấp nhận nhiều kết nối từ các Client. Mỗi Client được xử lý trong một luồng riêng (Thread). Server tiếp tục lắng nghe kết nối mới ngay cả khi đang xử lý Client cũ. Cách hoạt động Server mở ServerSocket và chờ kết nối (vòng lặp vô hạn). Khi một Client kết nối → tạo một Thread mới để xử lý Client đó. Thread riêng: nhận tin nhắn từ Client, trả phản hồi, rồi đóng kết nối. Server quay lại chờ Client mới. Code Server (Multithreaded) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 import java.io.*; import java.net.*; public class MultiThreadServer { public static void main(String[] args) { try (ServerSocket serverSocket = new ServerSocket(8080)) { System.out.println(\u0026#34;Server đang chạy trên port 8080...\u0026#34;); // Vòng lặp vô hạn để chấp nhận nhiều Client while (true) { Socket clientSocket = serverSocket.accept(); System.out.println(\u0026#34;Client mới đã kết nối!\u0026#34;); // Tạo Thread mới để xử lý Client này new Thread(() -\u0026gt; handleClient(clientSocket)).start(); } } catch (IOException e) { e.printStackTrace(); } } // Hàm xử lý từng Client trong Thread riêng private static void handleClient(Socket clientSocket) { try { BufferedReader in = new BufferedReader( new InputStreamReader(clientSocket.getInputStream())); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); String message = in.readLine(); if (message != null) { System.out.println(\u0026#34;Nhận từ Client: \u0026#34; + message); out.println(\u0026#34;OK - Server đã nhận: \u0026#34; + message); } clientSocket.close(); System.out.println(\u0026#34;Kết nối với Client đã đóng.\u0026#34;); } catch (IOException e) { e.printStackTrace(); } } } ","permalink":"https://hoangduccudcud.github.io/posts/06-tcp-vs-udp/","summary":"\u003cp\u003eTrong bài trước, chúng ta đã xây dựng một Server TCP đơn giản chỉ xử lý được \u003cstrong\u003emột Client\u003c/strong\u003e tại một thời điểm. Nếu Client thứ hai kết nối, nó phải chờ đến khi Client đầu tiên ngắt kết nối.\u003c/p\u003e\n\u003cp\u003eBài này sẽ nâng cấp Server để hỗ trợ \u003cstrong\u003enhiều Client đồng thời\u003c/strong\u003e bằng cách sử dụng \u003cstrong\u003eMultithreading\u003c/strong\u003e – một kỹ thuật rất quan trọng trong lập trình mạng.\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Minh họa Multithread Server\" loading=\"lazy\" src=\"https://media.geeksforgeeks.org/wp-content/uploads/20220502163844/MultiThreadedServer-660x396.png\"\u003e\n\u003cem\u003e\u003cp style=\"text-align:center; font-size:0.9rem; opacity:0.8;\"\u003eSơ đồ Server TCP đa luồng xử lý nhiều Client cùng lúc (Nguồn: GeeksforGeeks)\u003c/p\u003e","title":"Xử Lý Nhiều Client Cùng Lúc Với Multithreading"},{"content":"Các Dự Án Cá Nhân Dưới đây là một số dự án tôi đã thực hiện trong quá trình học tập và phát triển kỹ năng lập trình, tập trung vào backend và lập trình mạng với Java.\nHệ Thống Chat Client – Server Ứng dụng chat thời gian thực hỗ trợ nhiều người dùng kết nối cùng lúc.\nJava Socket Programming Server đa luồng (multi-thread) xử lý đồng thời nhiều client Giao tiếp tin nhắn realtime giữa client và server Công nghệ: Java Core • Java Networking • Multithreading\nXem trên GitHub Website Quản Lý Thư Viện Hệ thống quản lý sách và mượn/trả sách trực tuyến với phân quyền người dùng.\nBackend xây dựng bằng Spring Boot RESTful API đầy đủ CRUD Phân quyền Admin / User Kết nối database MySQL qua JPA/Hibernate Công nghệ: Spring Boot • Spring Security • JPA • MySQL\nXem trên GitHub Trang Chủ Blog Giới Thiệu ","permalink":"https://hoangduccudcud.github.io/projects/","summary":"\u003ch2 id=\"các-dự-án-cá-nhân\"\u003eCác Dự Án Cá Nhân\u003c/h2\u003e\n\u003cp\u003eDưới đây là một số dự án tôi đã thực hiện trong quá trình học tập và phát triển kỹ năng lập trình, tập trung vào backend và lập trình mạng với Java.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"hệ-thống-chat-client--server\"\u003eHệ Thống Chat Client – Server\u003c/h3\u003e\n\u003cp\u003eỨng dụng chat thời gian thực hỗ trợ nhiều người dùng kết nối cùng lúc.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eJava Socket Programming\u003c/li\u003e\n\u003cli\u003eServer đa luồng (multi-thread) xử lý đồng thời nhiều client\u003c/li\u003e\n\u003cli\u003eGiao tiếp tin nhắn realtime giữa client và server\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eCông nghệ:\u003c/strong\u003e Java Core • Java Networking • Multithreading\u003c/p\u003e","title":"Dự Án"},{"content":" ## 👋 Lê Thanh Hoàng Đức Sinh viên năm 3 Công nghệ Thông tin – HUTECH\nChuyên ngành Hệ thống Thông tin Ứng dụng\nTôi tập trung phát triển Backend, đặc biệt là lập trình mạng với Java (Client–Server, Socket, Multithreading).\nMục tiêu của tôi là xây dựng các hệ thống ổn định – dễ mở rộng – hiệu năng cao.\n🎯 Sở thích ⚽ Thể thao Thích đá banh để vận động và giải tỏa căng thẳng Xem các trận bóng hay, đặc biệt là những trận đấu hấp dẫn 🎮 Giải trí Chơi game để thư giãn sau giờ học và làm việc Quan tâm đến các game có tính chiến thuật hoặc đồng đội 🍜 Ăn uống Thích ăn uống, khám phá các món ngon Đam mê đồ ăn vặt và các quán ăn mới 🎓 Chứng chỉ \u0026amp; Khóa học 📜 JavaScript Essentials 1 📜 Java Essentials 2 📜 Networking Fundamentals 🎯 Mục tiêu Thành thạo Java Networking \u0026amp; Backend Architecture Xây dựng các dự án Client–Server thực tế Chuẩn bị nền tảng để học Spring Boot \u0026amp; Microservices 📝 Xem Blog 💼 Dự Án 🏠 Trang Chủ ","permalink":"https://hoangduccudcud.github.io/about/","summary":"\u003cdiv style=\"text-align:center; margin: 2rem 0;\"\u003e\n  \u003cimg src=\"/images/hero.jpg\"\n       alt=\"Hero\"\n       style=\"max-width: 480px; width: 100%; border-radius: 12px;\" /\u003e\n\u003c/div\u003e\n## 👋 Lê Thanh Hoàng Đức\n\u003cp\u003eSinh viên năm 3 \u003cstrong\u003eCông nghệ Thông tin – HUTECH\u003c/strong\u003e\u003cbr\u003e\nChuyên ngành \u003cstrong\u003eHệ thống Thông tin Ứng dụng\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eTôi tập trung phát triển \u003cstrong\u003eBackend\u003c/strong\u003e, đặc biệt là \u003cstrong\u003elập trình mạng với Java (Client–Server, Socket, Multithreading)\u003c/strong\u003e.\u003cbr\u003e\nMục tiêu của tôi là xây dựng các hệ thống \u003cstrong\u003eổn định – dễ mở rộng – hiệu năng cao\u003c/strong\u003e.\u003c/p\u003e","title":"Giới Thiệu"},{"content":"Liên hệ với tôi Tôi luôn sẵn sàng trao đổi về lập trình, dự án cá nhân hoặc cơ hội học hỏi cùng nhau.\nEmail\nhoangduccudcud@gmail.com\nGitHub\ngithub.com/hoangduccudcud\nTrang Chủ Blog Dự Án ","permalink":"https://hoangduccudcud.github.io/contact/","summary":"\u003ch2 id=\"liên-hệ-với-tôi\"\u003eLiên hệ với tôi\u003c/h2\u003e\n\u003cp\u003eTôi luôn sẵn sàng trao đổi về lập trình, dự án cá nhân hoặc cơ hội học hỏi cùng nhau.\u003c/p\u003e\n\u003cdiv class=\"contact-info\"\u003e\n\u003cp\u003e\u003cstrong\u003eEmail\u003c/strong\u003e\u003cbr\u003e\n\u003ca href=\"mailto:hoangduccudcud@gmail.com\"\u003ehoangduccudcud@gmail.com\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eGitHub\u003c/strong\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/hoangduccudcud\"\u003egithub.com/hoangduccudcud\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"action-links\"\u003e\n  \u003ca href=\"/\" class=\"button\"\u003eTrang Chủ\u003c/a\u003e\n  \u003ca href=\"/posts/\" class=\"button\"\u003eBlog\u003c/a\u003e\n  \u003ca href=\"/projects/\" class=\"button\"\u003eDự Án\u003c/a\u003e\n\u003c/div\u003e","title":"Liên Hệ"}]