1.TCP使用

导入AsyncSocket资源文件夹,此文件是arc混编,加入库文件,如下图:

 #import "ViewController.h"
#import "AsyncSocket.h" @interface ViewController () <AsyncSocketDelegate>{ AsyncSocket *_recvSocket; //服务端
AsyncSocket *_sendSocket; //客户端 NSMutableArray *_socketArray; //数组用于记录socket } @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; //初始化数组
_socketArray = [[NSMutableArray alloc] init]; //服务端 负责监听有没有客户端连接
_recvSocket = [[AsyncSocket alloc] initWithDelegate:self]; //客户端
_sendSocket = [[AsyncSocket alloc] initWithDelegate:self]; //服务端开始监听 端口5678
[_recvSocket acceptOnPort: error:nil]; } //如果监听到有人连接,那么久会调用此方法
- (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket {
//保存服务端的新的套接字 (谁连接就保存谁)
[_socketArray addObject:newSocket];
//等待客户端发来的新消息 ,必须写 否则没有数据过来
[newSocket readDataWithTimeout:- tag:]; } //如果监听到客户端发送来的消息,就会执行此方法
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag { NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; //拼接内容 显示
self.showTextView.text = [NSString stringWithFormat:@"%@%@:%@\n",self.showTextView.text,sock.connectedHost,str]; //继续监听客户端发送的消息
[sock readDataWithTimeout:- tag:];
} //连接成功后调用此方法
- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port {
NSLog(@"连接成功");
} //端口连接调用此方法
- (void)onSocketDidDisconnect:(AsyncSocket *)sock { NSLog(@"断开连接");
} //当消息发送出去后调用此方法
- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag {
NSLog(@"消息发送");
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} - (IBAction)connect:(id)sender {
//首先判断连接状态,如果连接了 先端口连接 然后重新连接
if (_sendSocket.isConnected) {
//如果连接了 断开连接
[_sendSocket disconnect];
}
//客户端连接host 注意:ip和端口别写错了 否则连接不上
[_sendSocket connectToHost:self.ipTextField.text onPort: error:nil]; } - (IBAction)send:(id)sender { NSData *data = [self.contentTextField.text dataUsingEncoding:NSUTF8StringEncoding];
//客户端发送数据
[_sendSocket writeData:data withTimeout: tag:]; self.showTextView.text = [NSString stringWithFormat:@"%@我说:%@\n",self.showTextView.text,self.contentTextField.text];
//清空发送输入空内容
self.contentTextField.text = @"";
}
@end

2.UDP使用

导入AsyncSocket资源文件夹,此文件是arc混编,加入库文件,操作如1中上图:

 #import "ViewController.h"
#import "AsyncUdpSocket.h" @interface ViewController () <AsyncUdpSocketDelegate>{ AsyncUdpSocket *_sendSocket; //客户端 发数据
AsyncUdpSocket *_recvSocket; //服务端 接数据
}
@property (weak, nonatomic) IBOutlet UITextField *ipTextField;
@property (weak, nonatomic) IBOutlet UITextField *contentTextField;
@property (weak, nonatomic) IBOutlet UITextView *showTextView;
- (IBAction)send:(id)sender;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; //创建客户端 参数代理self
_sendSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
//客户端绑定一个端口
[_sendSocket bindToPort: error:nil]; //创建服务端 参数代理self
_recvSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
//服务端绑定端口
[_recvSocket bindToPort: error:nil]; //服务端开始等待接收数据(消息) -1代表一直等待 如果是正数 比如5 代表等待5秒 tag:标识
[_recvSocket receiveWithTimeout:- tag:]; } //服务端接收到数据会调用这个方法
- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port {
/*
第一个参数:udpSocket
第二个参数:发送过来的内容 NSData类型
第三个参数:tag标识
第四个参数:host 这里是ip地址
第五个参数:端口号
*/ //将NSData类型转字符串
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"str:%@",str);
if (str) {
self.showTextView.text = [NSString stringWithFormat:@"%@%@:%@\n",self.showTextView.text,host,str];
}
//继续等待接收的数据,注:必须要加否则下次收到消息无法得到
[_recvSocket receiveWithTimeout:- tag:]; return YES;
} - (void)onUdpSocket:(AsyncUdpSocket *)sock didSendDataWithTag:(long)tag {
NSLog(@"UDP 发送消息");
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} - (IBAction)send:(id)sender { //取出self.contentTextField输入框的文本内容 然后转NSData类型
NSData *data = [self.contentTextField.text dataUsingEncoding:NSUTF8StringEncoding];
//客户端发送内容
/*
第一个参数:发送内容 NSData类型
第二个参数:ip地址 发给谁
第三个参数:端口号
第四个参数:超时时间 30秒 超过30秒后不会做任何处理
第五个参数:标识
*/ [_sendSocket sendData:data toHost:self.ipTextField.text port: withTimeout: tag:];
}
@end

最新文章

  1. Windows系统变量
  2. 基础DOS命令
  3. Cannot get a connection, pool exhausted解决办法
  4. windows环境下XAMPP安装、多域名多端口配置、与python环境并存
  5. Selenium2+python自动化25-js处理日历控件(修改readonly属性)
  6. plsql programming 04 条件和顺序控制
  7. WEBUS2.0 In Action - 搜索操作指南 - (2)
  8. ZOJ Monthly, August 2014
  9. Android 项目利用 Android Studio 和 Gradle 打包多版本APK
  10. Java+Mysql+学生管理系统
  11. VC判断当前用户有无Administrator的权限(用EqualSid API函数判断与Admin是否在一个组的Sid)
  12. String类的基本用法与注意点,StringBuffer类的用法
  13. iOS 编译64位FFMPEG
  14. hdu 2191多重背包
  15. C#获取存储过程的 Return返回值和Output输出参数值
  16. Centos 安装Java jdk
  17. Loj 3058. 「HNOI2019」白兔之舞
  18. socket编程-阻塞和非阻塞
  19. jquery datatables api
  20. Object.defineProperty 与数据绑定的简单实现

热门文章

  1. 008-CentOS添加环境变量
  2. boost noncopyable类
  3. 数据结构&amp;算法(一)_堆、栈(堆栈)、队列、链表
  4. BKDRHash函数
  5. [TJOI2015]组合数学
  6. PHP 错误日志/安全配置
  7. 《网络对抗》 逆向及Bof进阶实践
  8. 编译安卓7.0源码出现make: *** [ninja_wrapper] Error 1【转】
  9. maven更换下载镜像源-解决下载慢问题
  10. Kruskal算法-最小生成树