首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >插座断开,套接字重新连接

插座断开,套接字重新连接
EN

Stack Overflow用户
提问于 2018-09-30 15:37:30
回答 1查看 841关注 0票数 0

我已经找到这个问题好几次了,但我不能让它起作用.

该系统是一个多人在线游戏,我需要断开客户端的连接,并在与player respawns相同的功能范围内重新连接它,下面是我正在做的工作:

客户端:

我正在与以下方面建立初步联系:

代码语言:javascript
复制
var socket = io();

在某种程度上,我正在检查循环中的连接:

代码语言:javascript
复制
console.log(socket);

返回:

代码语言:javascript
复制
n {io: n, nsp: "/", json: n, ids: 812, acks: {…}, …}
  acks: {840: ƒ, 841: ƒ, 842: ƒ, 843: ƒ, 844: ƒ, 845: ƒ, 846: ƒ, 847: ƒ, 848: ƒ, 849: ƒ, 850: ƒ, 851: ƒ}
  connected: true
  disconnected: false
  id: "ucS-fRqvhc_3OlYZAAAC"
  ids: 852
  io: n {nsps: {…}, subs: Array(6), opts: {…}, _reconnection: true, _reconnectionAttempts: Infinity, …}
  json: n {io: n, nsp: "/", json: n, ids: 852, acks: {…}, …}
  nsp: "/"
  receiveBuffer: []
  sendBuffer: []
  subs: (3) [{…}, {…}, {…}]
  _callbacks: {$connecting: Array(1), $connect: Array(1), $update: Array(1), $dialogo-servidor-usuarios: Array(1), $simon-says: Array(1)}
  __proto__: Object

最后,我在一个方法中断开连接,如下所示:

代码语言:javascript
复制
socket.disconnect();

服务器

代码语言:javascript
复制
socket.on('disconnect', function() {
      //socket.reconnect();
      //buscamos el nombre del usuario por el id del sock
      var player = game.all_player_info(socket.id);
      if (player != null) {
          //revisamos
          console.log(player);
          //armamos el pedido
          req = API_URI;
          req += '?model=user/close';
          req += '&username=';
          req += player.name;
          //no usamos el password del usuario, sino el de la aplicación.
          req += '&password='
          req += player.pass;

          //lo marcamos offline de nuevo.
          request(req, { json: true }, (err, res, body) => {
          //en caso de error de comunicación
          if (err) { return console.log(err); }
          //feedback de API
          console.log(body);
          });

          //hacemos el player quede en campo 10 segundos de espera
          setTimeout( function() {
              //cuando pasen 5'
              console.log(req);
              //removemos la unidad
              game.removePlayer(socket.id);
          }, 8000 );
      }
  });

我试过使用"socket.socket.reconnect()",也尝试使用"socket.reconnect()“.还是不能让它起作用。可能只是又累了一次,但我不知道我在哪里做错了什么。

到目前为止,服务器和客户机都运行在127.0.0.1:443上。

console.log(socket.io),在客户端返回:

代码语言:javascript
复制
io: n
autoConnect: true
backoff: r {ms: 1000, max: 5000, factor: 2, jitter: 0.5, attempts: 0}
connecting: [n]
decoder: s {reconstructor: null, _callbacks: {…}}
encoder: n {}
encoding: false
engine: n {secure: true, agent: false, hostname: "127.0.0.1", port: "443", query: {…}, …}
lastPing: Sun Sep 30 2018 12:35:16 GMT-0300 (hora estándar de Argentina) {}
nsps: {/: n}
opts: {path: "/socket.io", hostname: "127.0.0.1", secure: true, port: "443"}
packetBuffer: []
readyState: "open"
skipReconnect: false
subs: (6) [{…}, {…}, {…}, {…}, {…}, {…}]
uri: "https://127.0.0.1"
_callbacks: {$open: Array(1), $packet: Array(1), $close: Array(1)}
_randomizationFactor: 0.5
_reconnection: true
_reconnectionAttempts: Infinity
_reconnectionDelay: 1000
_reconnectionDelayMax: 5000
_timeout: 20000

欢迎任何建议!谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-01 02:29:12

connectdisconnect的服务器代码移动到单独的函数中可能要容易得多。在connectdisconnect上调用这些函数。到目前为止,仍然有相同的逻辑,只是不同的代码结构。

然后,创建一个socket.io消息respawn,在其中调用两个函数(第一个函数关闭用户,第二个函数重新生成它们)。这将使您可以在不实际重新连接socket.io连接的情况下进行重新连接,并避免现在重新连接socket.io连接时遇到的问题。

注意,您可能还应该修改您的disconnect代码,以便它返回一个承诺,该承诺将在完成时解析,以便只有在断开连接逻辑完成后才能调用连接逻辑。

然后,客户所要做的就是:

代码语言:javascript
复制
socket.emit('respawn');
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52579400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档