현대 인터넷 애플리케이션에서 실시간 파일 전송은 필수적인 부분입니다. 실시간 전송 방법에는 여러 가지가 있는데, 가장 일반적으로 사용되는 방법은 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는 크게 두 가지 범주로 나뉘는데, 하나는 WebSocket 연결 자체에 관련된 API이고, 다른 하나는 메시지 처리에 관련된 API입니다.
WebSocket 연결 관련 API
Endpoint: 클라이언트 연결 요청 및 연결 해제 요청을 받을 수 있는 WebSocket 엔드포인트를 나타냅니다.
Session: 텍스트 및 바이너리 메시지를 보내고 받는 데 사용되는 WebSocket 연결 세션을 나타냅니다.
MessageHandler: Text와 Binary의 두 가지 구현 클래스가 있는 WebSocket 메시지 처리 인터페이스. 사용자는 이 인터페이스를 구독하여 메시지를 듣고 처리할 수 있습니다.
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
로 전달합니다. 처리를 위한 클래스입니다. 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
먼저 WebSocket 클라이언트를 생성하고 서버에 연결해야 합니다.
rrreee
🎜위 코드 조각에서는 WebSocket 클라이언트를 생성하고 서버의ws://localhost:8080/filetransfer
URL에 연결합니다. 🎜🎜클라이언트를 시작하면 클라이언트는 "Hello World" 문자열을 서버에 보내고 서버로부터 응답을 받습니다. 🎜🎜🎜요약🎜🎜이 글에서는 지금까지 Java에서 실시간 파일 전송을 위해 WebSocket을 사용하는 방법을 소개했습니다. 실시간 파일 전송의 구현을 WebSocket 프로토콜 측면에서, Java를 사용하여 자세히 소개했습니다. WebSocket API 및 WebSocket 서버 및 클라이언트의 특정 단계 구현. WebSocket을 사용하면 효율적이고 안정적인 실시간 파일 전송이 가능하며 이는 현대 애플리케이션의 필수적인 부분입니다. 🎜위 내용은 Java에서 실시간 파일 전송을 위해 WebSocket을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!