GP Coder

Trang chia sẻ kiến thức lập trình Java

  • Java Core
    • Basic Java
    • OOP
    • Exception Handling
    • Multi-Thread
    • Java I/O
    • Networking
    • Reflection
    • Collection
    • Java 8
  • Design pattern
    • Creational Pattern
    • Structuaral Pattern
    • Behavior Pattern
  • Web Service
    • SOAP
    • REST
  • JPA
  • Java library
    • Report
    • Json
    • Unit Test
  • Message Queue
    • ActiveMQ
    • RabbitMQ
  • All
Trang chủ Java Core Networking Lập trình mạng với java

Lập trình mạng với java

Đăng vào 22/03/2018 . Được đăng bởi GP Coder . 20471 Lượt xem . Toàn màn hình

Trong bài này, tôi sẽ giới thiệu về lập trình mạng trong Java và giới thiệu một số lớp quan trọng trong gói java.net. Trong bài viết tiếp theo tôi sẽ hướng dẫn các bạn cách xây dựng ứng dụng Client-Server sử dụng Socket theo cơ chế giao tiếp TCP và UDP.

Nội dung

  • 1 Giới thiệu
  • 2 Một số lớp quan trọng trong gói java.net

Giới thiệu

Lập trình mạng là tạo ra các ứng dụng làm việc với nhau thông qua môi trường mạng, chẳng hạn như Web, Mail, Skype, Zalo, …

Lập trình socket Java cung cấp cách thức để chia sẻ dữ liệu giữa các thiết bị máy tính khác nhau.

Một số khái niệm cần nắm trong Java networking:

Socket

Socket là một giao diện lập trình ứng dụng (API-Application Programming Interface).

Socket cho phép thiết lập các kênh giao tiếp mà hai đầu kênh được đánh dấu bởi hai cổng (port). Thông qua các cổng này một quá trình có thể nhận và gởi dữ liệu với các quá trình khác.

Port Number

Để có thể thực hiện các cuộc giao tiếp, một trong hai quá trình phải công bố số hiệu cổng (port number) của socket mà mình sử dụng. Mỗi cổng giao tiếp thể hiện một địa chỉ xác định trong hệ thống. Khi quá trình được gán một số hiệu cổng, nó có thể nhận dữ liệu gởi đến cổng này từ các quá trình khác. Quá trình còn lại cũng được yêu cầu tạo ra một socket.

Số cổng (port number) được sử dụng để xác định duy nhất các ứng dụng khác nhau. Nó hoạt động như một điểm kết cuối giao tiếp giữa các ứng dụng.

Số cổng được kết hợp với địa chỉ IP để giao tiếp giữa hai ứng dụng.

Số hiệu cổng gán cho Socket phải duy nhất trên phạm vi máy tính đó, có giá trị trong khoảng từ 0 đến 65535 (16 bits). Trong đó, giá trị cổng:

  • Từ 0-1023: là cổng hệ thống (common hay well-known ports), được dành riêng cho các quá trình của hệ thống.
  • Từ 1024-49151: là cổng phải đăng ký (registered port). Các ứng dụng muốn sử dụng cổng này phải đăng ký với IANA (Internet Assigned Numbers Authority).
  • Từ 49152-65535: là cổng dùng riêng hay cổng động (dynamic hay private port). Người sử dụng có thể dùng cho các ứng dụng của mình, không cần phải đăng ký.

Một số cổng thường được sử dụng:

  • 21: dịch vụ FTP
  • 23: dịch vụ Telnet
  • 25: dịch vụ Email (SMTP)
  • 80: dịch vụ Web (HTTP)
  • 110: dịch vụ Email (POP)

IP Address

Ngoài số hiệu cổng, hai bên giao tiếp còn phải biết địa chỉ IP của nhau. Địa chỉ IP giúp phân biệt máy tính này với máy tính kia trên mạng TCP/IP. Trong khi số hiệu cổng dùng để phân biệt các quá trình khác nhau trên cùng một máy tính.

Địa chỉ IP (IP Address) là một số duy nhất được gán cho một nút của mạng, ví dụ: 192.168.0.1. Nó bao gồm các số thập phân trong khoảng từ 0 đến 255.

Tham khảo thêm về địa chỉ IP: http://echip.com.vn/tim-hieu-ve-dia-chi-ip-a20130406070715832-c1110.html

IP Address là một địa chỉ luận lý (logical address) có thể được thay đổi.

MAC Address

