客户端通过websocket将文件保存到golang服务器上

问题描述 投票:0回答:1

我想保存几个文件,但 websocket 在创建单个文件后不断重新启动。我收到 websocket 错误

websocket:关闭1001(消失)

当我删除文件保存的代码块时,for循环起作用,否则,websocket重新启动。

conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
if err != nil {
    fmt.Println("Error upgrading to WebSocket:", err)
    return
}
defer conn.Close()
for i := 0; ; i++ {
    questionaire:= questionaires[i].msg //a couple of questions to be sent to client
    if i == 0 {
        // send initial message to frontend
        sendServerMessageToClient(conn, questionaire)
    } else {
        messageType, msg, err := conn.ReadMessage()
        if err != nil || err == io.EOF {
            break
        }
        response = ""
        if messageType == websocket.BinaryMessage {

            // if this blocks of code here is removed, it works, otherwise restarts the websocket connection
            fileName := fmt.Sprintf("answer%d.wav", i)
            file, err := os.Create(fileName)
            if err != nil {
                fmt.Println(err)
            }
              
            _, err = file.Write(msg)
            if err != nil {
                fmt.Println(err)
            }
            // til here
           // handle the saved file and call to speech to text api 
            
           response = "yes" //assumed the response is "yes"
        }
        switch response {
        case "yes":
            if i < len(questionaires) {
                sendServerMessageToClient(conn, questionaire)
            } else {
                sendServerMessageToClient(conn, "end")
                return
            }
        case "no":
            sendServerMessage(conn, "Exiting")
            return
        default:
            i--
        }
    }
}
go websocket backend
1个回答
0
投票

我认为这是因为你所做的第一次迭代

 file, err := os.Create(fileName)

第二次迭代,当你这样做时,

file
将为零(因为创建将失败,因为它已经存在)。那么当您尝试执行
file.Write
时,它可能会崩溃?

我会尝试这个

var file *os.File
for i := 0; ; i++ {
    // ....
    fileName := fmt.Sprintf("answer%d.wav", i)
    if file == nil {
        file, err = os.Create(fileName)
        if err != nil {
            fmt.Println(err)
        }
    }
    _, err = file.Write(msg)
    // ....
}
© www.soinside.com 2019 - 2024. All rights reserved.