>  기사  >  백엔드 개발  >  Golang에서 Websocket 연결을 시작하고 닫는 방법

Golang에서 Websocket 연결을 시작하고 닫는 방법

PHPz
PHPz원래의
2023-04-14 09:33:141963검색

Websocket은 클라이언트와 서버 간 실시간 양방향 통신이 가능한 네트워크 프로토콜입니다. HTTP 폴링을 사용하지 않고도 효율적인 데이터 전송과 저지연 상호작용 효과를 동시에 얻을 수 있습니다. Golang은 뛰어난 동시성 성능과 뛰어난 코드 품질을 갖춘 오픈 소스 고성능 프로그래밍 언어입니다. Websocket 통신에서 Golang은 또한 뛰어난 구현 방법을 가지고 있습니다. 이 기사에서는 Golang에서 Websocket 연결을 시작하고 닫는 방법을 소개합니다.

Golang에서 Websocket 구현

Golang에서 Websocket을 구현하려면 다음 단계를 수행해야 합니다.

  1. 해당 패키지 가져오기

Go 언어에서 Websocket을 구현하려면 WebSocket 및 Http 패키지 지원이 필요합니다. 코드는 다음과 같습니다.

import (
    "net/http"
    
    "github.com/gorilla/websocket"
)

그 중 github.com/gorilla/websocket은 여러 프로토콜을 지원하는 훌륭한 WebSocket 패키지입니다. 여기에는 WebSocket 연결을 빠르게 구현하는 데 사용할 수 있는 일부 WebSocket 관련 구조와 기능이 포함되어 있습니다.

  1. WebSocket 연결 처리 기능 정의

WebSocket 연결을 처리하는 기능에서 다음 작업을 완료해야 합니다.

a WebSocket 업그레이드 정의

HTTP 요청의 경우 WebSocket 연결로 업그레이드해야 하는 경우 , 이를 처리하고 관련 업그레이드 요청을 반환해야 합니다. 코드는 다음과 같습니다.

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

func websocketHandler(w http.ResponseWriter, r *http.Request) {
    // 升级为WebSocket连接
    ws, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }
    
    // 实现WebSocket通信
    ...
}

이 코드에서는 gorilla/websocket 라이브러리의 함수인 Upgrader 구조를 사용하여 WebSocket 업그레이드를 구현합니다.

Upgrader에는 읽기 및 쓰기 버퍼 크기와 CheckOrigin 기능이 포함되어 있습니다. CheckOrigin은 요청이 합법적인 소스에서 왔는지 확인하는 데 사용됩니다. 이 메서드가 false를 반환하면 업그레이드 요청이 거부됩니다. 이 예에서는 유효성을 확인할 필요가 없으므로 CheckOrigin은 항상 true를 반환합니다.

Upgrader.Upgrade 메서드를 호출한 후 WebSocket 개체 ws를 얻습니다. 이 객체에서 ReadMessage 및 WriteMessage와 같은 메서드를 호출하여 후속 WebSocket 통신을 완료할 수 있습니다.

b. WebSocket 메시지 읽기

WebSocket 연결을 얻은 후에는 클라이언트가 보낸 메시지를 지속적으로 읽어야 합니다. WebSocket 메시지를 읽으려면 ReadMessage 메서드를 사용할 수 있습니다. 코드는 다음과 같습니다:

func websocketHandler(w http.ResponseWriter, r *http.Request) {
    ...
    
    for {
        // 读取消息
        _, message, err := ws.ReadMessage()
        if err != nil {
            log.Println(err)
            break
        }
        
        // 处理消息
        ...
    }
}

이 코드에서는 for 루프를 사용하여 WebSocket에서 메시지를 지속적으로 읽습니다. 읽기에 실패하면 WebSocket 연결이 닫히고 루프를 종료합니다.

c. WebSocket 메시지 보내기

클라이언트가 보낸 메시지를 처리한 후 일부 처리 결과를 클라이언트에 보내야 할 수도 있습니다. WebSocket 메시지를 보내려면 WriteMessage 메서드를 사용할 수 있습니다. 코드는 다음과 같습니다.

func websocketHandler(w http.ResponseWriter, r *http.Request) {
    ...
    
    for {
        ...
        
        // 发送消息
        err = ws.WriteMessage(websocket.TextMessage, []byte(reply))
        if err != nil {
            log.Println(err)
            break
        }
    }
}

이 코드에서는 WriteMessage 메서드를 통해 클라이언트에 메시지를 보냅니다. 이 메서드의 첫 번째 매개 변수는 TextMessage 또는 BinaryMessage로 지정할 수 있는 메시지 유형입니다. 두 번째 매개 변수는 전송할 데이터가 포함된 바이트 배열입니다.

  1. WebSocket 서비스 시작

