Подробное объяснение объемом 10 000 слов, которое поможет вам полностью освоить использование WebSocket (высшее коллекционное издание).
Подробное объяснение объемом 10 000 слов, которое поможет вам полностью освоить использование WebSocket (высшее коллекционное издание).

1. Введение

1.1 Что такое вебсокет

WebSocket — это протокол, используемый для установления двустороннего соединения в реальном времени между веб-приложением и сервером.

Он обеспечивает постоянные соединения через одно TCP-соединение, что позволяет веб-приложениям доставлять данные в более реальном времени.

Протокол WebSocket был первоначально разработан W3C и стал стандартом в 2011 году.

1.2 Преимущества и недостатки WebSocket

К преимуществам WebSocket относятся:

  • В реальном времени: Благодаря постоянному соединению WebSocket он может осуществлять передачу данных в реальном времени, избегая ситуации, когда веб-приложению необходимо постоянно отправлять запросы для получения последних данных.
  • Двусторонняя связь: Протокол WebSocket поддерживает двустороннюю связь, что означает, что сервер может активно отправлять данные клиенту без отправки клиентом запроса.
  • Уменьшите нагрузку на сеть: Благодаря постоянным соединениям WebSocket он может уменьшить количество HTTP-запросов, тем самым снижая нагрузку на сеть.

К недостаткам WebSocket относятся:

  • И браузер, и сервер должны поддерживать: WebSocket — относительно новая технология, требующая поддержки как браузера, так и сервера. Некоторые старые браузеры и серверы могут не поддерживать WebSocket.
  • Требуются дополнительные накладные расходы: WebSocketДолжен поддерживаться на сервере в течение длительного времени.изсоединять,Это требует дополнительных накладных расходов,Включая память и процессор.
  • Контрольный вопрос: Поскольку WebSocket позволяет серверу заранее отправлять данные клиенту, могут возникнуть проблемы с безопасностью. Сервер должен гарантировать, что он отправляет данные только законным клиентам.

2. Основные понятия WebSocket

2.1 Протокол веб-сокета

Протокол WebSocket — это протокол на основе TCP, используемый для установления постоянного соединения между клиентом и сервером и позволяющий обмениваться данными по этому соединению в режиме реального времени. Протокол WebSocket имеет собственный протокол установления соединения и собственный формат передачи данных.

Когда клиент отправляет запрос WebSocket, сервер отправляет ответ протокола для подтверждения запроса. Во время рукопожатия клиент и сервер согласовывают используемую версию протокола, поддерживаемые подпротоколы, поддерживаемые параметры расширения и т. д. После завершения рукопожатия соединение остается открытым, и клиент и сервер могут передавать данные по соединению в режиме реального времени.

Протокол WebSocket использует двустороннюю передачу данных, то есть и клиент, и сервер могут отправлять данные друг другу в любое время, не дожидаясь запроса другой стороны. Он поддерживает двоичные и текстовые данные и может свободно конвертировать их.

Короче говоря, протокол WebSocket — это надежный, эффективный, двусторонний и долговечный протокол связи. Он подходит для веб-приложений, требующих связи в реальном времени, таких как онлайн-игры, чат в реальном времени и т. д.

2.2 Жизненный цикл WebSocket

Жизненный цикл WebSocket описывает процесс соединения WebSocket от создания до закрытия. Соединение WebSocket состоит из следующих четырех основных этапов:

  • Установление соединения: На этом этапе отношения между клиентом и сервером WebSocket Соединение установлено. Клиент отправляет WebSocket Запрос на рукопожатие, сервер отвечает ответом на рукопожатие, и соединение устанавливается.
  • Соединение Открытая фаза: На этом этапе WebSocket Соединение установлено и открыто, и клиент и сервер могут отправлять данные друг другу по соединению.
  • Закрытие соединения: На этом этапе WebSocket Соединение скоро будет закрыто. Он может быть инициирован клиентом или сервером путем отправки кадра закрытия для закрытия соединения.
  • Соединение закрыто: На этом этапе WebSocket Соединение полностью закрыто. Любое взаимодействие между клиентом и сервером будет недействительным.

