Networks Business Online Việt Nam & International VH2

Lập Trình Socket Với UDP Khác TCP Thế Nào?

Đăng ngày 07 November, 2022 bởi admin

Bài viết trước mình và các bạn đã tìm hiểu qua về Socket và cách thức lập trình socket với TCP/IP, trong bài viết này mình sẽ nói tiếp về lập trình socket với UDP và điểm khác biệt giữa 2 phương thức trên. Qua đó chúng ta có thể hình dung được sự khác nhau cơ bản giữa 2 giao thức TCP, UDP và biết cách sử dụng chúng trong những tình huống thích hợp.

1. Lập tình socket với UDP

Đầu tiên, UDP là viết tắt của User Datagram Protocol. UDP được trình làng vào năm 1980 và là một trong những giao thức mạng truyền kiếp nhất còn được sử dụng. UDP được sử dụng cho những đường truyền nhu yếu vận tốc cao và thời hạn ngắn như video playback, game stream, game trực tuyến, hay được sử dụng để tìm kiếm trong mạng lưới hệ thống tên miền ( DNS ). Giao thức này giúp tăng vận tốc truyền tải vì nó không nhu yếu liên kết giữa máy gửi và máy nhận trước khi 2 phía hoàn toàn có thể trao đổi thông điệp. Chính điều này UDP cung ứng đường truyền không an toàn và đáng tin cậy bằng gói dữ liệu / datagrams ( group of bytes ) trong khi đó TCP cung ứng đường truyền đáng tin cậy bằng dòng byte, thế cho nên UDP socket và TCP socket cũng có những độc lạ cơ bản .

Với UDP socket, tất cả chúng ta không cần thiết lập link “ handshaking ” giữa client và server trước khi truyền thông điệp, thông điệp được gửi đi một cách độc lập. Bên gửi sẽ chỉ rõ địa chỉ IP và số hiệu cổng ( port number ) của bên nhận. Sau khi thông điệp được truyền đến bên nhận, bện nhận hoàn toàn có thể dựa vào địa chỉ IP và số hiệu cổng tương ứng của bên gửi được gắn trên gói tin để gửi lại response .
Chúng ta hoàn toàn có thể thấy rằng việc truyền bằng gói tin hoàn toàn có thể làm dữ liệu truyền đến không theo thứ tự hoặc bị mất, thêm nữa UDP không cung ứng tính năng trấn áp lỗi, mất gói tin nhưng một phần quyền lợi của việc truyền bằng gói tin chính là vận tốc và thời hạn .
Trước khi lập tình socket UDP tất cả chúng ta cần biết quá trình hoạt động giải trí của mỗi bên client và server, giữa client và server của UDP socket có ít độc lạ hơn so với TCP socket .

 

Với UDP ta không cần thiết lập link 2 chiều giữa client và server .
Về phía client :

  • Cần biết được địa chỉ IP cũng như số hiệu cổng của phía Server
  • Mỗi gói tin gửi đi cần có địa chỉ IP, số hiệu cổng của nơi gửi đến, nơi gửi đi
  • Gửi gói tin cho server

Pseudo code cho client :
Tạo socket
Gửi gói tin đến địa chỉ của server
Nhận gói tin đã giải quyết và xử lý từ server
Đóng socket
Về phía server : nhận gói tin, trích xuất địa chỉ IP, số hiệu cổng của client, giải quyết và xử lý và respond gói tin lại cho client .
Pseudo code cho server :
Tạo socket
Ràng buộc socket với 1 số hiệu cổng mà client sẽ truyền đến
Vòng lặp :
Nhận gói tin từ client
Gửi gói tin đã giải quyết và xử lý cho client
Đóng socket

Bên trên là hoạt động ở phía client và phía server, sau đây là một ví dụ đơn giản ứng dụng UDP socket.

2. Mô phỏng UDP socket với Java Code

Mô tả ví dụ :

  • Client đọc dòng văn bản nhập từ bàn phím người dùng, gửi gói tin tới địa chỉ của server
  • Server nhận gói tin từ client
  • Server sẽ chuyển lại dòng văn bản kèm theo “Server accepted” thông qua 1 gói tin mới tới địa chỉ của client
  • Client đọc dòng văn bản từ gói tin và in ra dòng văn bản nhận được từ server.

