CocoaAsyncSocket使用

//GCDAsyncSocketDelegate执行代理对象

#import <Foundation/Foundation.h>
#import "CocoaAsyncSocket.h"
#import "Public.h"

typedef void(^DidReadData)(NSDictionary* didReadData);
/**
 *  GCDAsyncSocketDelegate执行代理对象
 */
@interface NSObjectGCDAsyncSocket : NSObject<GCDAsyncSocketDelegate>
/**
 *  接收到数据的处理
 */
@PRoperty(nonatomic,copy)DidReadData didReadData;
/**
 *  发送的数据  如果添加新键值则需要先开辟内存
 */
@property(nonatomic,retain)NSMutableDictionary* writeData;
/**
 *  发送链接请求
 */
-(BOOL)startConnect;
/**
 *  单例
 */
+(NSObjectGCDAsyncSocket*)defaultSocket;

@end

.m文件

//
//  NSObjectGCDAsyncSocket.m
//  attendance
//
//  Created by dgc on 15/7/7.
//  Copyright (c) 2015年 dgc. All rights reserved.
//

#import "NSObjectGCDAsyncSocket.h"

@implementation NSObjectGCDAsyncSocket
{
    GCDAsyncSocket* socket;
}
/**
 *  单例
 *
 *  @return
 */
+(NSObjectGCDAsyncSocket *)defaultSocket
{
    //socket只会实例化一次
    static NSObjectGCDAsyncSocket* socket=nil;
    //保证线程安全,defaultSocket只执行一次
    static dispatch_once_t once;
    dispatch_once(&once, ^
    {
        socket=[[NSObjectGCDAsyncSocket alloc] init];
    });
    return socket;
}

/**
 *  初始化
 *
 *
 *  @return self
 */
