objective-c - 使用 GCDAyncSocket 将任意信息与套接字相关联

标签 objective-c tcp gcdasyncsocket

我已经使用 GCDAsyncSocket 创建了一个简单的客户端服务器应用程序。

主机通过 bonjour 广播其服务,客户端连接到它,然后每个客户端向主机发送特定信息,在主机完成请求后,它现在应该能够将每个请求发送到其对应的客户端。

enter image description here

这里,当客户端在收到完成的请求并再次连接之前断开连接(可能重新启动 WiFi)时,其连接的主机和端口可能会发生变化。

所以对于反硝化客户端,我想将已连接客户端的列表存储在字典中

key : vendorID (specific to each client and can't change)
value :  connected host and port (gcdAsyncSocket instance) 

如何使用套接字发送任意信息(vendorID)?

GCDAsyncSocket 好像有一个名为 UserData 的属性,我在客户端用 vendorID 设置了它 但在主机中它是 NULL。

客户:

- (BOOL)connectWithService:(NSNetService *)service {
BOOL _isConnected = NO;

// Copy Service Addresses
NSArray *addresses = [[service addresses] mutableCopy];

if (!self.socket || ![self.socket isConnected]) {
    // Initialize Socket


       self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

        //adding deviceID to sockect to identify connected clients in the host

        self.socket.userData = @"vendorID2308746238764021";

        // Connect
        while (!_isConnected && [addresses count]) {
            NSData *address = [addresses objectAtIndex:0];
            NSError *error = nil;

            if ([self.socket connectToAddress:address error:&error]) {
                _isConnected = true;
            }

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

    } else {
        _isConnected = [self.socket isConnected];
    }

    return _isConnected;
}

主持人:

- (void)socket:(GCDAsyncSocket *)socket didAcceptNewSocket:(GCDAsyncSocket *)newSocket {
    NSLog(@"Accepted New Socket from %@:%hu", [newSocket connectedHost], [newSocket connectedPort]);

    //both userData is null!
    NSLog(@"%@",newSocket.userData);
    NSLog(@"%@",socket.userData);
    //adding new socket to the list of connected clients
    //using ip and port of the scoket as key
    [self.clients setObject:newSocket forKey:[NSString stringWithFormat:@"%@-%d", [newSocket connectedHost], [newSocket connectedPort]]];
    // Notify Delegate
    [self.delegate tcpHost:self didHostClientOnSocket:newSocket];
}

有谁知道我应该如何解决这种客户端-主机信息交换?

最佳答案

客户端:在客户端连接到服务器时,在我的 TCPClient 类中,我发送的第一个数据包是身份数据包:

//server can identify  device
- (void)sendIdentity
{
    NSData *identifcationData = [[UIDevice deviceID] dataUsingEncoding:NSUTF8StringEncoding];
    HAPacket *packet = [[HAPacket alloc] initWithData:identifcationData type:HAPacketTypeIdentity action:HAPacketActionUnknown];
    [self sendPacket:packet];
}

服务器:获取此数据包并识别客户端 在 TCPHost 中:客户端连接后,我将其存储在一个临时数组中。 在 socket:didReadData 我检查:

if (tag == TAG_BODY) {

    //first packet is always for identifaction. if client has not identified, its id is empty
    Client *unknownClient = [[self.temp linq_where:^BOOL(Client *client)
                              {
                                  return client.ID == nil || [client.ID isEqualToString: @""];
                              }] linq_firstOrNil];

    if (unknownClient && (unknownClient.ID == nil || [unknownClient.ID  isEqualToString: @""])) {
        NSLog(@"identifying client...");
        [self identifyClient:unknownClient withData:data];
    }
    else
{
// parse the packet as usual
}

关于objective-c - 使用 GCDAyncSocket 将任意信息与套接字相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25572932/

相关文章:

iphone - Objective-C:每次上下滚动时,UITableView 单元格都会被覆盖

objective-c - 对于对象继承的集合中的对象

docker - 通过域自动访问 Docker 容器并在 Windows 上支持 SSL/HTTPS

java - 是否可以在客户端和服务器端关闭 Java 套接字?

ios - 无法使用 GCDAsyncSocket 从服务器读取数据

ios - 以模式加载新 View 并保持 gcd 异步代码运行

ios - 警告 : Implicit conversion loses Integer precision in xcode 6

ios - NSLocalizedString,参数使用从右到左的语言(例如波斯语)

c++ - 是否可以阻止共享/动态库的网络访问?