Địa chỉ MAC (Media Access Control) là tầng con giao thức truyền dữ liệu (data link), một phần của tầng liên kết dữ liệu trong mô hình 7 tầng OSI. Nó là một định danh duy nhất của NIC (Network Interface Controller).

Một nút mạng có thể có nhiều NIC nhưng chỉ có duy nhất một địa chỉ MAC.

Protocol

Một giao thức (Protocol) là một bộ các quy tắc cơ bản, mà các ứng dụng phải tuân thủ để giao tiếp. Ví dụ: giao thức TCP, FTP, Telnet, SMTP, POP, …

Các chế độ giao tiếp

Xét kiến trúc của hệ thống mạng TCP/IP:

Tầng vận chuyển giúp chuyển tiếp các thông điệp giữa các chương trình ứng dụng với nhau. Nó có thể hoạt động theo hai chế độ:

  • Giao tiếp có nối kết, nếu sử dụng giao thức TCP.
  • Hoặc giao tiếp không nối kết, nếu sử dụng giao thức UDP.

Socket là giao diện giữa chương trình ứng dụng với tầng vận chuyển. Nó cho phép ta chọn giao thức sử dụng ở tầng vận chuyển là TCP (Transmission Control Protocol) hay UDP (User Datagram Protocol) cho chương trình ứng dụng của mình.

So sánh TCP với UDP:

TCP (Transmission Control Protocol)UDP (User Datagram Protocol)
Giao thức hướng kết nối (connection-oriented protocol), tồn tại kênh giao tiếp ảo giữa hai bên giao tiếp.Giao thức không kết nối (connection-less protocol), không tồn tại kênh giao tiếp ảo giữa hai bên giao tiếp.
Dữ liệu được gởi đi theo chế độ bảo đảm: có kiểm tra lỗi. truyền lại gói tin lỗi hay mất, bảo đảm thứ tự đến của các gói tin . . .Dữ liệu được gởi đi theo chế độ không bảo đảm: Không kiểm tra lỗi, không phát hiện không truyền lại gói tin bị lỗi hay mất, không bảo đảm 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 có thể không chính xác, tốc độ truyền nhanh
Thích hợp cho các ứng dụng cần độ chính xác cao như: truyền file, thông tin điều khiển, …Thích hợp cho các ứng dụng không yêu cần độ chính xác cao nhưng cần tốc độ nhanh như: truyền âm thanh, hình ảnh, …

Một số lớp quan trọng trong gói java.net

Lớp Url

URL là viết tắt của Uniform Resource Locator và biểu diễn một tài nguyên trên Web, ví dụ như một trang Web hoặc thư mục FTP.

Một URL có thể được phân chia thành các phần như sau:

Lớp java.net.Url cung cấp các phương thức để truy cập các phần khác nhau của URL như sau:

  • public String getPath() : trả về path của URL đó
  • public String getQuery() : trả về phần query của URL đó
  • public String getAuthority() : trả về authority của URL đó
  • public int getPort() : trả về port của URL đó
  • public int getDefaultPort() : trả về port mặc định cho protocol của URL đó
  • public String getProtocol() : trả về protocol của URL đó
  • public String getHost() : trả về host của URL đó
  • public String getFile() : trả về filename của URL đó
  • public String getRef() : trả về phần reference của URL đó
  • public URLConnection openConnection() : mở một kết nối tới URL, cho phép một client giao tiếp với tài nguyên.

Ví dụ:


package com.gpcoder.net;

import java.io.IOException;
import java.net.URL;

public class UrlExample {

