VietTuts

Tự Học Lập Trình Online

  • Home
  • Java
  • Servlet
  • JSP
  • Struts2
  • Hibernate
  • Spring
  • MyBatis
  • Java WS
  • C
  • C++
  • Python
  • PHP
  • Eclipse
  • VBA
  • Web
    • JavaScript
    • JQUERY
    • JSON
    • AJAX
    • CSS
    • HTML
    • Node.js
    • Angular 7
  • SQL
    • MySQL
    • SQL Server
  • Misc
    • Phần mềm tiện ích
    • Cấu trúc dữ liệu và giải thuật
    • Học lập trình C#
    • Selenium Test
Java Cơ Bản Các Khái Niệm Java OOPs Java String

Giao Thức TCP

Giao thức TCP/IP là gì? TCP/IP transfer file example

Giáo Thức UDP

Giao thức UDP là gì? UDP transfer file example

Giao Thức FTP

FTP là gì? Cài đặt FTP Server trên Window Connect FTP Server trong java Get list file from FTP Server Download file from FTP Server
Các Lớp Lồng Nhau Đa Luồng (Multithreading) Java AWT Java Swing Java I/O Java Date Chuyển Đối Kiểu Dữ Liệu Java Collections Java JDBC Các Tính Năng Mới Trong Java Bài Tập Java Có Lời Giải Câu Hỏi Phỏng Vấn Java

UDP transfer file example


Học java core
Học lập trình Spring Framework

Nội dung chính

  • Kiến thức cần nhớ
  • UDP transfer file example
    • Cách giải bài toán
    • Cài đặt phía server
    • Cài đặt phía client
  • Download Source Code

Kiến thức cần nhớ

  • UDP có cơ chế gửi tin không tin cậy, có nghĩa là chỉ cần gửi không cần check xem đã đến đích hay chưa.
  • Trong java, cả UDP server và UDP client đều sử dụng đối tượng java.net.DatagramSocket để giao tiếp với nhau.
  • Đối tượng java.net.DatagramPacket được sử dụng để đóng gói dữ liệu để gửi đi, và nhận dữ liệu dưới dạng được đóng gói. Số lượng maximum bytes bạn có thể gửi thông qua UDP là 65508 bytes cho một lần.


UDP transfer file example

Đây là một ví dụ về việc sử dụng giao thức UDP để truyền file.

Cách giải bài toán

Các file được transfer có thể có dung lượng (bytes) khác nhau, đối với UDP mỗi lần transfer, số maximum bytes là 65508, do vậy chúng ta cần chia nhỏ file thành nhiều phần để gửi đi. Trước khi gửi file từ client lên server, client phải thông báo cho server biết rằng đang chuẩn bị gửi file với các thông tin như tên file, file được chia ra thành bao nhiêu phần, mỗi phần có dung lượng là bao nhiêu... các thông tin này được đóng gói trong đối tượng FileInfo. Trong ví dụ này chúng tôi chia file ra thành các phần có dung lượng 32k, và phần cuối cùng có dung lượng là phần dư của tổng dung lượng chia cho 32k.


Cài đặt phía server

Cấu trúc project:

UDP transfer file example

Tạo lớp vn.viettuts.common.FileInfo để nhận thông tin của file:

package vn.viettuts.common;

import java.io.Serializable;

public class FileInfo implements Serializable {
    private static final long serialVersionUID = 1L;

    private String destinationDirectory;
    private String sourceDirectory;
    private String filename;
    private long fileSize;
    private int piecesOfFile;
    private int lastByteLength;
    private String status;
    
    // Constructors
    
    // Getter and setter
}

Tạo lớp UDPServer.java

Tạo lớp UDPServer.java với các nội dung sau:

Định nghĩa dung lượng (32KB) mỗi lần nhận, đối tượng DatagramSocket, và port giao tiếp:

private static final int PIECES_OF_FILE_SIZE = 1024 * 32;
private DatagramSocket serverSocket;
private int port = 6677;

Phương thức openServer():

