如何正确拆除多人连接会话?

Posted

技术标签:

【中文标题】如何正确拆除多人连接会话?【英文标题】:How to correctly tear down multipeer connectivity session? 【发布时间】:2014-04-24 18:58:09 【问题描述】:

我认为多人连接有时会在重新连接时出现问题。每当我尝试重新连接到刚刚断开连接的客户端时,它都无法向客户端发送新的邀请。我不确定与已连接的对等方断开连接的正确方法是什么,以及如果应用程序由于处于挂起模式而被终止,如何与所有连接的对等方断开连接。谁能帮我解决这个问题?

例如:

如果我连接了 A 和 B,并且 B 超出了范围,则会话由于无法访问而自动断开,并且

- (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state 
    case MCSessionStateNotConnected:

被调用,我相信此时双方都知道他们已经彼此断开连接,但是,当 B 走回去并想要重新连接时——邀请已发送但另一方从未收到。究竟发生了什么?我是否必须手动断开会话以防止这种情况发生?

【问题讨论】:

Multipeer Connectivity Framework - Lost Peer stays in Session的可能重复 【参考方案1】:

每当我断开连接并想重新连接时,我都会在浏览器端重置 PeerID 和会话:

    // reset my PeerID.  Sometimes when trying to reconnect to the same Advertiser with the same PeerID nothing happens
    mcPeerID = [[MCPeerID alloc] initWithDisplayName:[UIDevice currentDevice].name];
    mcSession = [[MCSession alloc] initWithPeer:mcPeerID];
    mcSession.delegate = self;

    mcNearbyServiceBrowser = [[MCNearbyServiceBrowser alloc] initWithPeer:mcPeerID serviceType:kMCServiceType];
    mcNearbyServiceBrowser.delegate = self;
    [mcNearbyServiceBrowser startBrowsingForPeers];

在广告商方面,connectedPeers 计数在断开连接时正确递减,因此作为 * 不同 * 浏览器重新连接似乎不会产生负面影响(也许这不是正确的编码,但它有效)。使用新的 PeerID,我可以毫无问题地重新连接。我同时重置了 Session 以使它们保持同步(即,我不想要一个从旧 PeerID 初始化的 Session)。

【讨论】:

以上是关于如何正确拆除多人连接会话?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Parse (swift) 邀请用户加入多人游戏会话

切换 VC 后多点连接会话断开

win7系统遇到远程桌面超出了最大允许连接数的问题如何解决

在获取访问令牌以代表用户执行 API 请求后,保持用户会话和令牌连接的“正确”方式是啥?

Java Hibernate 会话没有被正确终止

强制多人连接关闭