«Следует отметить, что соединение WebSocket может быть закрыто в любой момент. Например, сбой сети, сбой сервера и т. д. может привести к закрытию соединения. Поэтому необходимо обрабатывать событие закрытия соединения WebSocket в своевременно для обеспечения надежности и стабильности приложения.

Ниже приведена простая диаграмма жизненного цикла WebSocket:

На этой схеме клиент отправляет серверу запрос на подтверждение связи WebSocket, сервер отвечает ответом на подтверждение установления соединения, и соединение устанавливается.

Как только соединение установлено, клиент и сервер могут отправлять данные друг другу по соединению до тех пор, пока одна из сторон не отправит кадр закрытия для закрытия соединения.

После получения кадра закрытия соединение закрывается, а соединение WebSocket закрывается.

2.3 Формат сообщения WebSocket

Формат сообщения WebSocket отличается от формата HTTP-запросов и ответов.

Формат сообщения WebSocket может представлять собой текстовые или двоичные данные, а передача сообщений WebSocket выполняется по уже установленному соединению, поэтому нет необходимости выполнять операцию установления связи HTTP-запроса и ответа.

Формат сообщения WebSocket состоит из двух частей: заголовка и тела сообщения.

Заголовок сообщения содержит следующую информацию:

  • FIN: Указывает, что это полное сообщение, обычно 1.
  • RSV1、RSV2、RSV3: В данный момент не используется, обычно 0.
  • Opcode: Указывает тип сообщения, включая текстовое сообщение, двоичное сообщение и т. д.
  • Mask: Указывает, зашифровано ли сообщение.
  • Payload length: Указывает длину тела сообщения.
  • Masking key: Появляется только тогда, когда сообщение необходимо зашифровать, и используется для расшифровки сообщения.

Тело сообщения — это фактически передаваемые данные, которые могут быть текстовыми или двоичными.

2.4 API веб-сокетов

API WebSocket — это набор интерфейсов для создания соединений WebSocket и управления ими в веб-приложениях. API WebSocket изначально поддерживается браузером и может использоваться непосредственно в JavaScript без использования дополнительных библиотек или платформ JavaScript.

Вот некоторые часто используемые API WebSocket:

WebSocket Конструктор: WebSocket Конструктор используется для создания WebSocket объект. он принимает URL В качестве параметра он представляет WebSocket Адрес сервера. Например:

Язык кода:javascript
копировать
let ws = new WebSocket('ws://example.com/ws');

WebSocket.send() метод: WebSocket.send() Метод используется для отправки данных на сервер. Он принимает параметр, представляющий данные для отправки. Данные могут быть строковыми или Blob. объект или ArrayBuffer объект. Например:

Язык кода:javascript
копировать
ws.send('Hello, server!');

WebSocket.onopen событие: WebSocket.onopen событие в WebSocket Срабатывает, когда соединение успешно установлено. Например:

Язык кода:javascript
копировать
ws.onopen = function() {
  console.log('WebSocket Соединение установлено. ');
};

WebSocket.onmessage событие: WebSocket.onmessage событие в Срабатывает при получении сообщения, отправленного сервером. это из event Объект содержит data Свойства, представляющие полученные данные. Например:

Язык кода:javascript
копировать
ws.onmessage = function(event) {
  console.log('Получено сообщение сервера:', event.data);
};

WebSocket.onerror событие: WebSocket.onerror событие в WebSocket Запускается при возникновении ошибки соединения. Например:

Язык кода:javascript
копировать
ws.onerror = function(event) {
  console.error('WebSocket Ошибка подключения: ', event);
};

WebSocket.onclose событие: WebSocket.onclose событие в WebSocket Вызывается при закрытии соединения. Например:

Язык кода:javascript
копировать
ws.onclose = function() {
  console.log('WebSocket Соединение закрыто. ');
};

Выше приведены некоторые часто используемые API WebSocket.

3. Использование WebSocket в Java

полагаться:

Язык кода:javascript
копировать
<dependency>
    <groupId>javax.websocket</groupId>
    <artifactId>javax.websocket-api</artifactId>
    <version>1.1</version>