위 단계를 완료하면 WebSocket 서비스를 시작할 수 있습니다. 코드는 다음과 같습니다.

func main() {
    http.HandleFunc("/ws", websocketHandler)
    log.Println("Server started at http://127.0.0.1:8080")
    http.ListenAndServe(":8080", nil)
}

이 코드에서는 http.HandleFunc 함수를 호출하여 "/ws" 경로를 WebSocket 처리 함수 websocketHandler에 매핑합니다. 마지막으로 http.ListenAndServe를 호출하여 서비스를 시작합니다.

WebSocket 연결 닫기

WebSocket을 사용한 후에는 수동으로 연결을 닫아야 합니다. WebSocket 연결을 정상적으로 종료하려면 다음 사항에 주의해야 합니다.

a. 서버 측이 적극적으로 종료합니다.

서버 측에서 WebSocket 연결을 종료해야 하는 경우 WebSocket.Close 메서드를 호출할 수 있습니다. 코드는 다음과 같습니다.

func websocketHandler(w http.ResponseWriter, r *http.Request) {
    defer ws.Close() // 关闭WebSocket连接
    
    for {
        ...
    }
}

이 코드에서는 defer 문을 사용하여 websocket 함수 끝에서 WebSocket 연결을 자동으로 닫습니다.

b. 클라이언트가 적극적으로 닫힙니다.

클라이언트가 WebSocket 연결을 닫아야 할 경우 서버에 Close 메시지를 보낼 수 있습니다. 서버는 닫기 메시지를 수신하고 메시지를 받은 후 WebSocket 연결을 적극적으로 닫습니다.

서버측 웹소켓 기능에서 Close 메시지를 처리하기 위해 브랜치를 추가할 수 있습니다. 코드는 다음과 같습니다.

func websocketHandler(w http.ResponseWriter, r *http.Request) {
    ...
    
    for {
        // 读取消息
        messageType, message, err := ws.ReadMessage()
        if err != nil {
            log.Println(err)
            break
        }
        
        // 处理消息
        switch messageType {
        case websocket.CloseMessage:
            // 收到关闭消息,关闭连接
            return
        case websocket.TextMessage:
            // 收到文本消息,处理消息
            ...
        case websocket.BinaryMessage:
            ...
        }
    }
    
    // 关闭WebSocket连接
    ws.Close()
}

이 코드에서는 메시지 유형이 CloseMessage인 처리 분기를 추가합니다. Close 메시지를 받은 후 즉시 websocket 기능을 종료하고 WebSocket 연결을 닫습니다.

c. 비정상 종료

WebSocket 연결에 이상이 발생하면 제때에 연결을 종료해야 합니다. 예를 들어, 네트워크 연결이 끊기거나 클라이언트와 서버 간의 연결 시간이 초과되는 등의 경우 WebSocket 연결을 닫아야 합니다.

websocket 함수에서 예외를 잡을 수 있고, 예외가 잡혔을 때 WebSocket 연결을 닫을 수 있습니다. 코드는 다음과 같습니다.

func websocketHandler(w http.ResponseWriter, r *http.Request) {
    defer ws.Close() // 当函数退出时关掉WebSocket连接
    
    for {
        _, message, err := ws.ReadMessage()
        if err != nil {
            if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) {
                log.Printf("error: %v", err)
            }
            break
        }
        
        // 处理消息
        ...
    }
}

이 코드에서는 websocket 함수가 반환되기 전에 defer 문을 통해 수동으로 WebSocket 연결을 닫습니다. ReadMessage 작업에서 예외 오류를 캡처하고 로그 출력을 수행하는 기능을 추가했습니다.

요약

Golang에서는 gorilla/websocket 라이브러리를 통해 웹소켓 연결이 가능합니다. WebSocket 통신의 처리 기능에서 Upgrader 구조를 사용하여 HTTP 프로토콜을 WebSocket으로 업그레이드할 수 있습니다. WebSocket에 연결할 때 WebSocket 메시지의 일부 읽기 및 전송 작업을 구현해야 합니다.

WebSocket 연결이 정상적으로 종료되도록 하려면 다음 사항에 주의해야 합니다.

  1. 서버는 작업을 완료한 후 수동으로 WebSocket 연결을 닫아야 합니다.
  2. 클라이언트가 닫기 메시지를 받으면 서버는 즉시 WebSocket 연결을 닫아야 합니다.
  3. WebSocket 연결에서 예외가 발생하면 연결을 끊어야 합니다. 예외를 포착한 후 즉시 닫힙니다.

위 내용은 Golang에서 Websocket 연결을 시작하고 닫는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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