Trong ví dụ này mình dùng công cụ Netbeans IDE và class DatagramSocket, DatagramPacket, InetAddress của Java. Sau đây là file java phía server :

package UDPsocket;
import java.net.DatagramSocket;
import java.net.DatagramPacket;
import java.net.InetAddress;
public class serverUDP {
    
    public static void main(String args[]) throws Exception { 
        //Tạo socket phía server với số hiệu cổng 9876
        DatagramSocket serverSocket = new DatagramSocket(9876);   
        while(true) { 
            //tạo biến receiveData để nhận dữ liệu từ gói tin đến 
            byte[] receiveData = new byte[1024];
            //tạo sendData để nhận dữ liệu gửi lên gói tin đi
            byte[] sendData  = new byte[2048];
//            
            //tạo biến receivePacket để nhận gói tin từ socket
            DatagramPacket receivePacket = 
                    new DatagramPacket(receiveData, receiveData.length); 
            //nhận gói tin qua phương thức receive()
            serverSocket.receive(receivePacket);
            //Chuyển dữ liệu vừa nhận về dạng String
            String sentence = new String(receivePacket.getData()); 
 //           
            //Lấy địa chỉ IP của bên gửi
            InetAddress IPAddress = receivePacket.getAddress();
            //Lấy số hiệu cổng bên gửi
            int port = receivePacket.getPort(); 
            //Xử lý dữ liệu vừa nhận
            String sentence_to_client = sentence+ " (server accpeted!)"; 
            
            //tạo gói tin để gửi đi client
            sendData = sentence_to_client.getBytes();
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
            //Gửi gói tin đi
            serverSocket.send(sendPacket); 
        } 
    } 
}

Đầu tiên tạo 1 socket bên server với số cổng, các bạn có thể chọn ngẫu nhiên, ở đây mình để 9876.

Tiếp đến trong vòng lặp while khởi tạo 2 mảng kiểu byte là receiveData và sendData để chứa dữ liệu đến, dữ liệu đi.

Tạo gói tin receivePacket với 2 tham số là receiveData và độ dài của receiveData (1024) để nhận gói tin truyền đến. Mình dùng phương thức receive() để nhận gói tin từ socket.

Tạo biến String sentence để lấy dữ liệu trong gói tin qua phương thức getData(), biến IPAddress để lưu địa chỉ IP của client, biến port để lưu số hiệu cổng của phía client.

Biến sentence_to_client được giải quyết và xử lý và đưa vào mảng sendData bằng phương pháp getBytes ( ) .

Tiếp đến tạo một gói tin mới để truyền đi phía client, như đã nói ở trên thì 1 gói tin truyền đi cần có dữ liệu, địa chỉ IP và số hiệu cổng của bên nhận. Do đó tham số tryền vào ở đây là mảng chứa dữ liệu sendData, độ dài dữ liệu, địa chỉ IP và số hiệu cổng của client mà mình lấy được từ gói tin truyền đến bên trên.

Cuối cùng gửi gói tin lên socket qua phương thức send().

Ở đây mình không tạo điều liện kết thúc vòng lặp là để cho server luôn trong trạng thái chờ gói tin .
File java phía client :

package UDPsocket;
import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class clientUDP {
    public static void main(String args[]) throws Exception { 
        //tạo socket phía client
        DatagramSocket clientSocket = new DatagramSocket(6789); 
        //Tạo địa chỉ IP address bỏi tên "localhost)
        InetAddress IPAddress = InetAddress.getByName("localhost"); 
        
        while(true){
            //Tạo dữ liệu(group of bytes) cho gói tin nhận và gói tin gủi
            byte[] sendData = new byte[1024]; 
            byte[] receiveData = new byte[2048]; 
//         
            //lấy dòng văn bản nhập từ bàn phím và gán cho biến sentence
            BufferedReader inFromUser = 
                    new BufferedReader(new InputStreamReader(System.in)); 
            String sentence = inFromUser.readLine();
//            
            //tạo dữ liệu gửi với dữ liệu vừa nhập từ bàn phím
            sendData = sentence.getBytes();
            //Tạo gói tin để truyền đi
            DatagramPacket sendPacket = 
                    new DatagramPacket(sendData, sendData.length, IPAddress, 9876); 
            //Truyền đến server bằng phương thức send()
            clientSocket.send(sendPacket); 
//        
            //tạo gói tin nhận
            DatagramPacket receivePacket = 
                new DatagramPacket(receiveData, receiveData.length); 
            //lấy biến receivePacket để nhận gói tin bằng phương thức receive()
            clientSocket.receive(receivePacket); 
        
            //Chuyển dữu liệu trong gói tin vừa nhận thành kiểu String và in ra
            String modified_Sentence = new String(receivePacket.getData());
            System.out.println("FROM SERVER:" + modified_Sentence); 
            
            if(sentence.compareTo("quit") == 0) 
                break;
        }
        //Đóng socket
        clientSocket.close(); 
    } 
}