</dependency>

3.1 Использование Java WebSocket API для написания сервера WebSocket

Ниже приведен пример кода для написания сервера WebSocket с использованием API Java WebSocket:

Язык кода:javascript
копировать
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
 
@ServerEndpoint("/echo")
public class EchoServer {
 
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("WebSocket Соединение установлено. ");
    }
 
    @OnMessage
    public void onMessage(String message, Session session) throws IOException {
        System.out.println("Получено клиентское сообщение:" + message);
        session.getBasicRemote().sendText("Сервер получил сообщение:" + message);
    }
 
    @OnClose
    public void onClose() {
        System.out.println("WebSocket Соединение закрыто. ");
    }
 
    @OnError
    public void onError(Throwable t) {
        System.out.println("WebSocket Ошибка подключения: " + t.getMessage());
    }
}

В этом примере кода определяется конечная точка WebSocket с именем «echo», которая прослушивает сообщения от клиента и возвращает полученные сообщения клиенту.

В частности, он использует @ServerEndpoint аннотация для указания WebSocket конечная точка URL, использованный @OnOpen@OnMessage@OnClose и @OnError аннотация для определения WebSocket обработчик событий.

Чтобы использовать этот сервер WebSocket, нам необходимо развернуть его в веб-контейнере, поддерживающем WebSocket.

Например, мы можем использовать Tomcat 8 или выше для его запуска. После завершения развертывания мы можем использовать любой клиент, поддерживающий WebSocket, для подключения к этому серверу, отправки сообщений и получения ответов от сервера.

Например, вот простой клиентский код HTML/JavaScript:

Язык кода:javascript
копировать
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>WebSocket Demo</title>
    <script>
        var ws = new WebSocket('ws://localhost:8080/echo');
        ws.onopen = function() {
            console.log('WebSocket Соединение установлено. ');
            ws.send('Hello, server!');
        };
        ws.onmessage = function(event) {
            console.log('Получено сообщение сервера:', event.data);
        };
        ws.onerror = function(event) {
            console.error('WebSocket Ошибка подключения: ', event);
        };
        ws.onclose = function() {
            console.log('WebSocket Соединение закрыто. ');
        };
    </script>
</head>
<body>
    <h1>WebSocket Demo</h1>
</body>
</html>

Этот клиент использует конструктор WebSocket для создания объекта WebSocket и указывает URL-адрес подключения как URL-адрес сервера, который мы развернули ранее.

Он использует обработчик событий WebSocket для обработки событий WebSocket. Например, когда соединение WebSocket успешно установлено, он отправит сообщение на сервер и распечатает содержимое сообщения при получении ответа от сервера.

3.2 Написание клиента WebSocket с использованием Java WebSocket API

Вот пример кода для написания клиента WebSocket с использованием API Java WebSocket:

Язык кода:javascript
копировать
import javax.websocket.*;
import java.io.IOException;
import java.net.URI;
 
@ClientEndpoint
public class EchoClient {
 
    private Session session;
 
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("WebSocket Соединение установлено. ");
        this.session = session;
    }
 
    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("Получено сообщение сервера:" + message);
    }
 
    @OnClose
    public void onClose() {
        System.out.println("WebSocket Соединение закрыто. ");
    }
 
    @OnError
    public void onError(Throwable t) {
        System.out.println("WebSocket Ошибка подключения: " + t.getMessage());
    }
 
    public void connect(String url) throws Exception {
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        container.connectToServer(this, new URI(url));
    }
 
    public void send(String message) throws IOException {
        session.getBasicRemote().sendText(message);
    }
 
    public void close() throws IOException {
        session.close();
    }
}

3.3. Использование Spring Boot для написания сервера WebSocket.

Создать проект Spring Boot

первый,Вам необходимо создать новыйизSpring Bootпроект。Может Использование Spring Initializr создает новый проект, добавляя зависимости.

Язык кода:javascript
копировать
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
Настройка веб-сокета

Требуется приложение, настройка веб-сокета.

Создайте новый класс Java.,и добавляйте комментарии@ServerEndpoint("/websocket")。Это укажетWebSocketСерверизконечная точка。

