在現代的網路應用中,即時檔案傳輸是不可或缺的一部分。而即時傳輸有很多種方法,WebSocket 是其中最常使用的一種。 Java 中的 WebSocket API 可讓您簡單輕鬆地實現即時文件傳輸的功能。本文將為您介紹如何在 Java 中使用 WebSocket 進行即時檔案傳輸,同時提供一些具體的程式碼範例。
WebSocket 簡介
WebSocket 是 HTML5 標準的一部分,是基於 TCP 的網路協定。這種協定提供了一種透過單一 TCP 連線進行雙向通訊的網路功能,這樣就可以實現即時傳輸。這與傳統的 HTTP 協定不同,HTTP 是一種無狀態的協議,每次請求都需要建立新的連線。
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 服務端
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 中。 總結
至此,本文介紹了在Java 中使用WebSocket 進行即時檔案傳輸的方法,從WebSocket 協定、Java WebSocket API 的使用、WebSocket 服務端和客戶端的實現幾個方面詳細介紹了實現即時文件傳輸的具體步驟。使用WebSocket 可以實現高效、可靠的即時檔案傳輸,是現代應用程式中必不可少的一部分。
以上是如何在Java中使用WebSocket進行即時檔案傳輸的詳細內容。更多資訊請關注PHP中文網其他相關文章!