GoLang Socket.io Emit 没有被 React 接收

Posted

技术标签:

【中文标题】GoLang Socket.io Emit 没有被 React 接收【英文标题】:GoLang Socket.io Emit not Being Recieved by React 【发布时间】:2021-12-31 23:22:35 【问题描述】:

我是 golang 的新手,我没有找到最新版本的发射和广播示例的其他变体:https://github.com/googollee/go-socket.io/,它是 golang 的 socketio 库之一。

首先是我的 golang 代码,取自示例:

func InitSessionServer() 



    server := socketio.NewServer(&engineio.Options
        Transports: []transport.Transport
            &polling.Transport
                CheckOrigin: allowOriginFunc,
            ,
            &websocket.Transport
                CheckOrigin: allowOriginFunc,
            ,
        ,
    )

    server.OnConnect("/", func(s socketio.Conn) error 
        s.SetContext("")
        log.Println("connected:", s.ID())
        return nil
    )

   server.OnEvent("/", "status", func(s socketio.Conn, msg string) 
    log.Println("Message ", msg)
    s.Emit("reply", msg)
    )



    server.OnError("/", func(s socketio.Conn, e error) 
        log.Println("meet error:", e)
    )

    server.OnDisconnect("/", func(s socketio.Conn, reason string) 
        log.Println("closed", reason)
    )

    go func() 
        if err := server.Serve(); err != nil 
            log.Fatalf("socketio listen error: %s\n", err)
        
    ()
    defer server.Close()

    http.Handle("/socket.io/", server)

    log.Println("Serving at localhost:8000...")
    log.Fatal(http.ListenAndServe(":8000", nil))


所以它非常基本。我们将status 事件作为本实验的主要焦点。在我的假设中,因为这是一个套接字服务器。每当我将某些东西传递给status 事件时,例如在iocat 中,这是一个您可以在Linux 终端上测试您的套接字的工具

 npx iocat --socketio ws://127.0.0.1:8000/ -e status

 > test

这意味着 status 事件收到测试并将其发送到 reply 然后我的反应应用程序将收到来自端口的回复并显示消息的内容。因此我的反应套接字实现如下:

import  useState, useEffect  from 'react'
import io from 'socket.io-client'
const BROADCAST_SERVER_URL = 'http://192.168.1.12:8000/'
export const event_server = io(BROADCAST_SERVER_URL, 
  transports: ['websocket'],
)
event_server.on('reply', function(msg)
  console.log('Status changed', msg)
);

event_server.on('connect', () => 
  console.log('connected')
)
event_server.on('disconnect', () => 
  console.log('broadcast server disconnected')
)
event_server.on('connect_error', response => 
  console.log(response)
)

function Socket( children ) 
  return children

export default Socket

我现在真的很迷茫为什么reply 没有收到任何东西。知道为什么它不起作用吗?顺便说一句,我在 connect 上登录了 react,我得到了 connected 日志。我很头疼为什么我不能得到发出的回复。

ADDTL:正如您在上面看到的,我有一个printLn,它确实显示了测试消息。除了它正在发出时,我在 React 上看不到它

【问题讨论】:

【参考方案1】:

在那个 github 包中,io 是 var 而不是 const。

var socket = io();
socket.on('reply', function(msg)
    $('#messages').append($('<li>').text(msg));
  );

我认为你可以尝试将其转换为 var。

【讨论】:

以上是关于GoLang Socket.io Emit 没有被 React 接收的主要内容,如果未能解决你的问题,请参考以下文章

Android socket.IO中的Emit或Ack超时处理?

io.emit 与 socket.emit

socket.io - socket.emit、socket.on、socket.send

socket.io的emit使用清单

socket.io 没有发送给所有客户端

socket.io emit callback调用探秘