在 Spring Boot 和 Kotlin 中使用 Netty Socket.IO 实现的套接字 IO 服务器上未接收到套接字 IO 事件

问题描述

我在使用 Socket.IO 跨客户端和服务器发送消息时遇到问题

我的 Socket.IO 服务器是使用 Netty Socket IO https://github.com/mrniko/netty-socketio 实现的,如下所示:

我的配置文件

@Configuration
class SocketIOConfig(
    @Value("\${socketio.host}")
    val host: String,@Value("\${socketio.port}")
    val port: Int,@Value("\${socketio.bossCount}")
    val bossCount: Int,@Value("\${socketio.workCount}")
    val workCount: Int,@Value("\${socketio.allowCustomrequests}")
    val allowCustomrequests: Boolean,@Value("\${socketio.upgradeTimeout}")
    val upgradeTimeout: Int,@Value("\${socketio.pingTimeout}")
    val pingTimeout: Int,@Value("\${socketio.pingInterval}")
    val pingInterval: Int
) {
    @Bean
    fun socketIOServer(): SocketIOServer {
        val socketConfig = SocketConfig()
        socketConfig.isTcpNoDelay = true
        socketConfig.soLinger = 0
        val config = com.corundumstudio.socketio.Configuration()
        config.socketConfig = socketConfig
        config.hostname = host
        config.port = port
        config.bossthreads = bossCount
        config.workerThreads = workCount
        config.isAllowCustomrequests = allowCustomrequests
        config.upgradeTimeout = upgradeTimeout
        config.pingTimeout = pingTimeout
        config.pingInterval = pingInterval
        return SocketIOServer(config)
    }
}

这是我的 application.properties 文件

socketio.host=localhost
socketio.port=8888
socketio.maxFramePayloadLength=1048576
socketio.maxHttpContentLength=1048576
socketio.bossCount=1
socketio.workCount=100
socketio.allowCustomrequests=true
socketio.upgradeTimeout=1000000
socketio.pingTimeout=6000000
socketio.pingInterval=25000

这是我的 SocketIOService

@Service(value = "socketIOService")
class SocketIOServiceImpl {

    @Autowired
    private lateinit var socketIOServer: SocketIOServer

    private val logger = LoggerFactory.getLogger(SocketIOServiceImpl::class.java)

    @postconstruct
    private fun autoStartup() {
        start()
    }

    @PreDestroy
    private fun autoStop() {
        stop()
    }

    private fun getIpByClient(client: SocketIOClient): String {
        val sa = client.remoteAddress.toString()
        return sa.substring(1,sa.indexOf(":"))
    }

    fun start() {
        socketIOServer.addConnectListener { client: SocketIOClient ->
            logger.info("A Client has Connected {}",client)
            client.sendEvent("game","What's Up Man")
        }
        socketIOServer.adddisconnectListener { client: SocketIOClient ->
            val clientIp: String = getIpByClient(client)
            logger.info("$clientIp Client disconnected")
            client.disconnect()
        }
        socketIOServer.addEventListener(
            "test",String::class.java
        ) { socketIOClient,data,ackRequest ->
            logger.info("An event was sent from a client with data = $data")
        }
        socketIOServer.start()
    }

    fun pushMessagetoAllConnectedClients(game: Game) {
        socketIOServer.broadcastOperations.sendEvent("game",game)
    }

    fun stop() {
        socketIOServer.stop();
    }

}

现在,我在 socket.io-client js 库的帮助下连接了 ReactJS 客户端,如下所示:

  const initSocketIO = () => {
        const socket = io("http://localhost" + ":8888");
        socket.on('connect',(data: any) => {
            console.log("I am connected!");
            socket.io.emit("test","Test Event!");
        })
        socket.on("game",(data: any) => {
            console.log("New SocketIO Data Received as: ");
        });
    }


useEffect(() => {
    initSocketIO();
},[loaded]);

运行应用后,ReactJS 客户端连接到服务器,服务器检测到并记录

2021-01-19 00:46:53.514  INFO 168 --- [ntLoopGroup-3-3] c.c.c.services.socketIOServiceImpl       : A Client has Connected com.corundumstudio.socketio.transport.NamespaceClient@4e0db1c5

然而事件来回并没有被接收。

可能有什么问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)