首頁 > Java > java教程 > 如何在Java中使用WebSocket進行即時檔案傳輸

如何在Java中使用WebSocket進行即時檔案傳輸

王林
發布: 2023-12-17 21:59:06
原創
1001 人瀏覽過

如何在Java中使用WebSocket進行即時檔案傳輸

在現代的網路應用中,即時檔案傳輸是不可或缺的一部分。而即時傳輸有很多種方法,WebSocket 是其中最常使用的一種。 Java 中的 WebSocket API 可讓您簡單輕鬆地實現即時文件傳輸的功能。本文將為您介紹如何在 Java 中使用 WebSocket 進行即時檔案傳輸,同時提供一些具體的程式碼範例。

WebSocket 簡介

WebSocket 是 HTML5 標準的一部分,是基於 TCP 的網路協定。這種協定提供了一種透過單一 TCP 連線進行雙向通訊的網路功能,這樣就可以實現即時傳輸。這與傳統的 HTTP 協定不同,HTTP 是一種無狀態的協議,每次請求都需要建立新的連線。

WebSocket 協定的主要特點如下:

  1. 即時性:WebSocket 可以保持長連接,實現即時傳輸,並且可以在服務端和客戶端之間傳遞任意類型的數據。
  2. 雙向通訊:WebSocket 支援雙向通信,服務端可以主動向客戶端推送訊息,而不是只能等待客戶端請求。
  3. 支援多種資料格式:WebSocket 可以傳輸多種類型的資料如文本,二進位等,能夠滿足不同種類應用的需求。

Java WebSocket API 的使用

Java8 引進了 JSR-356,這是 Java 中 WebSocket 標準的 API。 Java WebSocket API 的主要類別都在 javax.websocket 套件中,其 API 主要分為兩類,一類是與 WebSocket 連線本身相關的 API,另一類是與訊息處理相關的 API。

WebSocket 連線相關的 API

Endpoint :代表了一個 WebSocket 端點,可以接收用戶端的連線請求和連線中斷請求。

Session:代表了一個 WebSocket 連線會話,用於傳送和接收文字和二進位訊息。

MessageHandler:WebSocket 訊息處理的接口,有兩個實作類別 Text 和 Binary。使用者可以透過訂閱這個介面來監聽訊息並進行處理。

WebSocket 訊息處理相關的 API

OnMessage:WebSocket 用戶端發送的訊息的處理方法,可以透過註解來實現。

RemoteEndpoint:用於發送訊息。

WebSocket 的使用

在實際開發中,通常需要一個 WebSocket 服務端和一個 WebSocket 用戶端,下面我們將分別介紹如何使用 WebSocket 實作檔案傳輸的功能。

WebSocket 服務端

  1. 首先,我們需要建立一個WebSocket 端點,在這個端點裡,我們可以處理WebSocket 連線請求和連線中斷請求,並建立Session 實例與客戶端建立會話。
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.PongMessage;
import javax.websocket.RemoteEndpoint;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint("/filetransfer")
public class FileTransferEndpoint {

    private static final Logger LOGGER = Logger.getLogger(FileTransferEndpoint.class.getName());

    @OnOpen
    public void onOpen(Session session) {
        LOGGER.log(Level.INFO, "Session " + session.getId() + " has opened a connection");
    }

    @OnMessage
    public void onMessage(ByteBuffer message, Session session) {
        LOGGER.log(Level.INFO, "Received ByteBuffer message from " + session.getId());
        try {
            RemoteEndpoint.Basic remote = session.getBasicRemote();
            remote.sendText("Hello, " + message.toString());
        } catch (IOException e) {
            LOGGER.log(Level.SEVERE, "Failed to send ByteBuffer message ", e);
        }
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        LOGGER.log(Level.INFO, "Received Text message from " + session.getId() + ": " + message);
        try {
            RemoteEndpoint.Basic remote = session.getBasicRemote();
            remote.sendText("Hello, " + message);
        } catch (IOException e) {
            LOGGER.log(Level.SEVERE, "Failed to send Text message ", e);
        }
    }

    @OnMessage
    public void onMessage(PongMessage message, Session session) {
        LOGGER.log(Level.INFO, "Received pong message from " + session.getId() + ": " + message);
    }

    @OnError
    public void onError(Throwable exception, Session session) {
        LOGGER.log(Level.SEVERE, "Session " + session.getId() + " occurred exception ", exception);
    }

    @OnClose
    public void onClose(Session session) {
        LOGGER.log(Level.INFO, "Session " + session.getId() + " has closed the connection");
    }
}
登入後複製
  1. 在上面的程式碼片段中,我們實作了三個 onMessage 方法,分別處理 ByteBuffer,String 和 PongMessage 類型的資料。
  2. 啟動伺服器,從而使 WebSocket 服務端接受客戶端的連線請求。
import javax.websocket.WebSocketContainer;
import javax.websocket.server.ServerEndpointConfig;
import org.glassfish.tyrus.server.Server;

public class Main {

    public static void main(String[] args) {
        Server server = new Server("localhost", 8080, "/", null, FileTransferEndpoint.class);

        try {
            server.start();
            System.in.read();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            server.stop();
        }
    }
}
登入後複製
  1. 在上面的程式碼片段中,我們透過Server 類別建立了一個WebSocket 服務端,它監聽本機的8080 端口,並將客戶端連接請求轉送到FileTransferEndpoint 類別中進行處理。

WebSocket 用戶端

  1. 首先,我們需要建立一個 WebSocket 用戶端,連接到服務端。
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Scanner;

import javax.websocket.ContainerProvider;
import javax.websocket.DeploymentException;
import javax.websocket.WebSocketContainer;

public class Client {

    private static Object waitLock = new Object();

    public static void main(String[] args) {
        URI uri;
        try {
            uri = new URI("ws://localhost:8080/filetransfer");
        } catch (URISyntaxException e) {
            e.printStackTrace();
            return;
        }

        WebSocketContainer container = ContainerProvider.getWebSocketContainer();

        try {
            Session session = container.connectToServer(MyClientEndpoint.class, uri);
            synchronized(waitLock) {
                waitLock.wait();
            }
        } catch (DeploymentException | InterruptedException e) {
            e.printStackTrace();
        } finally {
            container.getDefaultSessionMaxIdleTimeout();
        }
    }

    public static class MyClientEndpoint extends Endpoint {

        @Override
        public void onOpen(Session session, EndpointConfig config) {
            session.addMessageHandler(new MessageHandler.Whole<String>() {

                @Override
                public void onMessage(String message) {
                    System.out.println(message);
                }
            });

            try {
                ByteBuffer buffer = ByteBuffer.wrap("Hello World".getBytes());
                session.getBasicRemote().sendBinary(buffer);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
登入後複製
  1. 在上面的程式碼片段中,我們建立了一個 WebSocket 用戶端,連接到服務端的 ws://localhost:8080/filetransfer# URL 中。
  2. 啟動客戶端,客戶端將向服務端發送 "Hello World" 字串,並接收服務端的回應。

總結

至此,本文介紹了在Java 中使用WebSocket 進行即時檔案傳輸的方法,從WebSocket 協定、Java WebSocket API 的使用、WebSocket 服務端和客戶端的實現幾個方面詳細介紹了實現即時文件傳輸的具體步驟。使用WebSocket 可以實現高效、可靠的即時檔案傳輸,是現代應用程式中必不可少的一部分。

以上是如何在Java中使用WebSocket進行即時檔案傳輸的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板