Java で WebSocket を使用してリアルタイム ファイル転送を行う方法

王林
リリース: 2023-12-17 21:59:06
オリジナル
921 人が閲覧しました

Java で WebSocket を使用してリアルタイム ファイル転送を行う方法

現代のインターネット アプリケーションでは、リアルタイムのファイル転送が不可欠な部分です。リアルタイム送信にはさまざまな方法がありますが、WebSocket が最も一般的に使用されます。 Java の WebSocket API を使用すると、リアルタイム ファイル転送機能を簡単かつ簡単に実装できます。この記事では、Java でリアルタイム ファイル転送に WebSocket を使用する方法を、いくつかの具体的なコード例を示しながら説明します。

WebSocket の概要

WebSocket は HTML5 標準の一部であり、TCP に基づくネットワーク プロトコルです。このプロトコルは、単一の TCP 接続を介した双方向通信のネットワーク機能を提供し、リアルタイム送信を可能にします。これは、ステートレス プロトコルであり、リクエストごとに新しい接続を確立する必要がある従来の HTTP プロトコルとは異なります。

WebSocket プロトコルの主な機能は次のとおりです。

  1. リアルタイム: WebSocket は長時間の接続を維持し、リアルタイム送信を実現し、あらゆる種類のデータを転送できます。サーバーとクライアントの間。
  2. 双方向通信: WebSocket は双方向通信をサポートしており、サーバーはクライアントのリクエストを待つ代わりに、メッセージをクライアントにアクティブにプッシュできます。
  3. 複数のデータ形式のサポート: WebSocket は、テキスト、バイナリなどの複数のタイプのデータを送信でき、さまざまなタイプのアプリケーションのニーズを満たすことができます。

Java WebSocket API の使用法

Java8 では、Java の WebSocket 標準 API である JSR-356 が導入されました。 Java WebSocket API の主要なクラスは javax.websocket パッケージにあり、その API は主に 2 つのカテゴリに分けられ、1 つは WebSocket 接続自体に関連する API、もう 1 つはメッセージ処理に関連する API です。

WebSocket 接続関連 API

エンドポイント: クライアントの接続要求および接続切断要求を受信できる WebSocket エンドポイントを表します。

Session: テキストおよびバイナリ メッセージの送受信に使用される WebSocket 接続セッションを表します。

MessageHandler: WebSocket メッセージ処理インターフェイス。Text と Binary の 2 つの実装クラスがあります。ユーザーは、このインターフェイスをサブスクライブすることで、メッセージを聞いて処理できます。

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. 上記のコード スニペットでは、ByteBuffer、String、PongMessage タイプのデータをそれぞれ処理する 3 つの onMessage メソッドを実装しました。
  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」文字列をサーバーに送信し、サーバーからの応答を受け取ります。

概要

これまで、この記事では、WebSocket プロトコル、Java WebSocket API の使用、および Java でリアルタイム ファイル転送に WebSocket を使用する方法を紹介してきました。 WebSocket サーバーとクライアントの実装 いくつかの側面で、リアルタイムのファイル転送を実現するための具体的な手順が詳しく説明されています。 WebSocket を使用すると、効率的で信頼性の高いリアルタイム ファイル転送が可能になり、最新のアプリケーションには不可欠な部分です。

以上がJava で WebSocket を使用してリアルタイム ファイル転送を行う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート