Узнайте, почему компании из списка Fortune 500 выбирают нас в качестве партнера по разработке программного обеспечения. Исследуйте наш портфель. Проверено более 2500 проектов. Есть идея проекта, чтобы поделиться с нами? Давай поговорим.
Узнайте, почему компании из списка Fortune 500 выбирают нас в качестве партнера по разработке программного обеспечения. Исследуйте наш портфель. Проверено более 2500 проектов. Есть идея проекта, чтобы поделиться с нами? Давай поговорим.
websockets golang

Шаги, чтобы следовать, чтобы использовать WebSockets в Golang

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

После долгого опроса HTTP и AJAP сообщество разработчиков в конечном итоге обнаружило решение для разработки приложений в реальном времени.

WebSockets стали решением этой проблемы и позволили создать интерактивную сессию между сервером и браузером пользователя. WebSockets позволяют браузеру отправлять сообщения на сервер и получать ответы, основанные на событиях. И нет необходимости опрашивать сервер для ответа.

В настоящее время WebSockets являются первоклассным решением для разработки приложений в реальном времени: приложения для отслеживания, мессенджеры, онлайн-игры и многое другое.

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

Что такое WebSockets?

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

Лучший аспект WebSockets заключается в том, что они используют одно соединение TCP, и все соединение построено по этому единственному прочному соединению TCP.

Это значительно снижает накладные расходы на разработку приложений в реальном времени с использованием WebSockets, поскольку нет необходимости в постоянном опросе конечных точек HTTP.

Как создать приложение WebSocket в Golang?

Вот несколько важных шагов, которые вы должны выполнить, чтобы написать простой эхо-сервер WebSocket в зависимости от библиотеки Net / HTTP:

Шаг 1: Настройка рукопожатия

Сначала вам нужно сформировать HTTP-обработчик с помощью конечной точки WebSocket:

// HTTP server with WebSocket endpoint
        func Server() {
        http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
            ws, err := NewHandler(w, r)
            if err != nil {
                 // handle error
            }
            if err = ws.Handshake(); err != nil {
                // handle error
            }
        …

Далее, запустите структуру WebSocket.

Клиент всегда отправляет первый запрос на рукопожатие.Когда сервер аутентифицировал запрос WebSocket, он должен ответить ответом на рукопожатие.

Помните, что вы не можете написать этот ответ с помощью http.ResponsWriterЭто означает, что вы отключите базовое соединение TCP, если начнете отправлять ответ.

Следовательно, вы должны использовать HTTP Hijacking, который позволяет поддерживать базовый обработчик TCP-соединения и bufio.Writer. Это обеспечивает вам объем данных для чтения и записи, не предотвращая соединение TCP.

// NewHandler initializes a new handler
         func NewHandler(w http.ResponseWriter, req http.Request) (WS, error) {
         hj, ok := w.(http.Hijacker)
         if !ok {
             // handle error
         }                  …..
 }

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

// Handshake creates a handshake header
    func (ws *WS) Handshake() error {
        
        hash := func(key string) string {
            h := sha1.New()
            h.Write([]byte(key))
            h.Write([]byte("258EAFA5-E914-47DA-95CA-C5AB0DC85B11"))

        return base64.StdEncoding.EncodeToString(h.Sum(nil))
        }(ws.header.Get("Sec-WebSocket-Key"))
      .....
}

"Sec-WebSocket-key" создается случайным образом и кодируется Base64. После принятия запроса сервер должен добавить этот ключ в фиксированную строку. Предположим, что у вас есть ключ x3JJHMbDL1EzLkh9GBhXDw==.

В этом вопросе вы можете выбрать SHA-1 для вычисления двоичного значения и Base64 для его кодирования. Вы получите HSmrc0sMlYUkAGmm5OPpG2HaGWk=. Используйте это как значение заголовка ответа Sec-WebSocket-Accept.

Шаг 2: Передача кадров данных

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

Изображение ниже демонстрирует небольшой рисунок кадра:

transferring data frames

Для декодирования полезной нагрузки клиента используйте следующий код:

// Recv receives data and returns a Frame
    func (ws *WS) Recv() (frame Frame, _ error) {
        frame = Frame{}
        head, err := ws.read(2)
        if err != nil {
            // handle error
        }

Для этого эти строки кода позволяют кодировать данные:

// Send sends a Frame
    func (ws *WS) Send(fr Frame) error {
        // make a slice of bytes of length 2
        data := make([]byte, 2)
    
        // Save fragmentation & opcode information in the first byte
        data[0] = 0x80 | fr.Opcode
        if fr.IsFragment {
            data[0] &= 0x7F
        }
        .....

Шаг 3: Закрытие рукопожатия

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

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

// Close sends a close frame and closes the TCP connection
func (ws *Ws) Close() error {
    f := Frame{}
    f.Opcode = 8
    f.Length = 2
    f.Payload = make([]byte, 2)
    binary.BigEndian.PutUint16(f.Payload, ws.status)
    if err := ws.Send(f); err != nil {
        return err
    }
    return ws.conn.Close()
}

Список библиотек WebSocket

Многие сторонние библиотеки упрощают жизнь разработчиков и помогают работать с приложениями WebSocket.

1. STDLIB (x/net/websocket)

Эта библиотека WebSocket принадлежит стандартной библиотеке. Она применяет сервер и клиент для протокола WebSocket. Вам не нужно устанавливать ее и она содержит хорошую официальную документацию.

Однако, с другой стороны, у него нет некоторых функций, которые можно обнаружить в других библиотеках WebSocket.В пакете STDLIB (x/net/websocket) приложения Golang WebSocket не позволяют пользователям снова использовать буферы ввода-вывода между соединениями.

2. Горилла

В веб-инструменталке Gorilla пакет WebSocket имеет проверенное и полное применение протокола WebSocket и согласованный API пакета.

Этот пакет WebSocket прост в использовании и правильно документирован. И вы можете найти его документацию на официальном сайте Gorilla.

3. Голубые лучи

Это небольшой пакет WebSocket, который содержит сильный список функций, таких как API низкого уровня, который позволяет разрабатывать логику обработки пользовательских пакетов и обновление с нулевой копией. GOBWAS не нуждается в промежуточных распределении во время ввода / вывода.

Кроме того, в пакете WsUtil есть высокоуровневые помощники и обертки вокруг API, что позволяет разработчикам быстро начать работу, не изучая внутренние компоненты протокола.

Хотя эта библиотека содержит гибкий API, он поставляется за счет ясности и удобства использования. Вы можете найти его документацию на веб-сайте GoDoc.

4. Голубые ковры

Этот инструмент Golang предоставляет широкий спектр простых в использовании функций. Он позволяет устанавливать заголовки запросов, сжимать данные и контролировать параллелизм. Он помогает прокси и подпротоколам для передачи и получения двоичных данных и текста.

Более того, разработчики могут либо включить, либо отключить проверку SSL.Документация и примеры способов использования GOWebsockets доступны на сайте GoDoc.

Завернуть

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

Они включают в себя пакет rpc, gRPC, Apache Thrift и go-socket.io. Наличие надлежащим образом документированных инструментов, таких как WebSockets, и постоянное развитие технологии потоковой передачи, упрощают разработчикам создание приложений в реальном времени.

Нашел этот пост проницательным?Не забудьте поделиться им с вашей сетью!
  • facebbok
  • twitter
  • linkedin
  • pinterest
Bipin Mishra
Написано

Бипин Мишра - опытный руководитель облачной команды, специализирующийся на AWS, GCP и Azure, где он создает масштабируемую, безопасную и экономически эффективную инфраструктуру. Как сертифицированный инженер облачной базы данных, он отстаивает лучшие практики безопасности данных, оптимизирует рабочие процессы CI / CD и бессерверные решения, которые ускоряют бизнес-результаты. Помимо работы, Бипин любит кататься на велосипеде, танцевать, готовить, играть в маринованный мяч и волейбол и волонтерство в местных домах престарелых.