На этом занятии необходимо реализовать несколько задач:

Язык кода:javascript
копировать
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
 
@ServerEndpoint("/websocket")
public class WebSocketServer {
 
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("Connection opened: " + session.getId());
        sessions.add(session);
    }
 
    @OnMessage
    public void onMessage(Session session, String message) throws IOException {
        System.out.println("Received message: " + message);
        session.getBasicRemote().sendText("Server received: " + message);
    }
 
    @OnClose
    public void onClose(Session session) {
        System.out.println("Connection closed: " + session.getId());
        sessions.remove(session);
    }
 
    private static final Set<Session> sessions = Collections.synchronizedSet(new HashSet<Session>());
}
Обработка сообщений WebSocket

существовать@OnMessageв методе,Может обрабатывать отправку сообщений клиентами WebSocket.,и отправить ответ клиенту. Ниже приведен простой пример кода:

Язык кода:javascript
копировать
@OnMessage
public void onMessage(Session session, String message) throws IOException {
    System.out.println("Received message: " + message);
    session.getBasicRemote().sendText("Server received: " + message);
}

В этом коде мы просто распечатываем полученное сообщение и отправляем ответ клиенту.

Закрыть соединение WebSocket

существовать@OnCloseв методе,Вы можете удалить соединение и выполнить некоторую очистку. Вот пример кода:

Язык кода:javascript
копировать
@OnClose
public void onClose(Session session) {
    System.out.println("Connection closed: " + session.getId());
    sessions.remove(session);
}

В этом коде мы удаляем соединение из пула соединений и распечатываем сообщение о закрытии соединения.

Настройка веб-сокетаподдерживать

Наконец, вам нужно настроить Spring BootкподдерживатьWebSocket。Создайте новый класс Java.,и добавляйте комментарии@Configurationи@EnableWebSocket。Затем,Необходимо переопределить методregisterWebSocketHandlers(),и укажите обработчик WebSocket. Вот пример кода:

Язык кода:javascript
копировать
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
 
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new WebSocketServer(), "/websocket").setAllowedOrigins("*");
    }
}

в этом коде,Мы создали новыйизWebSocketServerобъект,и добавьте его вWebSocketОбработка。Мы также уточнилиWebSocketконечная точка(/websocket)ипозволятьизисточник(*)。

4. Формат сообщения WebSocket.

4.1 Текстовые сообщения и двоичные сообщения

Текстовые сообщения представляют собой простые текстовые строки в формате Unicode. Когда соединение WebSocket установлено,клиентисервер Можетотправив текстинформацияобмениваться информацией друг с другом。сервер МожетиспользоватьSessionобъектизgetBasicRemote()Метод отправки текстового сообщения клиенту,клиент МожетиспользоватьWebSocketизsend()Метод отправки текстового сообщения на сервер。

Вот пример кода для отправки текстового сообщения клиенту:

Язык кода:javascript
копировать
session.getBasicRemote().sendText("Hello, client!");

Двоичные сообщения могут представлять собой данные любого типа.,Включая изображения, аудио, видео и т. д. Чтобы отправить двоичное сообщение клиенту,сервер МожетиспользоватьSessionобъектизgetBasicRemote()метод,Отправьте сообщение как объект ByteBuffer. Клиент может отправлять двоичные сообщения на сервер с помощью метода send() WebSocket.

Вот пример кода для отправки двоичного сообщения клиенту:

Язык кода:javascript
копировать
byte[] data = // binary data
ByteBuffer buffer = ByteBuffer.wrap(data);
session.getBasicRemote().sendBinary(buffer);

пожалуйста, обрати внимание,Хотя текстовые сообщения и двоичные сообщения различаются по формату,Но все они отправляют сообщения разных типов через WebSocket.,Следовательно, и клиент, и сервер должны иметь возможность обрабатывать оба типа сообщений.

4.2 Сообщения пинг-понг

WebSocket также поддерживает тип сообщения PingиPong, который используется для определения того, активно ли соединение WebSocket.

