TCP与UDP(实时通讯)
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
TCP与UDP(实时通讯)的更多相关文章
- C++ 利用socket实现TCP,UDP网络通讯
学习孙鑫老师的vc++深入浅出,有一段时间了,第一次接触socket说实话有点儿看不懂,第一次基本上是看他说一句我写一句完成的,第二次在看SOCKET多少有点儿感觉了,接下来我把利用SOCKET完成T ...
- python3实现unix域协议(tcp、udp)通讯
socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIXDomain Socket.虽然网络socket也可用于同一台主机的进程间通讯(通过loopb ...
- lvs+keepalive实现双主模式(采用DR),同时实现TCP和UDP检测实现非web端的负载均衡,同时实现跨网段的通讯
因为公司领导需要,需要把lvs备机也使用上,故! 使用双主,相互是主的同时也相互是备机.本人用nat测试发现RS无法实现负载均衡,故采用DR模式来实现非web端的负载均衡 lvs1: DIP 10.6 ...
- LWIP裸机环境下实现TCP与UDP通讯(转)
源: LWIP裸机环境下实现TCP与UDP通讯
- Shell 脚本实现TCP/UDP协议通讯
Shell 脚本实现TCP/UDP协议通讯 http://www.cnblogs.com/occult/archive/2012/12/25/2832183.html
- onps栈使用说明(3)——tcp、udp通讯测试
4. tcp客户端 在协议栈源码工程下,存在一个用vs2015建立的TcpServerForStackTesting工程.其运行在windows平台下,模拟实际应用场景下的tcp服务器.当tcp客户端 ...
- socket通讯,TCP,UDP,HTTP的区别
socket编程有TCP和UDP, TCP:传送控制协议(Transmission Control Protocol) 传输控制协议TCP是TCP/IP协议栈中的传输层协议,它通过序列确认以及包重发机 ...
- [转]VB Winsock 控件TCP与UDP连接实例
[-] 可能的用途 选择通讯协议 协议的设置 确定计算机的名称 TCP 连接初步 接受多个连接请求 UDP 初步 关于 Bind 方法 利用 WinSock 控件可以与远程计算机建立连接,并通过用 ...
- 【转】关于TCP和UDP协议消息保护边界的介绍
在 socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有一一成对的 socket,因此,发送端为了将多个发往接收端的包, ...
- TCP和UDP的保护消息边界机制
在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.TCP的socket编程,收发两端都要有一一成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化 ...
随机推荐
- 设置EditText明文切换
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mingyue_1128/article/details/37651793 if (!isChecke ...
- HDU1069:Monkey and Banana(最长上升子序列的应用)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1069 这题挺简单的,给定一个箱子的长宽高,要求啰箱子,但必须保证下面箱子的长和宽必须大于上面的箱子. 一个 ...
- HTTP状态码集
1xx消息 这一类型的状态码,代表请求已被接受,需要继续处理.这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束.由于HTTP/1.0协议中没有定义任何1xx状态码,所以除非在某些试 ...
- Python(常用模块)
模块 模块 本质上就是一个.py文件 内置模块(解释器层面) 第三方模块(Python lib文件) 自定义模块(当前路径) 模块调用,包的概念 在计算机程序的开发过程中,随着程序代码越写越多,在一个 ...
- Linux Shell编程第3章——正则表达式
目录 正则表达式基础 正则表达式的扩展 通配 grep命令 正则表达式基础 Linux Shell以字符串作为表达式向系统传达意思.元字符(Metacharacters)是用来阐述字符表达式意义的字符 ...
- 转:C#访问修饰符
http://www.cnblogs.com/netlyf/archive/2009/12/13/1623103.html
- r.js打包注意事项 r.js打包 这个是配合require.js打包的
这个./代表的是当前文件的父目录....打包的资源一定要在这个父目录中下面才行,,,,一定一定,要放在这个目录一下才能被正确找到. 不然只是copy了一份一模一样的文件夹和文件过去,并不会处理压缩啥的 ...
- 60. Permutation Sequence(求全排列的第k个排列)
The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...
- canvas笔记1
w3c定义: <canvas> 标签定义图形,比如图表和其他图像. <canvas> 标签只是图形容器,您必须使用脚本来绘制图形. canvas 对象 属性: width he ...
- Saltstack 命令参数整理
命令:salt-key # 测试 命令:salt-key -A # 管理所有minion 命令:salt-key -a # 管理定义minion 命令:salt-key -d ID名字 # 删除单个m ...