-(instancetype)init
{
    self=[super init];
    if (self)
    {
        socket=[[GCDAsyncSocket alloc] initWithDelegate:self
                                          delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
    }
    return self;
}
/**
 *  发送链接请求
 */
-(BOOL)startConnect
{
    //先确定断开连接再开始链接
    if (socket.isConnected)
    {
        NSLog(@"主动断开");
        [socket disconnect];
        
    }
    NSError* error;
    BOOL  isSuccess= [socket connectToHost:SocketHost
                                    onPort:SocketPort
                                     error:&error];
    if (error)
    {
        NSLog(@"error.localizedDescription:%@",error.localizedDescription);
    }

    return isSuccess;
    
}
#pragma mark - GCDAsyncSocketDelegate
/**
 *  链接成功
 *
 *  @param sock sock实例
 *  @param host IP
 *  @param port 端口
 */
-(void)socket:(GCDAsyncSocket *)sock
didConnectToHost:(NSString *)host
         port:(uint16_t)port
{
    
//    NSLog(@"%s",__FUNCTION__);
//    NSLog(sock.isConnected?@"YES":@"NO");
//    if (sock.isConnected)
//    {

 //nsstring上传需要加"\n"分隔符方可上传成功
/*
 [sock writeData:[@"ABCABCABCABCABCABC\n" dataUsingEncoding:NSUTF8StringEncoding]
 withTimeout:-1
 tag:0];
 */

/*
 NSDictionary* nsDictionaryUser=@{@"gpsinfo":@"Gpsinfo",
 @"pswd":self.passWord,
 @"gpstype":@(2015),
 @"name":self.name,
 };

        NSDictionary* agrement=@{@"vertion":@(1),
                                 @"type1":@(2),
                                 @"type2":@(0),
                                 @"type3":@(0)};
*/
        if ([NSJSONSerialization isValidJSONObject:self.writeData])
        {
//            NSLog(@"isValidJSONObject");
            NSError* error;
            //先转nsdata再转nsstring是为了保证nsdictionary格式不变
            NSData *nsDataUser= [NSJSONSerialization dataWithJSONObject:self.writeData
                                                                options:NSJSONWritingPrettyPrinted
                                                                  error:&error];
            NSString* json=[[NSString alloc] initWithData:nsDataUser
                                                 encoding:NSUTF8StringEncoding];
//            NSLog(@"nsDictionaryUser:%@",json);

            
            json=[json stringByReplacingOccurrencesOfString:@"\n"
                                                 withString:@""];
            json=[json stringByReplacingOccurrencesOfString:@" "
                                                 withString:@""];
            json=[json stringByAppendingString:@"\n"];
//            NSLog(@"json:%@",json);
            
            [sock writeData:[json dataUsingEncoding:NSUTF8StringEncoding]
                withTimeout:-1
                        tag:0];
            
            //保持读取的长连接
            [sock readDataWithTimeout:-1
                                  tag:0];

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


//    }
 
}
/**
 *  发送数据成功
 *
 *  @param sock  sock实例
 *  @param tag  标记sock
 */
-(void)socket:(GCDAsyncSocket *)sock
didWriteDataWithTag:(long)tag
{
//    NSLog(@"didWriteDataWithTag");
}
/**
 *  已经获取到数据
 *
 *  @param sock sock实例
 *  @param data 获取到的数据
 *  @param tag  标记sock
 */
-(void)socket:(GCDAsyncSocket *)sock
  didReadData:(NSData *)data
      withTag:(long)tag
{
    
//    NSLog(@"%s",__FUNCTION__);
    NSError* error=nil;
    NSDictionary* json=(NSDictionary*)[NSJSONSerialization JSONObjectWithData:data
                                                       options:NSJSONReadingAllowFragments
                                                         error:&error];
    
    NSLog([NSJSONSerialization isValidJSONObject:json]?@"is ValidJSONObject":@"is't ValidJSONObject");
    if (error)
    {
        NSLog(@"socketError1:%@",[error localizedDescription]);
         NSLog(@"socketError2:%@",[error localizedFailureReason]);
    }
    self.didReadData(json);
    [sock disconnect];
    
}

/**
 *  链接出错
 *
 *  @param sock sock实例
 *  @param err  错误参数
 */
-(void)socketDidDisconnect:(GCDAsyncSocket *)sock
                 withError:(NSError *)err
{
//    NSLog(@"%s",__FUNCTION__);
    
    if (err)
    {
        NSLog(@"socketDidDisconnect:%@",[err localizedDescription]);
        NSLog(@"socketDidDisconnect:%@",[err localizedFailureReason]);

    }
//    self.didReadData(nil);
}



@end

使用

创建对象
    socket=[NSObjectGCDAsyncSocket defaultSocket];
填写发送的数据
socket.writeData=[NSMutableDictionary dictionaryWithDictionary:dictionary];
处理收到的数据
        socket.didReadData=^(NSDictionary* didReadData){.......}
开始链接
[socket startConnect];

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 iOS 上使用 Objective-C 接收组播包也需要使用 MulticastSocket,以下是一个示例代码: 1. 创建 MulticastSocket 对象 ```objective-c NSError *error = nil; MulticastSocket *multicastSocket = [[MulticastSocket alloc] initWithPort:12345 group:@"224.0.0.1" error:&error]; if (error) { NSLog(@"Error creating multicast socket: %@", error.localizedDescription); return; } ``` 2. 接收数据 ```objective-c ssize_t bufferSize = 4096; uint8_t buffer[bufferSize]; while (true) { ssize_t count = [multicastSocket receive:buffer size:bufferSize]; NSString *message = [[NSString alloc] initWithBytes:buffer length:count encoding:NSUTF8StringEncoding]; NSLog(@"%@", message); } ``` 在上述示例代码中,我们首先创建了一个 MulticastSocket 对象,指定了接收组播包的端口号和组播地址。接着,我们通过一个无限循环来接收数据,每次接收一个固定大小的数据包,并将其转换为字符串后打印出来。如果没有数据可接收,程序会一直阻塞在 receive 方法调用处,直到有数据到来为止。 和 Swift 版本类似,为了能够接收组播包,我们还需要在应用的 Info.plist 文件中添加一个 NSAllowsArbitraryLoadsInWebContent 键,并将其值设置为 YES。否则,应用将无法接收到组播包。 ### 回答2: 在iOS的Objective-C中,可以通过使用Socket来接收组播包。要使用Socket来实现接收组播包的功能,需要进行以下步骤: 1. 创建Socket:首先,需要创建一个Socket对象来进行接收组播包的操作。可以使用CocoaAsyncSocket库来实现Socket的创建。 2. 设置Socket的属性:在创建Socket对象后,需要设置一些属性来指定接收组播包的相关信息。设置Socket的属性包括设置socket类型、设置端口号以及设置IP地址等。 3. 加入组播组:接下来,需要加入指定的组播组。可以通过设置Socket的多播组成员属性来加入组播组。可以指定一个组播IP地址和端口号。 4. 接收组播包:在设置好Socket的属性和加入组播组后,可以调用Socket的接收方法来接收组播包。可以使用CocoaAsyncSocket库的接收函数来实现接收操作。 5. 处理接收的数据:当接收到组播包后,需要对接收的数据进行处理。可以通过解析数据包的内容来获取所需的信息。可以使用NSData等类来对数据进行处理。 需要注意的是,接收组播包时,需要保证运行的设备和发送组播包的设备在同一组播组中,并且需要在同一个局域网内。 以上就是在iOS的Objective-C中使用Socket接收组播包的基本流程。当然,具体的实现过程还需要根据具体情况进行调整和修改。希望对你有所帮助! ### 回答3: 在iOS中,我们可以使用Objective-C来接收组播包。组播(Multicast)是一种一对多的网络通信方式,发送方可以将数据同时发送给多个接收方。 首先,我们需要创建一个UDP Socket来接收组播包。可以使用CocoaAsyncSocket库来操作Socket。在使用之前,需要先添加CocoaAsyncSocket到我们的项目中。 创建Socket对象: GCDAsyncUdpSocket *udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; 设置组播地址和端口: NSString *multicastAddress = @"组播地址"; uint16_t multicastPort = 8888; NSError *error = nil; [udpSocket joinMulticastGroup:multicastAddress error:&error]; [udpSocket bindToPort:multicastPort error:&error]; 开始接收组播包: [udpSocket beginReceiving:&error]; 实现代理方法,用于接收数据: - (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(nullable id)filterContext{ NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"接收到组播包:%@", msg); } 至此,我们的iOS应用就可以接收组播包了。需要注意的是,在接收组播包之前,需要先加入组播地址,并且要保证发送方和接收方在同一个组播地址和端口上。 希望以上内容能够对您有所帮助。如有疑问,可以继续追问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值