Сообщения Ping отправляются клиентом на сервер, а сообщения Pong отправляются обратно клиенту сервером в ответ.

Если клиент не получает сообщение Pong в течение определенного периода времени, он может предположить, что соединение WebSocket разорвано, и закрыть соединение.

Чтобы отправить сообщение Ping,пожалуйстаиспользоватьSessionобъектизgetBasicRemote()метод,И отправьте сообщение Ping как объект ByteBuffer.

клиент МожетиспользоватьWebSocketизsendPing()метод来向сервер发送Pingинформация。

Вот пример кода для отправки сообщения Ping клиенту:

Язык кода:javascript
копировать
ByteBuffer pingMessage = ByteBuffer.wrap(new byte[] { 8, 9, 10 });
session.getBasicRemote().sendPing(pingMessage);

Чтобы получать сообщения Pong,пожалуйстасуществоватьтыизWebSocketОбработкавыполнитьonPong()метод。

Когда ваш сервер WebSocket получает сообщение Pong, он автоматически вызывает этот метод и передает ему полученное сообщение Pong как объект ByteBuffer.

Ниже приведен пример кода, реализующего метод onPong():

Язык кода:javascript
копировать
@OnMessage
public void onPong(Session session, ByteBuffer pongMessage) {
    System.out.println("Received Pong message: " + pongMessage);
}

пожалуйста, обрати внимание,Сообщения PingиPong обычно используются для проверки работоспособности соединения WebSocket.

Если вы хотите использовать эту функцию с соединением WebSocket, вам следует периодически отправлять сообщения Ping и ждать ответа от сообщений Pong.

4.3 Закрыть сообщение

WebSocketвозвращатьсяподдерживать Закрыть сообщениетип,используется для Закрыть соединение WebSocket。

Закрыть Сообщение может быть инициировано клиентом или сервером и может содержать необязательный код состояния и причину закрытия. Когда соединение WebSocket закрывается, и клиент, и сервер должны отправить сообщение Закрыть. сообщение, чтобы завершить соединение.

отправить Закрыть сообщение,пожалуйстаиспользоватьSessionобъектизgetBasicRemote()метод,и назови этоизsendClose()метод。

Закрыть сообщение может содержать необязательный код статуса и причину закрытия. Если вы не хотите, чтобы код состояния или причина завершения работы отправлялись, вы можете установить для них значение 0–null.

Вот пример кода для отправки клиенту сообщения о завершении работы:

Язык кода:javascript
копировать
session.close(new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE, "Closing from client."));

Обработать полученное из Закрыть сообщение,пожалуйстасуществоватьтыизWebSocketОбработкавыполнитьonClose()метод。

Когда ваш сервер изWebSocket получит Закрыть сообщениечас,Он автоматически вызовет этот метод,И передайте ему полученный код статуса и причину закрытия.

Вот реализацияonClose()методиз Пример кода:

Язык кода:javascript
копировать
@OnClose
public void onClose(Session session, CloseReason closeReason) {
    System.out.println("Connection closed: " + closeReason.getCloseCode() + " - " + closeReason.getReasonPhrase());
}

пожалуйста, обрати внимание,клиенти Сервер должен отправить Закрыть сообщение, чтобы завершить соединение WebSocket.

Если только одна сторона отправляет сообщение о закрытии, другая сторона может не закрыть соединение должным образом, и ей, возможно, придется дождаться тайм-аута, прежде чем ресурсы будут освобождены.

Рекомендуется, чтобы и клиент, и сервер отправляли Закрыть сообщение при закрытии соединения, чтобы убедиться, что соединение закрыто правильно.

5. Производительность WebSocket