	public static void main(String[] args) {
		try {
			URL url = new URL("https://www.gpcoder.com:80/java/index.html?page=1&order=desc#java-core");
			System.out.println("URL : " + url.toString());
			System.out.println("protocol : " + url.getProtocol());
			System.out.println("authority : " + url.getAuthority());
			System.out.println("file name : " + url.getFile());
			System.out.println("host : " + url.getHost());
			System.out.println("path : " + url.getPath());
			System.out.println("port : " + url.getPort());
			System.out.println("default port : " + url.getDefaultPort());
			System.out.println("query : " + url.getQuery());
			System.out.println("ref : " + url.getRef());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

Thực thi chương trình trên, ta có kết quả như sau:


URL : https://www.gpcoder.com:80/java/index.html?page=1&order=desc#java-core
protocol : https
authority : www.gpcoder.com:80
file name : /java/index.html?page=1&order=desc
host : www.gpcoder.com
path : /java/index.html
port : 80
default port : 443
query : page=1&order=desc
ref : java-core

Lớp URLConnection

Phương thức openConnection() của lớp java.net.Url trả về một java.net.URLConnection. Đây là lớp abstract mà các lớp phụ của nó biểu diễn các kiểu kết nối URL đa dạng.

Ví dụ:

  • Nếu một URL mà protocol của nó là HTTP, thì phương thức openConnection() trả về một đối tượng HttpURLConnection.
  • Nếu một URL mà biểu diễn một JAR file, thì phương thức openConnection() trả về một đối tượng JarURLConnection.

Một số phương thức quan trọng của lớp URLConnection:

  • Object getContent() : lấy nội dung của URL connection này
  • Object getContent(Class[] classes) : lấy nội dung của URL connection này
  • String getContentEncoding() : trả về giá trị của trường content-encoding header
  • int getContentLength() : trả về giá trị của trường content-length header
  • String getContentType() : trả về giá trị của trường content-type header
  • int getLastModified() : trả về giá trị của trường last-modified header
  • long getExpiration() : trả về giá trị của trường expires header
  • long getIfModifiedSince() : trả về giá trị của trường ifModifiedSince của đối tượng này
  • public void setDoInput(boolean input) : Truyền là true để biểu thị rằng connection sẽ được sử dụng cho input. Giá trị mặc định là true bởi vì Client đọc từ một URLConnection.
  • public void setDoOutput(boolean output) : Truyền là true để biểu thị rằng connection sẽ được sử dụng cho output. Giá trị mặc định là false bởi vì nhiều kiểu URL không hỗ trợ để được ghi trên đó.
  • public InputStream getInputStream() throws IOException : trả về InputStream của URL connection để đọc từ nguồn.
  • public OutputStream getOutputStream() throws IOException : trả về OutputStream của URL connection để ghi từ nguồn.
  • public URL getURL() : trả về URL mà đối tượng URLConnection này được kết nối tới.

Ví dụ:


package com.gpcoder.net;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

public class URLConnectionExample {
	public static void main(String[] args) {
		try {
			URL url = new URL("https://www.w3schools.com/");
			URLConnection urlConnection = url.openConnection();
			BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
			StringBuilder sb = new StringBuilder();
			String line;
			while ((line = br.readLine()) != null) {
				sb.append(line + "\n");
			}
			System.out.println(sb.toString());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

Thực thi chương trình trên, ta có kết quả như sau:


<!DOCTYPE html>
<html lang="en-US">
<head>
<title>W3Schools Online Web Tutorials</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body style="position:relative;min-height:100%;">
<div>
<div class="w3-center"><a class='w3schools-logo' href='//www.w3schools.com'>w3schools<span class='dotcom'>.com</span></a></div>
<div class="w3-center w3-wide w3-hide-small" style="margin:14px 0 -5px 0">THE WORLD'S LARGEST WEB DEVELOPER SITE</div>
</div>
</body>
</html>

Lớp InetAddress

Lớp Java InetAddress đại diện cho một địa chỉ IP. Lớp java.net.InetAddress cung cấp các phương thức để lấy IP của một host bất kỳ.

InetAddress có thể xử lý cả địa chỉ IPv4 và IPv6. InetAddress không có constructor, để tạo một đối tượng InetAddress , bạn phải sử dụng các phương thức Factory.

  • public static InetAddress getLocalHost () : nó trả về thể hiện của InetAdddress chứa tên và địa chỉ localhost.
  • public static InetAddress getByName (String hostname) : nó trả về thể hiện của InetAddress có chứa LocalHost  IP và tên.
  • public static InetAddress[ ] getAllByName (String hostname) : nó trả về danh sách các InetAddress có chứa LocalHost  IP và tên.

Một số phương thức của lớp InetAddress:

  • public String getHostName() : nó trả về tên máy chủ (host) của địa chỉ IP.
  • public String getHostAddress() : nó trả về địa chỉ IP ở định dạng chuỗi.

Ví dụ:


package com.gpcoder.net;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class InetAddressExample {

	public static void main(String[] args) throws UnknownHostException {

		InetAddress ip = InetAddress.getLocalHost();
		System.out.println("Host Name: " + ip.getHostName());
		System.out.println("IP Address: " + ip.getHostAddress());

		ip = InetAddress.getByName("www.studytonight.com");
		System.out.println("\nHost Name: " + ip.getHostName());
		System.out.println("IP Address: " + ip.getHostAddress());

		System.out.println("\nAll address of google: ");
		InetAddress sw[] = InetAddress.getAllByName("www.google.com");
		for (int i = 0; i < sw.length; i++) {
			System.out.println(sw[i]);
		}
	}
}

Thực thi chương trình trên, ta có kết quả như sau:


Host Name: DESKTOP-6NRLLE7
IP Address: 192.168.101.2

Host Name: www.studytonight.com
IP Address: 104.25.248.103

All address of google: 
www.google.com/64.233.187.147
www.google.com/64.233.187.105
www.google.com/64.233.187.104
www.google.com/64.233.187.106
www.google.com/64.233.187.103
www.google.com/64.233.187.99

Lớp Socket, ServerSocket, DatagramPacket, DatagramSocket và MulticastSocket

Để dễ hiểu, các lớp này tôi sẽ giới thiệu ở bài viết xây dựng ứng dụng Client-Server với Socket. Các bạn hãy theo dõi nhé.

Tài liệu tham khảo:

  • https://docs.oracle.com/javase/tutorial/networking/index.html
  • https://docs.oracle.com/javase/tutorial/networking/sockets/index.html
  • Giáo trình Lập trình truyền thông – Thầy Ngô Bá Hùng, Nguyễn Công Huy – Khoa CNTT&TT, Trường Đại học Cần Thơ.
5.0
12
Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé! Và Donate tác giả

Shares

Chuyên mục: Networking Được gắn thẻ: Networking

Hướng dẫn debug code trong eclipse
Xây dựng ứng dụng Client-Server với Socket trong Java

Có thể bạn muốn xem:

  • Xây dựng ứng dụng Client-Server với Socket trong Java (26/03/2018)

Bình luận

bình luận

Tìm kiếm

Bài viết mới

  • Clean code 13/01/2024
  • Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud 02/10/2020
  • Kết nối RabbitMQ sử dụng Web STOMP Plugin 19/06/2020
  • Sử dụng publisher confirm trong RabbitMQ 16/06/2020
  • Sử dụng Dead Letter Exchange trong RabbitMQ 13/06/2020

Xem nhiều

  • Hướng dẫn Java Design Pattern – Factory Method (97789 lượt xem)
  • Hướng dẫn Java Design Pattern – Singleton (97470 lượt xem)
  • Giới thiệu Design Patterns (87421 lượt xem)
  • Lập trình đa luồng trong Java (Java Multi-threading) (86074 lượt xem)
  • Giới thiệu về Stream API trong Java 8 (83526 lượt xem)

Nội dung bài viết

  • 1 Giới thiệu
  • 2 Một số lớp quan trọng trong gói java.net

Lưu trữ

Thẻ đánh dấu

Annotation Authentication Basic Java Behavior Pattern Collection Creational Design Pattern Cấu trúc điều khiển Database Dependency Injection Design pattern Eclipse Exception Executor Service Google Guice Gson Hibernate How to Interceptor IO Jackson Java 8 Java Core JDBC JDK Jersey JMS JPA json JUnit JWT Message Queue Mockito Multithreading OOP PowerMockito RabbitMQ Reflection Report REST SOAP Structuaral Pattern Swagger Thread Pool Unit Test Webservice

Liên kết

  • Clean Code
  • JavaTpoint
  • Refactoring Guru
  • Source Making
  • TutorialsPoint
  • W3Schools Online Web Tutorials

Giới thiệu

GP Coder là trang web cá nhân, được thành lập với mục đích lưu trữ, chia sẽ kiến thức đã học và làm việc của tôi. Các bài viết trên trang này chủ yếu về ngôn ngữ Java và các công nghệ có liên quan đến Java như: Spring, JSF, Web Services, Unit Test, Hibernate, SQL, ...
Hi vọng góp được chút ít công sức cho sự phát triển cộng đồng Coder Việt.

Donate tác giả

Tìm kiếm các bài viết của GP Coder với Google Search

Liên hệ

Các bạn có thể liên hệ với tôi thông qua:
  • Trang liên hệ
  • Linkedin: gpcoder
  • Email: contact@gpcoder.com
  • Skype: ptgiang56it

Follow me

Copyright 2025 © GP Coder · All Rights Reserved · Giới thiệu · Chính sách · Điều khoản · Liên hệ ·

Share

Blogger
Delicious
Digg
Email
Facebook
Facebook messenger
Flipboard
Google
Hacker News
Line
LinkedIn
Mastodon
Mix
Odnoklassniki
PDF
Pinterest
Pocket
Print
Reddit
Renren
Short link
SMS
Skype
Telegram
Tumblr
Twitter
VKontakte
wechat
Weibo
WhatsApp
X
Xing
Yahoo! Mail

Copy short link

Copy link