WIFI通讯客户端搭建

  • 转载请注明出处:坤小的博客http://blog.csdn.net/u013263917/article/details/77190249
    • 客户的职责主要做三件事,一:连接服务端 二:接收来自服务端的数据 三:给服务端发送数据
  • [1.0-准备工作]

  • [1.1-客户端连接服务端]
  • [1.2-客户端接收和发送数据到服务端]
  • [1.3-完整代码及示例演示]

1.0-准备工作

  • 笔者搭建了一个简单的界面,主要功能就是客户端连接服务端监听的网络,连接成功之后可以给服务端发送数据

1.1-客户端连接服务端

  • 1.创建客户端Socket
  • 2.客户端连接服务端socket
    • socket本质就是ip地址加端口号,所以客户端连接的也是ip地址加端口号,只不过这一个ip地址是服务端在局域网中的ip地址(上一小节获取),端口号也是服务端所监听的端口号(如果与服务端的ip地址和监听的端口号不一致,客户端是无法连接的,因为这一个i地址的电脑的端口号没有被监听)

//客户端开始连接
- (IBAction)wifiButtonClik:(UIButton *)sender {//1.创建客户端socket//在socket通讯中,无论是客户端还是服务端,任何对象都是socket,类似于万物皆NSObjectif (!self.clientSocket) {self.clientSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];}NSLog(@"%@",self.clientSocket.localHost);//2.连接服务端//注意:此处有两个重点    1.这里的ip地址一定要是同一个局域网服务端的ip地址,端口号也要与服务端连接的端口号一致   2.实际开发中,一般服务端的ip地址和所监听的端口号都会在wifit通信协议中注明,这里只是笔者为了掩饰,所以随便写了一个端口号1234,而这里的ip地址也是笔者为了掩饰给mac电脑设置了一个固定ip地址[self.clientSocket connectToHost:@"192.168.0.102" onPort:1234 error:nil];}

1.2-客户端接收和发送数据到服务端

  • ***1.客户端连接成功之后,开始读取服务端的数据

  • 2.客户端将接收到服务端的数据添加在数组,用于显示(实际开发中可能需要处理其他逻辑,具体看需求)

  • 3.客户端发送数据到服务端(实际开发中数据格式由硬件工程师来定义)


#pragma mark- GCDAsyncSocketDelegate//客户端连接服务端成功
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
{//1.将开始连接按钮变为已连接[self.clientButton setTitle:@"连接成功" forState:UIControlStateNormal];//2.发送数据按钮开启交互self.senMsgButton.enabled = YES;//3.客户端开始读取服务端的数据[self.clientSocket readDataWithTimeout:-1 tag:0];
}//客户端接收数据成功
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];NSLog(@"客户端接发送数据:%@",str);//0.添加到数据源[self.tableArr addObject:data];//1.刷新界面[self.tableView reloadData];//2.继续读取数据(否则只能读取一次)[sock readDataWithTimeout:-1 tag:0];}//客户端发送数据成功
-(void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag
{NSLog(@"客户端发送数据");//刷新数据[self.tableView reloadData];
}#pragma mark -UITextFieldDelegate  发送数据- (BOOL)textFieldShouldReturn:(UITextField *)textField
{[textField resignFirstResponder];//1.发送数据  具体的数据格式会由硬件工程师定义,示例这里使用冒号:将我的手机名称和消息分开NSString *str = [NSString stringWithFormat:@"%@:%@",[UIDevice currentDevice].name,textField.text];//2.发送数据 第一个参数:二进制数据  第二个参数:超时等待  -1为永久等待  tag:消息标签 没啥用[self.clientSocket writeData:[str dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:1];//3添加到数组用于显示[self.tableArr addObject:[str dataUsingEncoding:NSUTF8StringEncoding]];textField.text = nil;return YES;
}

1.3-完整代码及示例演示


#import "ClientViewController.h"#import "GCDAsyncSocket.h"
#import "WIFITools.h"@interface ClientViewController ()<GCDAsyncSocketDelegate,UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UILabel *wifiNameLabel;
@property (weak, nonatomic) IBOutlet UILabel *ipAddressLabel;
@property (weak, nonatomic) IBOutlet UIButton *senMsgButton;@property (weak, nonatomic) IBOutlet UIButton *clientButton;@property(nonatomic,strong)UITextField *textField;
@property (weak, nonatomic) IBOutlet UITableView *tableView;//存放客户端的消息用于显示
@property(nonatomic,strong)NSMutableArray <NSData *>*tableArr;
//
//客户端socket
@property(nonatomic,strong)GCDAsyncSocket *clientSocket;
@end@implementation ClientViewController- (void)viewDidLoad {[super viewDidLoad];self.wifiNameLabel.text = [NSString stringWithFormat:@"wifi名称:%@",[WIFITools currentWifiSSID]];self.ipAddressLabel.text = [NSString stringWithFormat:@"ip地址:%@",[WIFITools localWiFiIPAddress]];self.tableArr = [NSMutableArray array];// Do any additional setup after loading the view.
}//客户端开始连接
- (IBAction)wifiButtonClik:(UIButton *)sender {//1.创建客户端socket//在socket通讯中,无论是客户端还是服务端,任何对象都是socket,类似于万物皆NSObjectif (!self.clientSocket) {self.clientSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];}NSLog(@"%@",self.clientSocket.localHost);//2.连接服务端//注意:此处有两个重点    1.这里的ip地址一定要是同一个局域网服务端的ip地址,端口号也要与服务端连接的端口号一致   2.实际开发中,一般服务端的ip地址和所监听的端口号都会在wifit通信协议中注明,这里只是笔者为了掩饰,所以随便写了一个端口号1234,而这里的ip地址也是笔者为了掩饰给mac电脑设置了一个固定ip地址[self.clientSocket connectToHost:@"192.168.0.102" onPort:1234 error:nil];}//客户端发送数据
- (IBAction)sendMsgButton:(UIButton*)sender {if (!self.textField) {self.textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 40)];self.textField.delegate = self;self.textField.returnKeyType = UIReturnKeySend;[self.view addSubview:self.textField];}self.textField.hidden = NO;[self.textField becomeFirstResponder];}#pragma mark- GCDAsyncSocketDelegate//客户端连接服务端成功
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
{//1.将开始连接按钮变为已连接[self.clientButton setTitle:@"连接成功" forState:UIControlStateNormal];//2.发送数据按钮开启交互self.senMsgButton.enabled = YES;//3.客户端开始读取服务端的数据[self.clientSocket readDataWithTimeout:-1 tag:0];
}//客户端接收数据成功
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];NSLog(@"客户端接发送数据:%@",str);//0.添加到数据源[self.tableArr addObject:data];//1.刷新界面[self.tableView reloadData];//2.继续读取数据(否则只能读取一次)[sock readDataWithTimeout:-1 tag:0];}//客户端发送数据成功
-(void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag
{NSLog(@"客户端发送数据");//刷新数据[self.tableView reloadData];
}#pragma mark -UITextFieldDelegate  发送数据- (BOOL)textFieldShouldReturn:(UITextField *)textField
{[textField resignFirstResponder];//1.发送数据  具体的数据格式会由硬件工程师定义,示例这里使用冒号:将我的手机名称和消息分开NSString *str = [NSString stringWithFormat:@"%@:%@",[UIDevice currentDevice].name,textField.text];//2.发送数据 第一个参数:二进制数据  第二个参数:超时等待  -1为永久等待  tag:消息标签 没啥用[self.clientSocket writeData:[str dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:1];//3添加到数组用于显示[self.tableArr addObject:[str dataUsingEncoding:NSUTF8StringEncoding]];textField.text = nil;return YES;
}#pragma mark -UITableViewDelegate- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{return self.tableArr.count;
}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"clientCell"];UILabel *nameLabel = (UILabel *)[cell.contentView viewWithTag:1];UILabel *msgLabel = (UILabel *)[cell.contentView viewWithTag:2];//读取数据NSData *data = self.tableArr[indexPath.row];NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];NSArray *arr = [str componentsSeparatedByString:@":"];//显示数据nameLabel.text = [NSString stringWithFormat:@"设备名称:%@",arr[0]];msgLabel.text = [NSString stringWithFormat:@" 数据:%@",arr[1]];return cell;}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}/*
#pragma mark - Navigation// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {// Get the new view controller using [segue destinationViewController].// Pass the selected object to the new view controller.
}
*/@end

