Ngày nay máy tính & Internet đã trở nên rất thông dụng với tất cả mọi người, con người sử dụng máy tính với nhiều mục đích khác nhau như trao đổi thông tin, xem truyền hình, gửi tin nhắn với bạn bè, chơi game với những người chơi khác, và có thể mua bán những gì cần thiết. Thật khó để nói rằng mỗi ngày có thêm bao nhiêu máy tính kết nối internet, nhưng chúng ta có thể nói rằng internet phát triển một cách vô cùng nhanh chóng? Vậy làm thể nào để các chương trình có thể giao tiếp với nhau qua mạng. Mục tiêu của bài hướng dẫn lần này sẽ giúp các bạn đọc có được cái nhìn tổng quan nhất về các khái niệm về mạng, về giao thức, … các xây dựng một chương trình ứng dụng đơn giản sử dụng mô hình client- server để truyền tài thông tin
Sau đây là một số các khái niệm cơ bản nhất sẽ phục vụ cho phần tìm hiểu của các bạn rất nhiều
1. Networks, Packets, and Protocols
- Networks (Mạng) : là một tập hợp các máy tính được nối với nhau bởi đường truyền theo một cấu trúc nào đó và thông qua đó các máy tính trao đổi thông tin qua lại cho nhau.
- Packets (Gói tin) : tập hợp các byte một cách tuần tự được gọi chung là gói tin. Một gói tin chứa các thông tin điều khiển mà mạng cần dùng để xử lý đôi khi các gói tin bao gồm các dữ liệu người dùng.
- Protocols (Giao thức) : là sự định nghĩa sẵn cách thức mà các đối tượng phần mềm máy tính, thí dụ như trình duyệt web, dùng để “giao tiếp” với các dịch vụ mà chúng muốn sử dụng. Giao thức thường là các đoạn văn bản đơn giản mô tả cách thức máy khách và máy chủ “đàm thoại” với nhau
2. Clients and Servers
- Các ứng dụng mạng thường hoạt động theo mô hình client/server như thư điện tử,truyền nhận tập tin, game trên mạng, … Mô hình này gồm có một chương trình đóng vai trò là client và một chương trình đóng vai trò là server. Hai chương trình này sẽ giao tiếp với nhau thông qua mạng. Chương trình server đóng vai trò cung cấp dịch vụ. Chương trìnhnày luôn luôn lắng nghe các yêu cầu từ phía client, rồi tính toán và đáp trả kết quả tương ứng. Chương trình client cần một dịch vụ và gởi yêu cầu dịch vụ tới chương trình server vàđợi đáp trả từ server. Như vậy, quá trình trao đổi dữ liệu giữa client/server bao gồm:
- Truyền một yêu cầu từ chương trình client tới chương trình server
- Yêu cầu được server xử lý
- Truyền đáp ứng cho client
3. Socket?
- Socket : là một phương pháp để thiết lập kết nối truyền thông giữa một chương trình yêu cầu dịch vụ và một chương trình cung cấp dịch vụ trên mạng LAN, WAN, hay Internet và đôi khi là giữa các tiến trình trong cùng một máy tính. Thông tin của một Socket bao gồm địa chỉ IP và số hiệu cổng.
II. Lập trình socket với TCP
1. Nhắc lại khái niệm
- Socket là một đầu trong kết nối liên lạc hai chiều giữa hai chương trình trên mạng. Gói java.net cung cấp lớp Socket để cài đặt kết nối phía client và ServerSocket để cài đặt kết nối phía server.
- SocketServer đợi, lắng nghe yêu cầu kết nối từ SocketClient
- Khi chấp nhận kết nối, SocketServer tạo một socket mới kết buộc với một cổng khác để phục vụ cho client đã kết nối, trong khi SocketServer vẫn tiếp tục lắng nghe yêu cầu kết nối từ các client khác.
- Sau đó server và client sẽ liên lạc với nhau thông qua socket của chúng.
Lưu ý:
+ Client dùng cổng cục bộ trên máy của client.
+ Nếu kết nối tới Web Server thì lớp URL thích hợp hơn lớp Socket, thực ra lớp URL cũng sẽ sử dụng lớp socket
2. Cấu trúc chương trình client
Bước 1: Mở socket (dùng để kết nối tới server)
Lệnh sử dụng: Socket cs = new Socket(“ServerName”, port);
Bước 2: Mở luồng đọc (dùng để đọc dữ liệu do server gửi)
Lệnh sử dụng: BufferedReader in = new BufferedReader (new InputStreamReader( cs.getInputStream() ));
Bước 3: Mở luồng ghi (dùng để gửi dữ liệu cho server)
Lệnh sử dụng: PrintWriter out = new PrintWriter (cs.getOutputStream(), true);
Bước 4: Mở luồng đọc dữ liệu từ bàn phím (nếu cần)
Lệnh sử dụng: BufferedReader stdIn = new BufferedReader (new InputStreamReader(System.in) );
Bước 5: Gửi dữ liệu cho server
Lệnh sử dụng: out.println(String str);
Bước 6: Lấy dữ liệu do server gửi
Lệnh sử dụng: String str=in.readLine();
Bước 7: Đóng các luồng đọc, ghi, đóng socket
Lệnh sử dụng: in.close();out.close(); sdtIn.close(); cs.close();
Ví dụ chương trình client:
package client; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; /**
* @author ThangND
* @website vi-infotech.com
*/ public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
//Tên server và cổng kết nối
Socket sk = new Socket("localhost", 1234);
PrintWriter out = new PrintWriter(sk.getOutputStream(), true);
BufferedReader in= new BufferedReader(new InputStreamReader(sk.getInputStream()));
out.close();
in.close();
sk.close();
}
}
3. Cấu trúc chương trình server
Bước 1: Mở socket (dùng để kết nối tới client)
Lệnh sử dụng: ServerSocket ss = new ServerSocket(port);
Bước 2: Chờ client kết nối và chấp nhận kết nối
Lệnh sử dụng: Socket cs= ss.accept();
Bước 3: Mở luồng đọc(dùng đẻ đọc dữ liệu do server gửi)
Lệnh sử dụng: BufferedReader in = new BufferedReader (new InputStreamReader( cs.getInputStream() ));
Bước 4: Mở luồng ghi dữ liệu (Dùng để gửi dữ liệu cho phía client)
Lệnh sử dụng: PrintWrite out = new PrintWriter (cs.getOutputStream(), true);
Bước 5: Tạo luồng đọc dữ liệu từ bàn phím (nếu cần)
Lệnh sử dụng: BufferedReader stdIn = new BufferedReader (new InputStreamReader(System.in) );
Bước 6: Lấy dữ liệu cho client
Lệnh sử dụng: out.println(String str);
Bước 7: Lấy dữ liệu cho client gửi
Lệnh sử dụng: String str=in.readLine();
Bước 8: Đóng các luồng đọc/ghi, đóng các socket
Lệnh sử dụng: in.close();out.close(); sdtIn.close(); cs.close(); ss.close();
Ví dụ chương trình server cho 1 client:
package server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; /*
* @author Admin
* @Website vi-infotech.com
* Server - One Client
*/ public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(1234);
boolean listening = true;
Socket sk = ss.accept();
PrintWriter out = new PrintWriter(sk.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(sk.getInputStream()));
out.close();
in.close();
sk.close();
ss.close();
}
}
Bài viết về những kiến thức cơ bản nhất nhưng rất dễ hiểu, tường minh. Many thanks.
Trả lờiXóa