現代のインターネット アプリケーションでは、リアルタイムのファイル転送が不可欠な部分です。リアルタイム送信にはさまざまな方法がありますが、WebSocket が最も一般的に使用されます。 Java の WebSocket API を使用すると、リアルタイム ファイル転送機能を簡単かつ簡単に実装できます。この記事では、Java でリアルタイム ファイル転送に WebSocket を使用する方法を、いくつかの具体的なコード例を示しながら説明します。
WebSocket の概要
WebSocket は HTML5 標準の一部であり、TCP に基づくネットワーク プロトコルです。このプロトコルは、単一の TCP 接続を介した双方向通信のネットワーク機能を提供し、リアルタイム送信を可能にします。これは、ステートレス プロトコルであり、リクエストごとに新しい接続を確立する必要がある従来の HTTP プロトコルとは異なります。
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 サーバー
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"); } }
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(); } } }
Server
クラスを通じて WebSocket サーバーを作成しました。このサーバーは、ローカル マシンの 8080 ポートをリッスンしてクライアントに接続します。リクエストは処理のために FileTransferEndpoint
クラスに転送されます。 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(); } } } }
ws://localhost:8080/filetransfer
URL に接続します。 概要
これまで、この記事では、WebSocket プロトコル、Java WebSocket API の使用、および Java でリアルタイム ファイル転送に WebSocket を使用する方法を紹介してきました。 WebSocket サーバーとクライアントの実装 いくつかの側面で、リアルタイムのファイル転送を実現するための具体的な手順が詳しく説明されています。 WebSocket を使用すると、効率的で信頼性の高いリアルタイム ファイル転送が可能になり、最新のアプリケーションには不可欠な部分です。
以上がJava で WebSocket を使用してリアルタイム ファイル転送を行う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。