Node.js 使用socket.io、socket.io-p2p、socket.io-p2p-server自动配对对等连接

Node.js 使用socket.io、socket.io-p2p、socket.io-p2p-server自动配对对等连接,node.js,sockets,socket.io,webrtc,p2p,Node.js,Sockets,Socket.io,Webrtc,P2p,我正在尝试用WebSocket连接一个小游戏。我正在使用socket.io、socket.io-p2p和socket.io-p2p-server。我希望用户能够自动配对任何没有合作伙伴的连接玩家。我希望用户只能成对连接 到目前为止,只需遵循文档,我只能使用socket.io让客户端连接。当我尝试使用socket.io-p2p和socket.io-p2p-server时,有时我可以让用户连接,有时我会在屏幕上看到错误消息,如 套接字上缺少错误处理程序。 TypeError:无法读取未定义“”的属性

我正在尝试用WebSocket连接一个小游戏。我正在使用socket.io、socket.io-p2p和socket.io-p2p-server。我希望用户能够自动配对任何没有合作伙伴的连接玩家。我希望用户只能成对连接

到目前为止,只需遵循文档,我只能使用socket.io让客户端连接。当我尝试使用socket.io-p2p和socket.io-p2p-server时,有时我可以让用户连接,有时我会在屏幕上看到错误消息,如

套接字上缺少错误处理程序。
TypeError:无法读取未定义“”的属性“emit”

有人在回购协议上就这个问题提出了一个问题,但没有得到回应,也没有得到回应

我不知道socket.io-p2p-server是否坏了,或者我只是缺少了什么。此外,自3月份以来,socket.io-p2p-server还没有受到太多的影响

因此,我的主要问题是:

  • socket.io-p2p-server还活着吗

  • 有没有更好的实现可以用于这些抽象

  • 写我自己的逻辑而不是使用socket.io-p2p-server值得吗

客户端代码

    import P2P from 'socket.io-p2p'
    import io from 'socket.io-client'

    const socket = io()
    const p2pSocket = new P2P(socket, null, function () {
      console.log("my id is: " + p2pSocket.peerId)
    })


    p2pSocket.on('peer-msg', function (data) {
      console.log(data)
    })
    var http = require('http')
    var httpServer = http.createServer(requestHandler)
    var fs = require('fs')
    var io = require('socket.io')(httpServer)
    var p2pServerModule = require('socket.io-p2p-server')
    var p2p = p2pServerModule.Server
    var connectedUsers = p2pServerModule.clients
    io.use(p2p)

    httpServer.listen(8000, 'localhost');

    function serveUpFile(req, res, path) {
      fs.readFile(path.toString(), function (err, data) {
        if (err) {
          res.writeHead(500);
          return res.end('Error loading index.html');
        }

        res.writeHead(200)
        res.end(data)
      })
    }

    function requestHandler (req, res) {
      if (req.url === '/static/bundle.js') {
        serveUpFile(req, res, './static/bundle.js')
      } else {
        serveUpFile(req, res, './index.html')
      }
    }


    io.on('connection', function (client) {
      console.log('client connected to the server')

      client.on('peer-msg', function (data) {
        console.log('Message from peer %s', data)
      })

      client.on('disconnect', function () {
        console.log('client disconnected from the server')
      })
    })
服务器端代码

    import P2P from 'socket.io-p2p'
    import io from 'socket.io-client'

    const socket = io()
    const p2pSocket = new P2P(socket, null, function () {
      console.log("my id is: " + p2pSocket.peerId)
    })


    p2pSocket.on('peer-msg', function (data) {
      console.log(data)
    })
    var http = require('http')
    var httpServer = http.createServer(requestHandler)
    var fs = require('fs')
    var io = require('socket.io')(httpServer)
    var p2pServerModule = require('socket.io-p2p-server')
    var p2p = p2pServerModule.Server
    var connectedUsers = p2pServerModule.clients
    io.use(p2p)

    httpServer.listen(8000, 'localhost');

    function serveUpFile(req, res, path) {
      fs.readFile(path.toString(), function (err, data) {
        if (err) {
          res.writeHead(500);
          return res.end('Error loading index.html');
        }

        res.writeHead(200)
        res.end(data)
      })
    }

    function requestHandler (req, res) {
      if (req.url === '/static/bundle.js') {
        serveUpFile(req, res, './static/bundle.js')
      } else {
        serveUpFile(req, res, './index.html')
      }
    }


    io.on('connection', function (client) {
      console.log('client connected to the server')

      client.on('peer-msg', function (data) {
        console.log('Message from peer %s', data)
      })

      client.on('disconnect', function () {
        console.log('client disconnected from the server')
      })
    })

socket.io-p2p-server无法按预期使用socket.io 1.x

更改socket.io-p2p-server/index.js: 本部分:

if (typeof room === 'object') {
  var connectedClients = socket.adapter.rooms[room.name]
} else {
  var connectedClients = clients
}
为此:

if (typeof room === 'object' && ('name' in room) && (room.name in socket.adapter.rooms) ) {
    var connectedClients = {}
    for (var id in socket.adapter.rooms[room.name].sockets) { 
      connectedClients[id] = clients[id];
    }
} else {
    var connectedClients = clients;
}
这个解决方案对我有效