csdn0811 2024-04-17 23:07 采纳率: 60.7%
浏览 5
已结题

go-socket.io技术服务端没有回应的问题

我在客户端文本框输入内容,但是服务器没有回应,为什么? 是因为服务端的 socket版本和 客户端的socket版本不匹配吗?
客户端中,我使用了官方给出的 版本都不行,还是其他问题呢?

cdnjs: https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.7.5/socket.io.min.js
jsDelivr: https://cdn.jsdelivr.net/npm/socket.io-client@4.7.5/dist/socket.io.min.js@4.7.5/dist/socket.io.min.js
unpkg: https://unpkg.com/socket.io-client@4.7.5/dist/socket.io.min.js@4.7.5/dist/socket.io.min.js



</head>
 <script src="https://unpkg.com/socket.io-client@4.7.5/dist/socket.io.min.js"></script>
<script src="asset/js/jquery-1.11.3.min.js"></script>
<script>
    var socket = io("http://127.0.0.1:8000");
    socket.on("reply", function (serverData) {
        console.log(serverData)
        $("#content").append("<p>答:" + serverData + "<p>")
    })
    $("#send").click(function () {
        var msg = $("#msg").val();
        $("#msg").val("");
        $("#content").append("<p>问:" + msg + "<p>");
        socket.emit("notice", msg);
    })
</script>

<body>
    <h2>消息列表</h2>
    <div id="content"></div>

    <div id="inputArea">
        <input type="text" id="msg" placeholder="输入问题" />
        <button id="send">发送</button>
    </div>
</body>

</html>   
package main

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

    socketio "github.com/googollee/go-socket.io"
)

func main() {
    server := socketio.NewServer(nil)
    server.OnConnect("/", func(c socketio.Conn) error {
        c.SetContext("")
        fmt.Println("connected:", c.ID())
        return nil
    })
    server.OnEvent("/", "notice", func(c socketio.Conn, msg string) {
        fmt.Println("notice:", msg)
        c.Emit("reply", "have "+msg)
    })

    server.OnEvent("/chat", "msg", func(c socketio.Conn, msg string) string {
        c.SetContext(msg)
        return "recv " + msg
    })

    server.OnEvent("/", "bye", func(c socketio.Conn) string {
        last := c.Context().(string)
        c.Emit("bye", last)
        c.Close()
        return last
    })
    server.OnError("/", func(c socketio.Conn, e error) {
        // server.Remove(s.ID())
        fmt.Println("meet error:", e)
    })
    server.OnDisconnect("/", func(c socketio.Conn, reason string) {
        // Add the Remove session id. Fixed the connection & mem leak
        // server.Remove(c.ID())
        fmt.Println("closed", reason)
    })
    go server.Serve()
    defer server.Close()

    http.Handle("/socket.io/", server)
    http.Handle("/", http.FileServer(http.Dir("./asset"))) 
    log.Println("Serving at localhost:8000...")
    log.Fatal(http.ListenAndServe(":8000", nil))
}

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-17 23:07
    关注

    引自免费微信小程序:皆我百晓生

    看起来你的Golang服务端代码与JavaScript客户端代码基本是匹配的。然而,为了确保所有东西都能正常工作,我们先从几个常见的问题排查开始。

    首先,请检查以下几个方面:

    1. 确保你的Go服务正在运行,并监听8000端口。在命令行中运行你的服务端程序并确认没有任何错误输出。
    2. 检查浏览器控制台是否有关于socket.io连接或通信的错误信息。这可能有助于发现网络问题或兼容性问题。
    3. 检查客户端和服务端的事件名称是否完全一致。例如,在服务端你处理的是"notice"事件,而在客户端发射的是"notice"事件,这是正确的匹配。

    既然你已经尝试了不同源的socket.io客户端库,并且它们都未能解决你的问题,那么可能性不是版本不匹配造成的。接下来,我们将进一步调试客户端和服务器。

    服务端代码调整:

    将服务端的日志打印添加一些额外的信息,以便更好地追踪连接状态。

    package main
    
    // ... 其他导入 ...
    
    func main() {
        // ... 之前的代码 ...
        
        server.OnConnect("/", func(c socketio.Conn) error {
            c.SetContext("")
            fmt.Printf("Client %s connected\n", c.ID())
            return nil
        })
    
        // ... 之后的代码 ...
        
        server.OnEvent("/", "notice", func(c socketio.Conn, msg string) {
            fmt.Printf("Received 'notice' from client %s: %s\n", c.ID(), msg)
            c.Emit("reply", "Have "+msg)
        })
    
        // ... 之后的代码 ...
    }
    

    客户端代码调整:

    在客户端,加入一些日志打印来跟踪连接和事件处理情况。

    <script>
        var socket = io("http://127.0.0.1:8000");
        socket.on("connect", function () {
            console.log("Connected to server");
        });
    
        socket.on("error", function (err) {
            console.error("Connection error:", err);
        });
    
        socket.on("disconnect", function () {
            console.log("Disconnected from server");
        });
    
        socket.on("reply", function (serverData) {
            console.log("Received reply:", serverData);
            $("#content").append("<p>答:" + serverData + "<p>")
        })
    
        $("#send").click(function () {
            var msg = $("#msg").val();
            $("#msg").val("");
            $("#content").append("<p>问:" + msg + "<p>");
            socket.emit("notice", msg);
        });
    </script>
    

    现在,当你在客户端输入内容并点击发送时,请检查浏览器的开发者工具(F12)中的控制台输出。这些额外的日志应该能帮助你确定问题所在,比如连接是否成功建立、事件是否被正确触发等。

    如果你仍然遇到问题,或者需要进一步的帮助,请提供更详细的日志输出,这样我可以更好地分析问题所在。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 6月1日
  • 已采纳回答 5月24日
  • 创建了问题 4月17日