5.1 Сравнение с традиционной моделью HTTP-запрос/ответ

  • Улучшенная производительность двусторонней связи: WebSocketпротоколиспользоватьодинокийизTCPсоединять,Позволяет клиенту и серверу обмениваться данными в двух направлениях по одному и тому же соединению. Эта двусторонняя связь в режиме реального времени передает данные быстрее.,Без необходимости устанавливать несколько соединений HTTP-запросов/ответов.
  • Меньший сетевой трафик: По сравнению с HTTP, протокол WebSocket требует меньше сетевого трафика для поддержания соединения, поскольку он не требует отправки информации заголовка при каждом обмене запросами/ответами.
  • Меньшая задержка: Протокол WebSocket позволяет серверу активно отправлять сообщения клиенту, не требуя от клиента предварительной отправки запроса. Такая связь в реальном времени уменьшает задержку ответа и повышает производительность приложений.
  • Лучшее управление ресурсами сервера: потому чтоWebSocketсоединять Можетоставаться активным,Серверы могут лучше управлять клиентскими соединениями,Уменьшите нагрузку на сервер и время обработки.

Протокол WebSocket работает лучше, чем традиционная модель HTTP-запроса/ответа.,Особенно с точки зрения связи в реальном времени и низкой задержки. Протокол WebSocket подходит для приложений, которым требуется связь в реальном времени и обновление данных в реальном времени.,нравитьсясуществоватьонлайн-чат、Мультиплеер、Мониторинг в реальном времени и т. д.

5.2 Оптимизация производительности WebSocket

  • Уменьшите размер сообщения: WebSocket передача инфекциииз Размер данных оказывает большое влияние на производительность。постарайтесь свести к минимумуинформацияизразмер,Может снизить пропускную способность сети и нагрузку на сервер. Например,Можно использовать протокол двоичной передачи вместо текстовой передачи.,Или используйте алгоритм сжатия для сжатия сообщения.
  • Используйте CDN для ускорения: использовать CDN (сеть распространения контента) может кэшировать статические ресурсы на узлах, находящихся ближе к пользователям, для повышения скорости и производительности передачи. CDN Можно кэшировать Websocket изпервоначальное рукопожатиепожалуйстапросить,избегать ненужныхиззадержка сети
  • Используйте балансировку нагрузки: WebSocket Службы могут использовать балансировку нагрузки для распределения и балансировки нагрузки между несколькими серверами. Балансировка нагрузки предотвращает перегрузку отдельных серверов и улучшает общую масштабируемость сервиса.
  • Оптимизируйте серверный код: WebSocket Производительность серверного кода также является ключевым фактором. Эффективность структуры и алгоритма, позволяющая избежать чрезмерного использования памяти. CPU Ресурсы могут улучшить производительность сервера и скорость ответа.
  • Избегайте перегрузки сети: WebSocket На производительность также влияет перегрузка сети. Производительность сервера снижается, когда слишком много соединений запрашивают данные одновременно. использовать подходящий из пула потоков и асинхронный IO операция может избежать перегрузки сети и улучшить WebSocket Параллельная работа службы.

6. Расширенные приложения и будущие направления развития WebSocket.

  • Более полные стандарты и спецификации: WebSocket В стандартах и ​​спецификациях еще есть много областей для оптимизации, и они могут продолжать совершенствоваться в будущем. WebSocket стандарты для адаптации к более сложным сценариям применения.
  • Более безопасный способ общения: потому что WebSocket из Открытость,что делает его потенциально подверженным некоторым угрозам безопасности,В будущем шифрование может быть、Аутентификацияулучшить WebSocket безопасность.
  • Лучшая совместимость: WebSocket Соглашение должно быть в HTTP Соединение устанавливается на основе протокола, поэтому могут возникнуть проблемы совместимости, которые в будущем могут быть решены техническими средствами.
  • Лучше по производительности и масштабируемости: WebSocket Производительность и масштабируемость протокола очень важны для сложных сценариев приложений и в будущем могут быть улучшены с помощью технических средств. WebSocket из Производительность и Масштабируемость.

И последнее слово (обратите внимание! Не занимайтесь блудством зря!)

Если эта статья оказалась для вас полезной или вдохновляющей, нажмите три раза: «Мне нравится», «Переслать» и «Читать».

сосредоточиться на Официальный аккаунт:woniuxgg,существовать Официальный аккаунт Ответить в:примечания  Вы можете получить практические заметки по Java, тщательно подготовленные для вас компанией Snail, ответить на интервью, получить руководства по разработке и получить потрясающие преимущества для поклонников!

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.