首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCDAsyncSocket多个连接?

GCDAsyncSocket多个连接?
EN

Stack Overflow用户
提问于 2014-08-13 22:45:52
回答 1查看 2.4K关注 0票数 3

我已经在使用GCDAsyncSocket连接两个设备。一个广播自己和接受连接,另一个监听和请求连接。如果我尝试将另一个设备连接到仍在广播的主机,那么它将得到连接终止,而第一个设备仍然连接!

如何重构代码以接受多个连接?我遗漏了什么?请帮帮忙,我正努力想办法解决这个问题!这是我的密码:

代码语言:javascript
复制
- (void)startBroadcast {
    // Initialize GCDAsyncSocket
    self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

    // Start Listening for Incoming Connections
    NSError *error = nil;
    if ([self.socket acceptOnPort:0 error:&error]) {
        // Initialize Service
        self.service = [[NSNetService alloc] initWithDomain:@"local." type:@"_iQuest._tcp." name:@"" port:[self.socket localPort]];

        // Configure Service
        [self.service setDelegate:self];

        // Publish Service
        [self.service publish];

    } else {
        NSLog(@"Unable to create socket. Error %@ with user info %@.", error, [error userInfo]);
    }
}

代码语言:javascript
复制
   - (void)socket:(GCDAsyncSocket *)socket didAcceptNewSocket:(GCDAsyncSocket *)newSocket {
        NSLog(@"Accepted New Socket from %@:%hu", [newSocket connectedHost], [newSocket connectedPort]);
        NSString *alertmsg = [NSString stringWithFormat:@"Client is now connected to %@.", self.service.name];
        UIAlertView *Connection = [[UIAlertView alloc] initWithTitle:@"Connection Success!" message:alertmsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
        [Connection show];

        [self setSocket:newSocket];
        [connectedSockets addObject:newSocket];

            // Read Data from Socket
        [newSocket readDataToLength:sizeof(uint64_t) withTimeout:-1.0 tag:0];
    }

    - (void)socket:(GCDAsyncSocket *)socket didReadData:(NSData *)data withTag:(long)tag {
        if (tag == 0) {
            uint64_t bodyLength = [self parseHeader:data];
            [socket readDataToLength:bodyLength withTimeout:-1.0 tag:1];

        } else if (tag == 1) {
            [self parseBody:data];
            [socket readDataToLength:sizeof(uint64_t) withTimeout:-1.0 tag:0];
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2014-08-15 03:02:58

好吧,我想出来了!我希望这能对未来的人有所帮助:

代码语言:javascript
复制
- (void)startBroadcast {
    //socketQueue = dispatch_queue_create("socketQueue", NULL);

    self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
    // Setup an array to store all accepted client connections
    connectedSockets = [[NSMutableArray alloc] initWithCapacity:20];


    // Start Listening for Incoming Connections
    NSError *error = nil;
    if ([self.socket acceptOnPort:0 error:&error]) {
        // Initialize Service
        self.service = [[NSNetService alloc] initWithDomain:@"local." type:@"_iQuest._tcp." name:@"" port:[self.socket localPort]];

        // Configure Service
        [self.service setDelegate:self];

        // Publish Service
        [self.service publish];

    } else {
        NSLog(@"Unable to create socket. Error %@ with user info %@.", error, [error userInfo]);
    }
}

代码语言:javascript
复制
- (void)socket:(GCDAsyncSocket *)socket didAcceptNewSocket:(GCDAsyncSocket *)newSocket {
    NSLog(@"Accepted New Socket from %@:%hu", [newSocket connectedHost], [newSocket connectedPort]);
    NSString *alertmsg = [NSString stringWithFormat:@"Client is now connected to %@.", self.service.name];
    UIAlertView *Connection = [[UIAlertView alloc] initWithTitle:@"Connection Success!" message:alertmsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
    [Connection show];

    @synchronized(connectedSockets)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
            [connectedSockets addObject:newSocket];
        });
    }


    // Read Data from Socket
    [newSocket readDataToLength:sizeof(uint64_t) withTimeout:-1.0 tag:0];
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25297436

复制
相关文章

相似问题

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