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. macos没有任何来源怎么解决?

    打开终端,输入如下命令即可: sudo spctl --master-disable

  2. Python基础总结(字符串常用,数字类型转换,基本运算符与流程控制)

    一.字符串常用操作 #Python strip() 方法用于移除字符串头尾指定的字符(默认为空格) name='*egon**' print(name.strip('*'))#移除 name 变量对应 ...

  3. 终端创建scrapy项目时报错(转)

    在终端创建scrapy项目时报错 PS D:\scrapy_project> scrapy startproject fangFatal error in launcher: Unable to ...

  4. Windows Live Writer 网易博客配置

    一.去官网下载 Windows Live Write 组件 二.配置,选中其它服务,然后会到如下界面 主要是这里经常不知道选择什么,容易忘记. 下拉框选中metaweblog API 类型,把这个地址 ...

  5. PAT 天梯赛 L1-036. A乘以B 【水】

    题目链接 https://www.patest.cn/contests/gplt/L1-036 AC代码 #include <iostream> #include <cstdio&g ...

  6. rabbitmq的发布确认和事务

    摘要: 介绍confirm的工作机制.使用spring-amqp介绍事务以及发布确认的使用方式.因为事务以及发布确认是针对channel来讲,所以在一个连接中两个channel,一个channel可以 ...

  7. 哆啦A梦里的某一首诗

    <哆啦A梦>长篇<宇宙开拓>主题曲<放松心情>作词:武田铁矢 我终于发现, /昨日失去的一切, /虽然还无法完全意会, /可是对我却非常重要. /加紧脚步追赶, / ...

  8. 基于HTML5和SVG的手机菜单动画

    在线演示 本地下载

  9. 偶然发现有的IIS里的程序,连接 不上SQL Server数据库, 超时

    经查应用程序池中, 有一个启用32位应用程序,  有时打开它就能连接上SQL SERVER了.

  10. 并发-Synchronized底层优化(偏向锁、轻量级锁)

    Synchronized底层优化(偏向锁.轻量级锁) 参考: http://www.cnblogs.com/paddix/p/5405678.html 一.重量级锁 上篇文章中向大家介绍了Synchr ...