>  기사  >  백엔드 개발  >  Golang은 웹소켓을 구현합니다.

Golang은 웹소켓을 구현합니다.

王林
王林원래의
2023-05-22 14:45:082421검색

인터넷 기술의 지속적인 발전으로 실시간 연결은 점점 더 많은 애플리케이션에 필수적인 기능이 되었습니다. WebSocket은 서버가 클라이언트에 데이터를 푸시하여 실시간 양방향 통신을 달성할 수 있도록 하는 TCP 프로토콜 기반의 네트워크 프로토콜입니다.

Go는 단순성과 효율성으로 인해 빠르고 효율적인 프로그래밍 언어로 최근 몇 년간 가장 인기 있는 언어 중 하나가 되었습니다. 이번 글에서는 Go언어를 이용하여 WebSocket 서비스를 구현하는 방법을 소개하겠습니다.

WebSocket이란

WebSocket 프로토콜은 클라이언트와 서버 간의 실시간 통신을 가능하게 하는 TCP 프로토콜 기반의 전이중 통신 프로토콜입니다. 기존 HTTP 요청 및 응답 모드와 비교하여 WebSocket은 연결이 설정된 후에도 연결 상태를 유지할 수 있으므로 실시간 양방향 통신이 가능합니다.

WebSocket 프로토콜의 작업 흐름은 다음과 같습니다.

  1. 클라이언트가 WebSocket 연결 요청을 시작합니다.
  2. 요청을 받은 후 서버는 WebSocket 연결을 사용할 수 있는지 확인하기 위해 핸드셰이크 프로토콜을 수행합니다.
  3. WebSocket 연결이 설정된 후 클라이언트와 서버는 실시간 양방향 통신을 수행할 수 있습니다.
  4. 서버가 클라이언트에 데이터를 보내야 하는 경우 클라이언트에 직접 보낼 수 있고 그 반대의 경우도 마찬가지입니다.

기존 HTTP 요청과 비교했을 때 WebSocket의 장점은 다음과 같습니다.

  1. 실시간 양방향 통신으로 온라인 게임, 실시간 채팅, 온라인 비디오와 같은 실시간 애플리케이션 시나리오에 적합합니다.
  2. 요청 및 응답 수가 줄어들어 네트워크 대역폭 소비가 줄어들고 데이터 전송 효율성이 향상됩니다.

Go는 WebSocket을 구현합니다

Go는 단순성, 효율성, 보안 및 기타 특성으로 인해 점점 더 많은 팀이 Go를 사용하여 네트워크 애플리케이션을 개발하기 시작하고 있습니다. Go에는 HTTP 및 WebSocket 서비스를 구현하기 위한 API를 제공하는 표준 라이브러리 net/http가 있습니다.

WebSocket 연결 설정

WebSocket 연결을 설정하려면 서버와 클라이언트에서 각각 다음 작업을 수행해야 합니다.

Server

  1. HTTP 서비스를 생성하고 http.HandleFunc를 사용합니다. > 기능을 사용하면 하나의 Router를 등록하고 해당 라우팅 처리 기능을 통해 WebSocket 통신을 수행할 수 있습니다. http.HandleFunc 函数注册一个路由器,并允许对应的路由处理函数进行 WebSocket 通信。
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    // 判断是否支持 WebSocket,如果支持则进入 WebSocket 通信处理函数。
    if websocket.IsWebSocketUpgrade(r) {
        websocket.Handler(handleWebSocket).ServeHTTP(w, r)
        return
    }

    http.ServeFile(w, r, "index.html")
})
  1. 在 WebSocket 通信处理函数中进行建立连接操作。