Giống với phía server tiên phong tất cả chúng ta cần tạo 1 socket phía client ràng buộc với 1 số hiệu cổng, sau đó tạo 1 biến IPAddress để lưu địa chỉ IP của phía server, vì ở đây mình lập trình server và client đều trên 1 máy nên tham số truyền vào là “ localhost ” hoặc “ 127.0.0.1 ”, máy tính sẽ tham chiếu đến chính nó .
Trong vòng lặp while, khởi tạo 2 mảng byte để chứa tài liệu và 1 biến String để lấy dòng văn bản nhập từ bàn phím máy tính .
Tiếp theo, cũng giống với ben server lần lượt tạo 2 gói sendData và receiveData để gửi và nhận, riêng với gói tin truyền đi sendPacket thì 4 tham số tuyền vào là mảng tài liệu sendData, độ dài tài liệu, địa chỉ IP và số hiệu cổng ( 9876 ) của server .
Sau khi server nhận được gói tin gửi đi từ phái client, xử lí và gửi lại gói tin mới cho client, phái client sẽ nhận gói tin bằng biến receivePacket uqa phương pháp receive ( ), tiếp đến là chuyển tài liệu vừa nhận sang kiểu String và in ra .
Cuối cùng vòng lặp while sẽ kết thúc khi nhập “ quit ” từ bàn phím, sau đó socket phía client sẽ được đóng với phương pháp close ( ) .

Kết quả

Đây là hiệu quả khi chạy lần lượt 2 file trên :

3. UDP khác TCP như thế nào?

Như vậy những bạn vừa khám phá xong về lập trình socket với UDP. Qua đó tưởng tượng được sự khác nhau giữa 2 giao thức UDP và TCP .

UDP cho tốc độ nhanh, không tốn chi phí thiết lập liên kết nên phú hợp cho thông báo dữ liệu thời tiết, phát video trực tuyến, dịch vụ báo giá cổ phiếu (không dùng cho giao dịch) hoặc cho lưu lương đa luồng,…Trong khi đó, TCP cung cấp dịch vụ truyền dòng byte tin cậy thông qua việc thiết lập liên kết 2 chiều và có kiểm tra lỗi, mất dữ liệu nên phù hợp với việc truyền file, gửi email, tình duyệt web,…

Trước khi lập trình socket ta cần xác lập giao thức nào tương thích, UDP hay TCP và thuộc phía client hay server, phía client thì giả sử phía server đã hoạt động giải trí ta chỉ cần liên kết đến, còn phía server thì cần khởi động và chờ liên kết .
Các bạn hoàn toàn có thể khám phá lập tình socket cơ bản với TCP / IP tại đây : lap-trinh-socket-voi-TCP

Lời kết

Qua bài này tất cả chúng ta đã khám phá về lập tình Socket với UDP, sự khác nhau cơ bản giữa lập trình Socket UDP vs TCP và một vài khái niệm đơn thuần về mạng máy tính. Bài viết này mình có tìm hiểu thêm một số ít tài liệu của ĐH Bách Khoa Thành Phố Hà Nội và ĐH Cornell. Nếu có vướng mắc, bạn đọc vui mắt phản hồi bên dưới để mọi người cùng giải đáp. Cảm ơn bạn đọc, chúc bạn đọc thành công xuất sắc trên con đường học tập !

Source: https://vh2.com.vn
Category : Tin Học