05-WIFI通讯客户端搭建相关推荐

  1. ios即时通讯客户端开发之-mac上搭建openfire服务器

    CHENYILONG Blog ios即时通讯客户端开发之-mac上搭建openfire服务器 转自:月光的尽头 ios即时通讯客户端开发之-mac上搭建openfire服务器 一.下载并安装open ...

  2. 01-iOS之wifi通讯开发简介

    wifi通讯开发 1.1-wifi通讯简介 1.wifi通讯原理介绍 wifi通讯的本质上是网络传输,只不过wifi通讯使用的并不是我们传统的HTTP协议,而是UDP协议 想要了解UDP协议,则必须要 ...

  3. K210入门,用wifi通讯

    K210入门,用wifi通讯 wifi通讯 本人使用的是Maix Dock,不同开发板自行进行微调 wifi通讯 MaixDock包装盒内附赠一条wifi天线,将其安装到K210核心板上然后开始编写代 ...

  4. Angular安装以及项目客户端搭建

    Angular安装以及项目客户端搭建 先说说前提,然后在讲具体的.最近有个项目前段用到了AngularJs.less.typescript.ng-zorro,所以要搭建一个客户端启动环境,这里选择no ...

  5. Wireguard服务器客户端搭建

    Wireguard服务器客户端搭建 前言 虽然wireguard在官网文档里面并没有明确的服务端和客户端之分,两者在使用权限地位上是平等的,但是由于我们通过每一个接入终端的公钥私钥都在一个主机上生成, ...

  6. 时间服务器: NTP 服务器及客户端搭建

    时间服务器: NTP 服务器及客户端搭建 一. NTP 服务器的安装与设定 1. NTP 服务器的安装与设定前言 2. 所需软件与软件结构 3. 主要配置文件 ntp.conf 的处理 4. NTP ...

  7. ESP8266的MQTT客户端搭建教程(基于NONS_SDK_v2.0)

    前言 MQTT是IBM开发的一个即时通讯协议,面向M2M和物联网的连接,采用轻量级发布和订阅消息传输机制,并且有可能成为物联网的重要组成部分. ESP8266是一款物美价廉的Wi-Fi芯片,集成Ten ...

  8. 【ESP8266】ESP8266的MQTT客户端搭建教程(基于NONS_SDK_v2.0)

    前言 MQTT是IBM开发的一个即时通讯协议,面向M2M和物联网的连接,采用轻量级发布和订阅消息传输机制,并且有可能成为物联网的重要组成部分. ESP8266是一款物美价廉的Wi-Fi芯片,集成Ten ...

  9. 支持Wi-Fi通讯的ADW300无线计量仪表介绍 安科瑞 顾语欢

    一.WIFI原理及优势   Wi-Fi俗称无线宽带网.作为目前无线IP传输的成熟技术,由于其具有传输距离远.带宽高.组网容易,在各行各业已被广泛使用.伴随着三大运营商大规模建设基于Wi-Fi技术的无线 ...

