05-WIFI通讯客户端搭建
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通讯客户端搭建相关推荐
- ios即时通讯客户端开发之-mac上搭建openfire服务器
CHENYILONG Blog ios即时通讯客户端开发之-mac上搭建openfire服务器 转自:月光的尽头 ios即时通讯客户端开发之-mac上搭建openfire服务器 一.下载并安装open ...
- 01-iOS之wifi通讯开发简介
wifi通讯开发 1.1-wifi通讯简介 1.wifi通讯原理介绍 wifi通讯的本质上是网络传输,只不过wifi通讯使用的并不是我们传统的HTTP协议,而是UDP协议 想要了解UDP协议,则必须要 ...
- K210入门,用wifi通讯
K210入门,用wifi通讯 wifi通讯 本人使用的是Maix Dock,不同开发板自行进行微调 wifi通讯 MaixDock包装盒内附赠一条wifi天线,将其安装到K210核心板上然后开始编写代 ...
- Angular安装以及项目客户端搭建
Angular安装以及项目客户端搭建 先说说前提,然后在讲具体的.最近有个项目前段用到了AngularJs.less.typescript.ng-zorro,所以要搭建一个客户端启动环境,这里选择no ...
- Wireguard服务器客户端搭建
Wireguard服务器客户端搭建 前言 虽然wireguard在官网文档里面并没有明确的服务端和客户端之分,两者在使用权限地位上是平等的,但是由于我们通过每一个接入终端的公钥私钥都在一个主机上生成, ...
- 时间服务器: NTP 服务器及客户端搭建
时间服务器: NTP 服务器及客户端搭建 一. NTP 服务器的安装与设定 1. NTP 服务器的安装与设定前言 2. 所需软件与软件结构 3. 主要配置文件 ntp.conf 的处理 4. NTP ...
- ESP8266的MQTT客户端搭建教程(基于NONS_SDK_v2.0)
前言 MQTT是IBM开发的一个即时通讯协议,面向M2M和物联网的连接,采用轻量级发布和订阅消息传输机制,并且有可能成为物联网的重要组成部分. ESP8266是一款物美价廉的Wi-Fi芯片,集成Ten ...
- 【ESP8266】ESP8266的MQTT客户端搭建教程(基于NONS_SDK_v2.0)
前言 MQTT是IBM开发的一个即时通讯协议,面向M2M和物联网的连接,采用轻量级发布和订阅消息传输机制,并且有可能成为物联网的重要组成部分. ESP8266是一款物美价廉的Wi-Fi芯片,集成Ten ...
- 支持Wi-Fi通讯的ADW300无线计量仪表介绍 安科瑞 顾语欢
一.WIFI原理及优势 Wi-Fi俗称无线宽带网.作为目前无线IP传输的成熟技术,由于其具有传输距离远.带宽高.组网容易,在各行各业已被广泛使用.伴随着三大运营商大规模建设基于Wi-Fi技术的无线 ...
最新文章
- 【工具软件】Xmind的使用
- spring boot地一讲
- 记录今天学习SQL遇到的一个小问题
- 笔记本平板电脑推荐_ONETALK 亦说便携式平板电脑推荐
- C++ 多线程 同时读取同一个vector 线程安全 吗
- P3161 [CQOI2012]模拟工厂
- PHP 操作ini文件,读取及写入操作(代码)
- Springboot接入阿里云物联网SDK实现控制网络继电器通断
- spring bean生命周期源码剖析
- 多个图像直方图合并matlab,MATLAB图像处理之直方图匹配(图像合理增强)
- Git基础(18):如何使用GitLab
- C盘爆满,你的专属清道夫来啦
- Html5之canvas重叠矩形、getContext、fillStyle、fillRect
- 用Python爬虫爬取链家网上的房源信息
- 2021年11月23日对自己的一次鼓励
- 算法题解01——对分搜索求立方根
- 涉及计算机程序的发明专利申请的解读
- 2021Pycharm学生免费使用
- 视频监控故障类型归纳
- 《图解HTTP》读后整理,好书值得
热门文章
- lookup函数和vlookup_LOOKUP函数与VLOOKUP函数,你总会喜欢一个的
- 计算机专硕没有宿舍,没有补贴,不提供宿舍,读研究生还要家里支持,应届生读非全太难...
- 深度学习和目标检测系列教程 8-300:目标检测常见的标注工具LabelImg和将xml文件提取图像信息
- 四、数据仓库和Hive环境搭建
- 三十二、VsCode前端的开发工具介绍和使用
- 今日arXiv精选 | 34篇顶会论文:CIKM/ ACL/ Interspeech/ ICCV/ ACM MM
- 切分也重要:基于多粒度语言单元切分的BERT模型
- 免费报名 | 智源论坛:智能处理器探索,AI技术前沿精粹尽览
- FSRNet:端到端深度可训练人脸超分辨网络
- 自动机器学习(AutoML)最新综述