>  기사  >  Java  >  Java에서 실시간 파일 전송을 위해 WebSocket을 사용하는 방법

Java에서 실시간 파일 전송을 위해 WebSocket을 사용하는 방법

王林
王林원래의
2023-12-17 21:59:06922검색

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는 크게 두 가지 범주로 나뉘는데, 하나는 WebSocket 연결 자체에 관련된 API이고, 다른 하나는 메시지 처리에 관련된 API입니다.

WebSocket 연결 관련 API

Endpoint: 클라이언트 연결 요청 및 연결 해제 요청을 받을 수 있는 WebSocket 엔드포인트를 나타냅니다.

Session: 텍스트 및 바이너리 메시지를 보내고 받는 데 사용되는 WebSocket 연결 세션을 나타냅니다.

MessageHandler: Text와 Binary의 두 가지 구현 클래스가 있는 WebSocket 메시지 처리 인터페이스. 사용자는 이 인터페이스를 구독하여 메시지를 듣고 처리할 수 있습니다.

WebSocket 메시지 처리 관련 API

OnMessage: WebSocket 클라이언트가 보낸 메시지 처리 방법을 주석을 통해 구현할 수 있습니다.

RemoteEndpoint: 메시지를 보내는 데 사용됩니다.

WebSocket 사용

실제 개발에서는 일반적으로 WebSocket 서버와 WebSocket 클라이언트가 필요합니다. 아래에서는 WebSocket을 사용하여 파일 전송 기능을 구현하는 방법을 소개합니다.

WebSocket 서버

  1. 먼저 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");
    }
}
  1. 위 코드 조각에서는 각각 ByteBuffer, String 및 PongMessage 유형의 데이터를 처리하기 위해 세 가지 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 로 전달합니다. 처리를 위한 클래스입니다. 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
  2. WebSocket Client

먼저 WebSocket 클라이언트를 생성하고 서버에 연결해야 합니다.

rrreee

🎜위 코드 조각에서는 WebSocket 클라이언트를 생성하고 서버의 ws://localhost:8080/filetransfer URL에 연결합니다. 🎜🎜클라이언트를 시작하면 클라이언트는 "Hello World" 문자열을 서버에 보내고 서버로부터 응답을 받습니다. 🎜🎜🎜요약🎜🎜이 글에서는 지금까지 Java에서 실시간 파일 전송을 위해 WebSocket을 사용하는 방법을 소개했습니다. 실시간 파일 전송의 구현을 WebSocket 프로토콜 측면에서, Java를 사용하여 자세히 소개했습니다. WebSocket API 및 WebSocket 서버 및 클라이언트의 특정 단계 구현. WebSocket을 사용하면 효율적이고 안정적인 실시간 파일 전송이 가능하며 이는 현대 애플리케이션의 필수적인 부분입니다. 🎜

위 내용은 Java에서 실시간 파일 전송을 위해 WebSocket을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.