Giới Thiệu
Chào các bạn! Trong thế giới công nghệ ngày nay, việc hiểu rõ về mạng máy tính là rất cần thiết. Bài viết này sẽ giúp bạn hiểu cách mà hai máy tính có thể giao tiếp với nhau qua mạng bằng ngôn ngữ lập trình Java.
Mỗi Cuộc Gọi Cần Có Gì?
Khi hai cuộc gọi được thực hiện, có một số điều kiện cần thiết:
- Hai bên đều cần có thiết bị liên lạc, chẳng hạn như điện thoại.
- Ít nhất một trong hai bên cần phải biết số điện thoại của nhau.
- Bên gửi gọi cho bên nhận.
- Bên nhận nhấc máy.
- Hai bên bắt đầu trao đổi thông tin.
Trong tương tác giữa hai máy tính, chúng ta cũng cần những yếu tố tương tự nhưng điều này được thực hiện thông qua các lớp và protocol mạng.
Gói Java.Net
Java cung cấp một thư viện mạnh mẽ cho lập trình mạng thông qua gói Java.net. Bạn có thể tưởng tượng gói này như một cửa hàng điện thoại, nơi cung cấp các công cụ cần thiết để chúng ta có thể xây dựng các ứng dụng mạng.
Thiết Bị Đầu Cuối
Hai thành phần chính trong Java Networking là Socket và ServerSocket, đóng vai trò như hai điểm cuối trong quá trình giao tiếp.
Socket
Socket giống như điện thoại, cho phép bạn thực hiện cuộc gọi sử dụng phương thức connect() để kết nối đến một địa chỉ cụ thể.
ServerSocket
ServerSocket giống như điện thoại dành cho tiếp nhận cuộc gọi, sử dụng phương thức accept() để chấp nhận cuộc gọi từ các Socket khác.
Kết Nối TCP và UDP
Socket và ServerSocket có thể kết hợp để xây dựng một kết nối TCP. Ngoài ra, chúng ta cũng có thể sử dụng DatagramSocket để tạo kết nối UDP. Những chủ đề như TCP và UDP sẽ được đề cập trong các bài viết sau.
Địa Chỉ IP và Số Điện Thoại
Trong giao thức TCP/IP, số điện thoại được định nghĩa bởi sự kết hợp giữa Địa Chỉ IP và Cổng (Port)
InetAddress
Đây là lớp đại diện cho một địa chỉ IP. Ví dụ, để lấy địa chỉ IP của google.com, bạn có thể sử dụng đoạn mã sau:
java
InetAddress google = InetAddress.getByName("google.com");
System.out.println(google);
// google.com/142.251.130.14
InetSocketAddress
Đại diện cho một địa chỉ Socket, được xác định bởi hai thành phần là InetAddress và Port:
java
InetSocketAddress inetSocketAddress = new InetSocketAddress(google, 1234);
System.out.println(inetSocketAddress);
// google.com/142.251.130.14:1234
Thực Hiện Cuộc Gọi
Sau khi đã có Socket, ServerSocket và InetSocketAddress, chúng ta có thể bắt đầu thực hiện cuộc gọi:
Tạo Cuộc Gọi
java
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = null;
try {
socket = new Socket();
InetAddress localhost = InetAddress.getByName("localhost");
InetSocketAddress inetSocketAddress = new InetSocketAddress(localhost, 8080);
socket.connect(inetSocketAddress);
System.out.println("Client info: " + socket);
} finally {
if (socket != null) {
socket.close();
}
}
}
}
Nhấc Máy Chấp Nhận Cuộc Gọi
java
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket();
InetAddress inetAddress = InetAddress.getByName("0.0.0.0");
SocketAddress socketAddress = new InetSocketAddress(inetAddress, 8080);
serverSocket.bind(socketAddress);
Socket clientSocket = serverSocket.accept();
System.out.println("Connected : " + clientSocket);
} finally {
if (serverSocket != null) {
serverSocket.close();
}
}
}
}
Trong đoạn mã trên, chúng ta đã thiết lập ServerSocket để lắng nghe trên địa chỉ 0.0.0.0:8080, cho phép tất cả các kết nối đến.
Tổng Kết
Như vậy, qua bài viết này, bạn đã hiểu rõ cách hai máy tính có thể giao tiếp với nhau thông qua Socket và ServerSocket trong Java. Để có thể trao đổi thông tin, chúng ta cần sử dụng thêm Java IO, chủ đề này sẽ được đề cập trong bài viết tiếp theo.
Hỏi và Đáp
1. Gói Java.net có từ phiên bản nào?
Gói Java.net đã có từ phiên bản đầu tiên của Java (JDK 1.0) vào năm 1996.
2. Socket trong các ngôn ngữ khác?
Socket là khái niệm được hỗ trợ bởi hệ điều hành và có thể được sử dụng trong nhiều ngôn ngữ lập trình khác nhau như Python, C#, và JavaScript. Dưới đây là ví dụ:
Python
python
import socket
# client
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))
# server
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen()
C#
csharp
using System;
using System.Net;
using System.Net.Sockets;
class Client {
static void Main() {
TcpClient client = new TcpClient("localhost", 12345);
}
}
class Server {
static void Main() {
TcpListener server = new TcpListener(IPAddress.Any, 12345);
server.Start();
}
}
JavaScript
javascript
const net = require('net');
// client
const client = new net.Socket();
client.connect(12345, 'localhost', () => {...});
// server
const server = net.createServer((socket) => {...});
server.listen(12345, 'localhost', () => {
console.log('Server is listening on port 12345');
});
3. Vai trò của Port là gì?
Port giúp chúng ta tránh xung đột khi nhiều ứng dụng chạy trên cùng một máy tính, bằng cách xác định ứng dụng mà kết nối TCP sẽ hướng đến.
4. Có cần hiểu về kết nối ở tầng ứng dụng không?
Dù không cần thiết phải nắm rõ các khái niệm dưới tầng ứng dụng cho mọi lập trình viên, việc hiểu biết về kiến thức cơ bản là nguyên tắc quan trọng trong lập trình.
Link bài viết gốc: Giới thiệu Java Networking
source: viblo