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(实时通讯)的更多相关文章

  1. C++ 利用socket实现TCP,UDP网络通讯

    学习孙鑫老师的vc++深入浅出,有一段时间了,第一次接触socket说实话有点儿看不懂,第一次基本上是看他说一句我写一句完成的,第二次在看SOCKET多少有点儿感觉了,接下来我把利用SOCKET完成T ...

  2. python3实现unix域协议(tcp、udp)通讯

    socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIXDomain Socket.虽然网络socket也可用于同一台主机的进程间通讯(通过loopb ...

  3. lvs+keepalive实现双主模式(采用DR),同时实现TCP和UDP检测实现非web端的负载均衡,同时实现跨网段的通讯

    因为公司领导需要,需要把lvs备机也使用上,故! 使用双主,相互是主的同时也相互是备机.本人用nat测试发现RS无法实现负载均衡,故采用DR模式来实现非web端的负载均衡 lvs1: DIP 10.6 ...

  4. LWIP裸机环境下实现TCP与UDP通讯(转)

    源: LWIP裸机环境下实现TCP与UDP通讯

  5. Shell 脚本实现TCP/UDP协议通讯

    Shell 脚本实现TCP/UDP协议通讯 http://www.cnblogs.com/occult/archive/2012/12/25/2832183.html  

  6. onps栈使用说明(3)——tcp、udp通讯测试

    4. tcp客户端 在协议栈源码工程下,存在一个用vs2015建立的TcpServerForStackTesting工程.其运行在windows平台下,模拟实际应用场景下的tcp服务器.当tcp客户端 ...

  7. socket通讯,TCP,UDP,HTTP的区别

    socket编程有TCP和UDP, TCP:传送控制协议(Transmission Control Protocol) 传输控制协议TCP是TCP/IP协议栈中的传输层协议,它通过序列确认以及包重发机 ...

  8. [转]VB Winsock 控件TCP与UDP连接实例

    [-] 可能的用途 选择通讯协议 协议的设置 确定计算机的名称 TCP 连接初步 接受多个连接请求 UDP 初步 关于 Bind 方法   利用 WinSock 控件可以与远程计算机建立连接,并通过用 ...

  9. 【转】关于TCP和UDP协议消息保护边界的介绍

    在 socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有一一成对的 socket,因此,发送端为了将多个发往接收端的包, ...

  10. TCP和UDP的保护消息边界机制

    在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.TCP的socket编程,收发两端都要有一一成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化 ...

随机推荐

  1. sql server内存使用情况

    查看Sql Server 数据库的内存使用情况 转自:https://www.cnblogs.com/wanghao4023030/p/8299478.html    DBCC MemoryStatu ...

  2. (4.8)SET ANSI_NULLS ON、SET QUOTED_IDENTIFIER ON

    T-SQL支持在与空值进行比较时,允许比较运算符返回 TRUE 或 FALSE. 通过设置 ANSI_NULLS OFF 可将此选项激活.当 ANSI_NULLS 为 OFF 时,如果 ColumnA ...

  3. 关于 tf.nn.softmax_cross_entropy_with_logits 及 tf.clip_by_value

    In order to train our model, we need to define what it means for the model to be good. Well, actuall ...

  4. discuz手机版图片缩略图大小设置/修改清晰度

    discuz手机版 图片缩略图大小设置/修改清晰度 \template\default\mobile\forum\discuzcode.htm和 \template\default\touch\for ...

  5. python的变量类型(Day6)

    Python的变量类型 变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符. 变量赋值 Python 中的变量赋值不需要类型声明 等号(=)用来给变量赋值,等号左边为变量值,等号右边是存储在 ...

  6. python提示AttributeError: 'NoneType' object has no attribute 'append'

    在写python脚本时遇到AttributeError: 'NoneType' object has no attribute 'append' a=[] b=[1,2,3,4] a = a.appe ...

  7. CNN学习笔记:正则化缓解过拟合

    CNN学习笔记:正则化缓解过拟合 过拟合现象 在下图中,虽然绿线完美的匹配训练数据,但太过依赖,并且与黑线相比,对于新的测试数据上会具有更高的错误率.虽然这个模型在训练数据集上的正确率很高,但这个模型 ...

  8. 杭电1024Max Sum Plus Plus

    地址:http://acm.hdu.edu.cn/showproblem.php?pid=1024 题目: Problem Description Now I think you have got a ...

  9. Linux yum源地址

    ----------------------------------Linux yum源地址------------------------------ Zabbix 3.0 yum源 rpm -iv ...

  10. JSP web.xml <jsp-config>标签使用详解

    <jsp-config> 包括 <taglib> 和 <jsp-property-group> 两个子元素.其中<taglib> 元素在JSP 1.2  ...