private void openServer() {
    try {
        serverSocket = new DatagramSocket(port);
        System.out.println("Server is opened on port " + port);
        listening();
    } catch (SocketException e) {
        e.printStackTrace();
    }
}

Xử lý nhận thông tin file, và nội dung file:

public void receiveFile() {
    byte[] receiveData = new byte[PIECES_OF_FILE_SIZE];
    DatagramPacket receivePacket;
    
    try {
        // get file info
        receivePacket = new DatagramPacket(receiveData, receiveData.length);
        serverSocket.receive(receivePacket);
        InetAddress inetAddress = receivePacket.getAddress();
        ByteArrayInputStream bais = new ByteArrayInputStream(
                receivePacket.getData());
        ObjectInputStream ois = new ObjectInputStream(bais);
        FileInfo fileInfo = (FileInfo) ois.readObject();
        // show file info
        if (fileInfo != null) {
            System.out.println("File name: " + fileInfo.getFilename());
            System.out.println("File size: " + fileInfo.getFileSize());
            System.out.println("Pieces of file: " + fileInfo.getPiecesOfFile());
            System.out.println("Last bytes length: "+ fileInfo.getLastByteLength());
        }
        // get file content
        System.out.println("Receiving file...");
        File fileReceive = new File(fileInfo.getDestinationDirectory() 
                + fileInfo.getFilename());
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream(fileReceive));
        // write pieces of file
        for (int i = 0; i < (fileInfo.getPiecesOfFile() - 1); i++) {
            receivePacket = new DatagramPacket(receiveData, receiveData.length, 
                    inetAddress, port);
            serverSocket.receive(receivePacket);
            bos.write(receiveData, 0, PIECES_OF_FILE_SIZE);
        }
        // write last bytes of file
        receivePacket = new DatagramPacket(receiveData, receiveData.length, 
                inetAddress, port);
        serverSocket.receive(receivePacket);
        bos.write(receiveData, 0, fileInfo.getLastByteLength());
        bos.flush();
        System.out.println("Done!");

        // close stream
        bos.close();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

Hàm main():

public static void main(String[] args) {
    UDPServer udpServer = new UDPServer();
    udpServer.openServer();
}

Cài đặt phía client

Cấu trúc project:

UDP transfer file example

Tạo lớp vn.viettuts.common.FileInfo để gửi thông tin của file:

package vn.viettuts.common;

import java.io.Serializable;

public class FileInfo implements Serializable {
    private static final long serialVersionUID = 1L;

    private String destinationDirectory;
    private String sourceDirectory;
    private String filename;
    private long fileSize;
    private int piecesOfFile;
    private int lastByteLength;
    private String status;
    
    // Constructors
    
    // Getter and setter
}

Tạo lớp UDPClient.java

Tạo lớp UDPClient.java với các nội dung sau:

Định nghĩa dung lượng (32KB) mỗi lần gửi, đối tượng DatagramSocket, host và port của server:

private static final int PIECES_OF_FILE_SIZE = 1024 * 32;
private DatagramSocket clientSocket;
private int serverPort = 6677;
private String serverHost = "localhost";

Định nghĩa phương thức kết nối server connectServer():

private void connectServer() {
    try {
        clientSocket = new DatagramSocket();
    } catch (SocketException e) {
        e.printStackTrace();
    }
}

Xử lý gửi thông tin file và nội dung file, phương thức sendFile():

private void sendFile(String sourcePath, String destinationDir) {
    InetAddress inetAddress;
    DatagramPacket sendPacket;

    try {
        File fileSend = new File(sourcePath);
        InputStream inputStream = new FileInputStream(fileSend);
        BufferedInputStream bis = new BufferedInputStream(inputStream);
        inetAddress = InetAddress.getByName(serverHost);
        byte[] bytePart = new byte[PIECES_OF_FILE_SIZE];
        
        // get file size
        long fileLength = fileSend.length();
        int piecesOfFile = (int) (fileLength / PIECES_OF_FILE_SIZE);
        int lastByteLength = (int) (fileLength % PIECES_OF_FILE_SIZE);

        // check last bytes of file
        if (lastByteLength > 0) {
            piecesOfFile++;
        }

        // split file into pieces and assign to fileBytess
        byte[][] fileBytess = new byte[piecesOfFile][PIECES_OF_FILE_SIZE];
        int count = 0;
        while (bis.read(bytePart, 0, PIECES_OF_FILE_SIZE) > 0) {
            fileBytess[count++] = bytePart;
            bytePart = new byte[PIECES_OF_FILE_SIZE];
        }

        // read file info
        FileInfo fileInfo = new FileInfo();
        fileInfo.setFilename(fileSend.getName());
        fileInfo.setFileSize(fileSend.length());
        fileInfo.setPiecesOfFile(piecesOfFile);
        fileInfo.setLastByteLength(lastByteLength);
        fileInfo.setDestinationDirectory(destinationDir);

        // send file info
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(fileInfo);
        sendPacket = new DatagramPacket(baos.toByteArray(), 
                baos.toByteArray().length, inetAddress, serverPort);
        clientSocket.send(sendPacket);

        // send file content
        System.out.println("Sending file...");
        // send pieces of file
        for (int i = 0; i < (count - 1); i++) {
            sendPacket = new DatagramPacket(fileBytess[i], PIECES_OF_FILE_SIZE,
                    inetAddress, serverPort);
            clientSocket.send(sendPacket);
            waitServer(40);
        }
        // send last bytes of file
        sendPacket = new DatagramPacket(fileBytess[count - 1], PIECES_OF_FILE_SIZE,
                inetAddress, serverPort);
        clientSocket.send(sendPacket);
        waitServer(40);

        // close stream
        bis.close();
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    System.out.println("Sent.");
}

Hàm waitMillisecond(): đây là chỉ biện pháp tạm thời để đảm bảo gói tin đã được nhận.

public void waitMillisecond(long millisecond) {
    try {
        Thread.sleep(millisecond);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

Hàm main():

public static void main(String[] args) {
    String sourcePath = "D:\\client\\test.zip";
    String destinationDir = "D:\\server\\";
    UDPClient udpClient = new UDPClient();
    udpClient.connectServer();
    udpClient.sendFile(sourcePath, destinationDir);
}

Download Source Code

UDPServer

UDPClient


Học java core
Học lập trình Spring Framework

Recent Updates

Toán tử dấu 2 chấm (::) trong Java 8Lambda Expression - Biểu thức Lambda trong java 8Hướng dẫn lập trình Angular 7 với trình soạn thảo Visual Studio CodeBài tập Java - Sắp xếp nhanh (Quick Sort) trong JavaBài tập Java - Sắp xếp chèn (Insertion Sort) trong JavaBài tập Java - Sắp xếp nổi bọt (Bubble Sort) trong JavaBài tập quản lý sinh viên trong JavaHashSet trong javaHashMap trong javaLớp WindowAdapter trong Java SwingLớp MouseMotionAdapter trong Java SwingLớp MouseAdapter trong Java Swing

VietTuts on facebook

Học Lập Trình Online Miễn Phí - VietTuts.Vn

Danh sách bài học

Học java
Học servlet
Học jsp
Học Hibernate
Học Struts2
Học Spring
Học SQL

Câu hỏi phỏng vấn

201 câu hỏi phỏng vấn java
25 câu hỏi phỏng vấn servlet
75 câu hỏi phỏng vấn jsp
52 câu hỏi phỏng vấn Hibernate
70 câu hỏi phỏng vấn Spring
57 câu hỏi phỏng vấn SQL

About VietTuts.Vn

Hệ thống bài học trên VietTuts.Vn bao gồm các bài lý thuyết và thực hành về các công nghệ java và công nghệ web. Các bài lý thuyết trên hệ thống VietTuts.Vn được tham khảo và tổng hợp từ các trang http://javatpoint.com, http://www.tutorialspoint.com, http://docs.oracle.com/en …

Scroll back to top

Copyright © 2016 VietTuts.Vn all rights reserved. | VietTuts.Vn team | Liên hệ | Chính sách - riêng tư | sitemap.html | sitemap_index.xml