最新文章

  1. 【工具软件】Xmind的使用
  2. spring boot地一讲
  3. 记录今天学习SQL遇到的一个小问题
  4. 笔记本平板电脑推荐_ONETALK 亦说便携式平板电脑推荐
  5. C++ 多线程 同时读取同一个vector 线程安全 吗
  6. P3161 [CQOI2012]模拟工厂
  7. PHP 操作ini文件,读取及写入操作(代码)
  8. Springboot接入阿里云物联网SDK实现控制网络继电器通断
  9. spring bean生命周期源码剖析
  10. 多个图像直方图合并matlab,MATLAB图像处理之直方图匹配(图像合理增强)
  11. Git基础(18):如何使用GitLab
  12. C盘爆满,你的专属清道夫来啦
  13. Html5之canvas重叠矩形、getContext、fillStyle、fillRect
  14. 用Python爬虫爬取链家网上的房源信息
  15. 2021年11月23日对自己的一次鼓励
  16. 算法题解01——对分搜索求立方根
  17. 涉及计算机程序的发明专利申请的解读
  18. 2021Pycharm学生免费使用
  19. 视频监控故障类型归纳
  20. 《图解HTTP》读后整理,好书值得

热门文章

  1. lookup函数和vlookup_LOOKUP函数与VLOOKUP函数,你总会喜欢一个的
  2. 计算机专硕没有宿舍,没有补贴,不提供宿舍,读研究生还要家里支持,应届生读非全太难...
  3. 深度学习和目标检测系列教程 8-300:目标检测常见的标注工具LabelImg和将xml文件提取图像信息
  4. 四、数据仓库和Hive环境搭建
  5. 三十二、VsCode前端的开发工具介绍和使用
  6. 今日arXiv精选 | 34篇顶会论文:CIKM/ ACL/ Interspeech/ ICCV/ ACM MM
  7. 切分也重要:基于多粒度语言单元切分的BERT模型
  8. 免费报名 | 智源论坛:智能处理器探索,AI技术前沿精粹尽览
  9. FSRNet:端到端深度可训练人脸超分辨网络
  10. 自动机器学习(AutoML)最新综述