>백엔드 개발 >Golang >websocket: websocket 프로토콜을 사용하지 않는 클라이언트: 'Connection' 헤더에서 'Upgrade' 토큰을 찾을 수 없습니다.

websocket: websocket 프로토콜을 사용하지 않는 클라이언트: 'Connection' 헤더에서 'Upgrade' 토큰을 찾을 수 없습니다.

王林
王林앞으로
2024-02-09 14:24:101303검색

websocket:客户端未使用 websocket 协议:“连接”标头中未找到“升级”令牌

WebSocket 연결을 할 때 가끔 "WebSocket 프로토콜을 사용하지 않는 클라이언트: '연결' 헤더에 '업그레이드' 토큰이 없습니다."라는 오류가 나타납니다. 이 오류는 일반적으로 클라이언트가 WebSocket 프로토콜을 올바르게 사용하지 않기 때문에 발생합니다. WebSocket은 연결을 설정하기 위해 특별한 핸드셰이크 프로세스를 사용하여 클라이언트와 서버 간의 양방향 통신을 가능하게 하는 프로토콜입니다. 핸드셰이크 중에 클라이언트는 WebSocket 프로토콜의 사용을 나타내기 위해 "Upgrade" 헤더를 올바르게 보내야 합니다. 클라이언트가 이 헤더를 올바르게 보내지 않으면 서버는 위의 오류를 반환합니다. PHP 편집자 Baicao는 WebSocket 연결이 원활하게 진행될 수 있도록 이 문제를 해결하는 방법을 이 기사에서 자세히 소개합니다.

질문 내용

go 및 javascript 프론트엔드로 작성된 서버에 웹소켓 연결을 설정하려고 합니다. 디렉토리에 다음 파일이 있습니다:

main.go index.html

**이것은 main.go에 있는 내 Go 코드입니다:**

으아악

index.html의 HTML과 자바스크립트는 다음과 같습니다.

으아악

그러나 go run main.go 을 사용하여 실행하면 다음 오류가 발생합니다.

으아악

독일어로 "호스트 소프트웨어의 제어 하에 기존 연결이 종료됩니다"라는 뜻입니다

뭔가 빠졌고, 문제가 무엇인지 알아낼 만큼 이해력이 깊지 않습니다. 어떤 도움이라도 대단히 감사하겠습니다!

내 js websocket에 업그레이드가 누락되었을 수도 있다고 생각했는데, 크롬에서는 "upgrade:websocket"이라고 적힌 요청 URL ws://localhost:9100/ws에 대한 다음 요청 헤더를 볼 수 있습니다

package main


import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)

var upgrader = websocket.upgrader{
    readbuffersize:  1024,
    writebuffersize: 1024,
}

func homepage(w http.responsewriter, r *http.request) {
    http.servefile(w, r, "./index.html")
    conn, err := upgrader.upgrade(w, r, nil)
    if err != nil {
        log.println("error in handler:", err)
        return
    }
    log.println("client connected.")

    for {
        messagetype, p, err := conn.readmessage()
        if err != nil {
            log.println("fehler in readmessage: ", err)
            return
        }

        log.println(string(p))

        //echo message to client
        if err := conn.writemessage(messagetype, p); err != nil {
            log.println(err)
            return
        }
    }
}

func setuproutes() {
    http.handlefunc("/ws", homepage)
}

func main() {
    fmt.println("server gestartet")
    setuproutes()
    log.fatal(http.listenandserve(":9100", nil))

}

해결 방법

cerise limón의 유용한 의견 덕분에 문제를 해결할 수 있었습니다. 문제는 파일 인덱싱을 위한 엔드포인트와 웹소켓을 위한 엔드포인트가 필요하다는 것입니다. 그래서 관련 부분을 다음과 같이 변경했습니다:

으아악

위 내용은 websocket: websocket 프로토콜을 사용하지 않는 클라이언트: 'Connection' 헤더에서 'Upgrade' 토큰을 찾을 수 없습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제