func handleWebSocket(conn *websocket.Conn) {
    defer conn.Close()

    // 输出日志信息,表示已经建立连接。
    log.Println("WebSocket connected")

    for {
        // 读取客户端发送过来的消息。
        _, msg, err := conn.ReadMessage()
        if err != nil {
            log.Println("Read error:", err)
            return
        }

        // 输出日志信息,表示接收到客户端发送的消息。
        log.Printf("Received: %s
", msg)

        // 处理完毕后,发送消息。
        err = conn.WriteMessage(websocket.TextMessage, msg)
        if err != nil {
            log.Println("Write error:", err)
            return
        }
    }
}

客户端

在客户端中,我们需要使用 JavaScript 代码进行 WebSocket 连接的操作。具体代码如下:

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

socket.onopen = function() {
  console.log("WebSocket connected");
};

socket.onmessage = function(event) {
  console.log("Received: " + event.data);
};

socket.onclose = function(event) {
  console.log("WebSocket closed");
};

socket.onerror = function(event) {
  console.log("WebSocket error: " + event.data);
};

发送消息

当 WebSocket 连接建立后,服务端和客户端就可以进行实时双向通信了。服务端可以通过 conn.WriteMessage 函数向客户端发送消息,客户端可以通过 socket.send 函数向服务端发送消息。

从客户端发送消息:

socket.send("Hello world");

在服务端接收并处理消息:

_, msg, err := conn.ReadMessage()
if err != nil {
    log.Println("Read error:", err)
    return
}

log.Printf("Received: %s
", msg)

从服务端发送消息:

err = conn.WriteMessage(websocket.TextMessage, []byte("Hello world"))
if err != nil {
    log.Println("Write error:", err)
    return
}

在客户端接收并处理消息:

socket.onmessage = function(event) {
    console.log("Received: " + event.data);
};

WebSocket 的错误处理

在实际开发中,WebSocket 可能会出现各种异常情况,例如网络中断、连接超时、服务器崩溃等。在 Go 中,我们可以通过错误处理来处理这些异常情况。

在服务端中,我们可以通过 defer 语句来进行资源释放,例如关闭 WebSocket 连接等。

defer conn.Close()

同时,在进行 websocket 通信处理函数的过程中,我们需要对可能发生的错误进行预处理。例如:

_, msg, err := conn.ReadMessage()
if err != nil {
    log.Println("Read error:", err)
    return
}

在客户端中,我们可以通过 onerror

socket.onerror = function(event) {
    console.log("WebSocket error: " + event.data);
};

    WebSocket 통신 처리 기능에서 연결 설정 작업을 수행합니다.

    rrreee

    Client🎜🎜클라이언트에서 WebSocket 연결을 작동하려면 JavaScript 코드를 사용해야 합니다. 구체적인 코드는 다음과 같습니다. 🎜rrreee🎜메시지 보내기🎜🎜WebSocket 연결이 이루어지면 서버와 클라이언트는 실시간 양방향 통신을 할 수 있습니다. 서버는 conn.WriteMessage 함수를 통해 클라이언트에 메시지를 보낼 수 있고, 클라이언트는 socket.send 함수를 통해 서버에 메시지를 보낼 수 있습니다. 🎜🎜클라이언트에서 메시지 보내기: 🎜rrreee🎜서버에서 메시지 수신 및 처리: 🎜rrreee🎜서버에서 메시지 보내기: 🎜rrreee🎜클라이언트에서 메시지 수신 및 처리: 🎜rrreee🎜WebSocket 오류 처리🎜 🎜실제로 WebSocket은 개발 중에 네트워크 중단, 연결 시간 초과, 서버 충돌 등 다양한 비정상적인 상황에 직면할 수 있습니다. Go에서는 오류 처리를 통해 이러한 예외를 처리할 수 있습니다. 🎜🎜서버 측에서는 defer 문을 사용하여 WebSocket 연결 닫기 등의 리소스를 해제할 수 있습니다. 🎜rrreee🎜동시에 웹소켓 통신 처리 기능을 수행하는 과정에서 발생할 수 있는 오류에 대한 전처리가 필요합니다. 예: 🎜rrreee🎜클라이언트에서는 onerror 이벤트를 통해 WebSocket 오류를 처리할 수 있습니다. 예: 🎜rrreee🎜Summary🎜🎜이 문서에서는 Go 언어를 사용하여 WebSocket 서비스를 구현하는 방법을 소개합니다. WebSocket 연결 설정, 메시지 보내기, 예외 처리 등을 포함합니다. WebSocket 프로토콜은 실시간 양방향 통신 방법을 제공하며 온라인 게임, 실시간 채팅, 온라인 비디오와 같은 실시간 응용 시나리오에서 사용할 수 있습니다. Go에서는 표준 라이브러리인 net/http에서 제공하는 API를 이용하여 WebSocket 서비스를 쉽게 구현할 수 있습니다. 🎜

위 내용은 Golang은 웹소켓을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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