使用GCDAsyncSocket完成网口通信助手客户端开发

在试用期学习网口通信,并写了一个简易的网口通信程序,实现基础的与服务端收发通信,关于GCDAsyncSocket网口通信,在我的上一篇帖子里有具体介绍。

首先需要在项目中引入GCDAsyncSocket的类,这个在网上能找到,就不赘述了。

接下来介绍我的开发流程,希望能给和我一样刚刚接触这个行业的小伙伴一些思路启发。

开发工具:xcode.        开发语言:objective-c。       时间:2023/10/11

1.初始化socket

        @property (strong, nonatomic) GCDAsyncSocket *clientSocket;

        使用GCDAsyncSocket类定义你的对象。

//初始化socket,并在主线程中运行
    //_clientSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
    //_clientSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)]; 这种是在子线程中运行

        这里是两个初始化socket的操作方法,选一个就好。

2.连接服务端

初始化好了之后就可以开始连接服务端了

        

    //获取到我程序控件上的ip和port
    NSInteger Port = [self.portmesg integerValue];
    NSString *Ip =[self.ipmesg stringValue];
    
    //开始连接
    NSError *error = nil;
    [_clientSocket connectToHost:Ip onPort:Port error:&error];//连接服务端
    if(error) {
        NSLog(@"  ####error:%@  ####", error);
        dispatch_async(dispatch_get_main_queue(), ^{[self.logmesg setStringValue:@" connect to service is failed"];});
    }
   

3.发送消息

连接好之后,就可以尝试发送消息了

        

NSString *sendstr = [_sendmesg stringValue];//获取到文本框中输入的发送指令
    if(sendstr == nil || sendstr.length == 0)
    {
        NSLog(@"####send message is null####");
        dispatch_async(dispatch_get_main_queue(), ^{[self.logmesg setStringValue:@" error: check u send message"];});
        return;
    }
    else
    {
        NSLog(@"------this is the send message:------");
        NSLog(@"%@",sendstr);
        //NSData *sendData;
        [self.clientSocket writeData:[sendstr dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];//发送消息
        dispatch_async(dispatch_get_main_queue(), ^{[self.logmesg setStringValue:@"sendmesg to service"];});
    }

4.读取消息

[self.clientSocket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:10 maxLength:50000 tag:0];

        在GCDAsyncSocket可以用readDataToData读取服务端消息

在我的代码中直接在回调函数中读取,并显示到我的程序上。因为在代理方法中会自己去执行回调函数,所以不需要你去调用,刚开始我还在疑惑怎么调用读取消息的回调函数,确保可以将我读取的消息显示出来

//调用读方法后的回调
- (void)socket:(GCDAsyncSocket*)sock didReadData:(NSData*)data withTag:(long)tag
{
   if(sock==self.clientSocket)
   {
       //这句话不需要,可能会导致客户端读取一次之后就不再读取服务端传来的消息了
//        [self.clientSocket readDataToData:[GCDAsyncSocket LFData] withTimeout:-1 tag:1];
        //接收到的消息
        NSString *messageStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"%@", messageStr);
       
        //[self.ReadArr addObject:messageStr];
        dispatch_async(dispatch_get_main_queue(), ^{
           
           [self.resvmesg setStringValue:messageStr];
           
        });
        [self.ReadStr appendString:messageStr];
    }
    //加上这句话,让他可以一直读取,否则只能读取服务端传来的第一次消息
     [sock readDataWithTimeout:-1 tag:0]; //自动读取
}

5.断开连接

        最后是断开链接

[self.clientSocket disconnect];

6.结尾

        这些函数都有自己的回调函数,你可以在回调函数里执行一些操作,比如,连接不成功,可以设置重连。这些回调函数会自己执行,不需要你再去调用。

        这就是我的一些思路,希望可以帮到和我一样刚入行的小伙伴,时间匆忙,草草总结了一下,后续会写的更加详细完整一点供大家参考

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值