多点连接

Multipeer connectivity

我将其用作服务器-客户端对等方式,因此只有一台设备上的代码决定其他设备的结果。

所以,我不是很了解它..但我正在为连接的玩家设置一个大厅。

客户端使用浏览器,然后当建立连接时,完成按钮会将它们推送到 LobbyViewController

现在,匹配设置和详细信息在 HostViewController 中设置,然后转移到 lobbyViewController 因此它们设置为 host

然后,如果客户端的say _matchName等于nil,那么它会向host发送一条消息,host可以读取这条消息。然后在 return 发回 _matchName.

但是,我需要在整个应用程序的其余部分发送大量消息。我应该说发送和接收。而且我不想要很多

if (_matchName == nil) {
    NSData *dataToSend = [@"getMatchName" dataUsingEncoding:NSUTF8StringEncoding];
    NSArray *allPeers = _appDelegate.mcManager.session.connectedPeers;
    NSError *error;

    [_appDelegate.mcManager.session sendData:dataToSend
                                     toPeers:allPeers
                                    withMode:MCSessionSendDataReliable
                                       error:&error];

    if (error) {
        NSLog(@"%@", [error localizedDescription]);
    }
}

-(void)didReceiveDataWithNotification:(NSNotification *)notification {
    MCPeerID *peerID = [[notification userInfo] objectForKey:@"peerID"];
    NSString *peerDisplayName = peerID.displayName;

    NSData *receivedData = [[notification userInfo] objectForKey:@"data"];
    NSString *receivedText = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];

    NSLog(@"From: %@ message: %@", peerDisplayName, receivedText);
}

对于第一个 if,我不想为了一条消息而费力,也不想以相同的形式创建回复。然后阅读响应消息并更新 _matchName 属性.. 看起来像一大堆代码,用于简单更新 matchName..

如何,或者有没有办法创建一个方法来使这更简单?

您可能需要两种抽象形式

  1. 单例模型 class - 称它为 MPManager 或其他名称 抽象多点功能 - 单例管理 send/receive browse/advertise 部分多点。
  2. 一个服务器对等控制器(同样可能是另一个单例)可以 管理服务器发出的消息(来自视图控制器)并跟踪来自各个对等方的响应返回给发送消息的委托人 (viewController)。

无论底层传输机制如何,您都需要这些

/*! 
@class BWCMessageController
@abstract
The MessageController is a singleton object that is responsible for sending /
receiving BWCMessage objects between devices.  It interfaces with the SessionController
which is responsible for the actual sending/receiving, and acts as the delegate for
received data.

Once data is received, the controller reconstructs the BWCMessage and extracts the payload
which is tehn forwarded to the handler object which is instantiated to further process the
message
*/

#import <Foundation/Foundation.h>
#import "BWCMessage.h"
#import "BWCSessionController.h"
#import "BWCTransactionHandlerOrder.h"

@interface BWCMessageController : NSObject <BWCSessionControllerDataDelegate>

+ (BWCMessageController *)messageController;

- (BOOL)sendMsg:(MessageID)msgID withData:(NSData *)data fromHandler:(BWCTransactionHandler *)handler toDevice:(NSUInteger)devID withACK:(BOOL)fWithACK;


@end