>  기사  >  백엔드 개발  >  golang에서 크로스 플랫폼 통신을 위해 WebSocket을 사용하는 방법

golang에서 크로스 플랫폼 통신을 위해 WebSocket을 사용하는 방법

WBOY
WBOY원래의
2023-12-18 12:09:19639검색

golang에서 크로스 플랫폼 통신을 위해 WebSocket을 사용하는 방법

WebSocket은 웹 브라우저와 서버 간의 실시간 양방향 통신에 사용되는 기술입니다. 이는 데이터를 보내고 받는 안정적인 방법을 제공하며 기존 HTTP 요청-응답 메커니즘보다 더 효율적이고 빠릅니다. golang에서는 타사 라이브러리를 사용하여 WebSocket 통신을 지원할 수 있습니다. 이 기사에서는 gorilla/websocket 라이브러리를 사용하여 WebSocket 통신을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다.

  1. gorilla/websocket 라이브러리 설치

go get 명령을 사용하여 gorilla/websocket 라이브러리를 쉽게 설치:

go get github.com/gorilla/websocket
  1. WebSocket 연결 생성

서버 측에서는 gorilla/websocket 라이브러리의 업그레이드 기능을 사용하여 HTTP 연결 WebSocket 연결로 업그레이드하세요. 코드는 다음과 같습니다.

import (
    "net/http"

    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

func myHandler(w http.ResponseWriter, r *http.Request) {
    // 将HTTP连接升级为WebSocket连接
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        // 处理错误
        return
    }

    // 处理WebSocket连接
    for {
        // 读取消息
        messageType, p, err := conn.ReadMessage()
        if err != nil {
            // 处理错误
            return
        }

        // 处理消息
        err = conn.WriteMessage(messageType, p)
        if err != nil {
            // 处理错误
            return
        }
    }
}

func main() {
    http.HandleFunc("/", myHandler)
    http.ListenAndServe(":8080", nil)
}

클라이언트 측에서는 JavaScript 코드를 사용하여 WebSocket 연결을 생성할 수 있습니다. 코드는 다음과 같습니다:

var ws = new WebSocket("ws://localhost:8080/");

ws.onopen = function() {
    console.log("WebSocket连接已打开");
};

ws.onmessage = function(evt) {
    console.log("接收到消息: " + evt.data);
};

ws.onclose = function() {
    console.log("WebSocket连接已关闭");
};
  1. 메시지 보내기 및 받기

서버 측에서는 WriteMessage 함수를 사용하여 클라이언트에 메시지를 보낼 수 있습니다. 코드는 다음과 같습니다:

err := conn.WriteMessage(websocket.TextMessage, []byte("Hello, client!"))
if err != nil {
    // 处理错误
    return
}

클라이언트 측에서는 send 함수를 사용하여 메시지를 보내고 onmessage 함수를 사용하여 메시지를 받을 수 있습니다. 코드는 다음과 같습니다.

ws.send("Hello, server!");

ws.onmessage = function(evt) {
    console.log("接收到消息: " + evt.data);
};
  1. WebSocket 요청 처리

실제 애플리케이션에서는 WebSocket 요청을 처리할 때 인증 및 승인을 수행해야 할 수도 있습니다. 이 경우 HTTP 헤더를 사용하여 인증 정보를 전달할 수 있습니다. 예를 들어 HTTP 헤더에 다음과 유사한 정보를 추가할 수 있습니다.

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

그런 다음 서버 측에서는 Upgrader 기능의 CheckOrigin 옵션을 사용하여 WebSocket 요청의 출처를 확인하고 인증 정보를 사용할 수 있습니다. 요청을 처리하기 위해 HTTP 헤더에 있습니다. 구체적인 코드는 다음과 같습니다.

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    CheckOrigin: func(r *http.Request) bool {
        // 检查请求的来源
        if r.Header.Get("Origin") != "http://localhost:8080" {
            return false
        }

        // 检查认证信息
        if r.Header.Get("Authorization") != "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" {
            return false
        }

        return true
    },
}

func myHandler(w http.ResponseWriter, r *http.Request) {
    // 将HTTP连接升级为WebSocket连接
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        // 处理错误
        return
    }

    // 处理WebSocket连接
    for {
        // 读取消息
        messageType, p, err := conn.ReadMessage()
        if err != nil {
            // 处理错误
            return
        }

        // 处理消息
        err = conn.WriteMessage(messageType, p)
        if err != nil {
            // 处理错误
            return
        }
    }
}
  1. Summary

이 글에서는 golang에서 gorilla/websocket 라이브러리를 사용하여 WebSocket 통신을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. WebSocket 기술을 사용하면 온라인 채팅방, 멀티플레이어 게임과 같은 효율적인 실시간 양방향 통신 애플리케이션을 구축할 수 있습니다. 실제 응용 프로그램에서는 인증 및 권한 부여, 예외 처리 등과 같은 보안 및 안정성과 같은 문제도 고려해야 합니다.

위 내용은 golang에서 크로스 플랫폼 통신을 위해 WebSocket을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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