gpt4 book ai didi

javascript - 使用 websockets Golang 将更改推送到客户端

转载 作者:IT王子 更新时间:2023-10-29 01:44:34 25 4
gpt4 key购买 nike

我一直在尝试使用 Golang 中的 websockets 推送在服务器端完成的更改。

我已经通过这段代码实现了我想要的

服务器端代码:

package main

import (
"golang.org/x/net/websocket"
"fmt"
"net/http"
"os"
"bufio"
)

type chat struct {
message string
}

func (ms *chat) Echo(ws *websocket.Conn) {
var reply string
for {
if reply != ms.message {
websocket.Message.Send(ws, ms.message)
}
websocket.Message.Receive(ws, reply)
}
}

func NewMessage(s *string){
reader := bufio.NewReader(os.Stdin)
for {
fmt.Print("Enter text: ")
*s, _ = reader.ReadString('\n')
}
}

func main() {
myString := chat{"Welcome"}
go NewMessage(&myString.message)
http.Handle("/", websocket.Handler(myString.Echo))
http.ListenAndServe(":1234", nil)
}

客户端代码:

<html>
<body>
<script type="text/javascript">
var exampleSocket = new WebSocket("ws://127.0.0.1:1234");

exampleSocket.onopen = function (event) {
console.log("connected");
};

exampleSocket.onmessage = function (event) {
console.log(event.data);
exampleSocket.send(event.data)
document.getElementById("p1").innerHTML = event.data;
}


</script>
<h1>WebSockets</h1>
<form>
<p id="p1" value="Hello, world!"/>
</form>

上述代码的问题是重复发送 ms.message,因为 if reply != ms.message 不起作用。 var reply string 值不会被 websocket.Message.Receive(ws, reply) 更改。

我试过将 reply 作为指针传递,但它不会动态更新客户端的值。

这是更改后服务器端的样子:

package main

import (
"golang.org/x/net/websocket"
"fmt"
"net/http"
"os"
"bufio"
)

type chat struct {
message string
}

func (ms *chat) Echo(ws *websocket.Conn) {
var reply string
for {
if reply != ms.message {
websocket.Message.Send(ws, ms.message)
}
websocket.Message.Receive(ws, &reply)
}
}

func NewMessage(s *string){
reader := bufio.NewReader(os.Stdin)
for {
fmt.Print("Enter text: ")
*s, _ = reader.ReadString('\n')
}
}

func main() {
myString := chat{"Welcome"}
go NewMessage(&myString.message)
http.Handle("/", websocket.Handler(myString.Echo))
http.ListenAndServe(":1234", nil)
}

这段代码不符合我的预期。

是否可以在客户端动态更新字符串,而无需像示例 1 中那样多次发送值?

最佳答案

只需将 websocket.Message.Receive 放在 if 语句中即可解决问题。

package main

import (
"golang.org/x/net/websocket"
"fmt"
"net/http"
"os"
"bufio"
)

type chat struct {
message string
}

func (ms *chat) Echo(ws *websocket.Conn) {
var reply string
for {
if reply != ms.message {
websocket.Message.Send(ws, ms.message)
websocket.Message.Receive(ws, &reply)
}

}
}

func NewMessage(s *string){
reader := bufio.NewReader(os.Stdin)
for {
fmt.Print("Enter text: ")
*s, _ = reader.ReadString('\n')
}
}

func main() {
myString := chat{"Welcome"}
go NewMessage(&myString.message)
http.Handle("/", websocket.Handler(myString.Echo))
http.ListenAndServe(":1234", nil)
}

关于javascript - 使用 websockets Golang 将更改推送到客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46696403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com