iOS中 HTTP/Socket/TCP/IP通信协议详解 韩俊强的博客

简介:

每日更新关注:http://weibo.com/hanjunqiang  新浪微博

简单介绍:

[objc]  view plain  copy
  1. // OSI(开放式系统互联), 由ISO(国际化标准组织)制定  
  2. // 1. 应用层  
  3. // 2. 表示层  
  4. // 3. 会话层  
  5. // 4. 传输层  
  6. // 5. 网络层  
  7. // 6. 数据链接层  
  8. // 7. 物理层  
  9.   
  10. // TCP/IP, 由美国国防部制定  
  11. // 1. 应用层, HTTP, FTP, SMTP, DNS  
  12. // 2. 传输层, TCP, UDP  
  13. // 3. 网络层, IP  
  14. // 4. 链路层, ARP, RARP  
  15.   
  16. // HTTP(短连接)  
  17. // 1. 建立链接, 三次握手  
  18. // 2. 断开链接, 四次挥手  
  19.   
  20. // 数据报文->数据包->数据帧->比特流(二进制)-->比特流->数据帧->数据包->数据报文  
  21.   
  22. // socket, "插口", "套接字", 长连接, 存在于应用层和传输层之间, 提供一种封装, 方便进行通信  
[objc]  view plain  copy
  1. <span style="color: rgb(37, 37, 37); font-size: 18px; line-height: 26px; font-family: 'STHeiti Light';">每日更新关注</span><span style="color: rgb(37, 37, 37); font-size: 18px; line-height: 26px; font-family: 'STHeiti Light';">:</span><a target=_blank target="_blank" href="http://weibo.com/hanjunqiang" style="color: rgb(202, 0, 0); text-decoration: none; font-size: 18px; line-height: 26px; font-family: 'STHeiti Light';">http://weibo.com/hanjunqiang</a><span style="color: rgb(37, 37, 37); font-size: 18px; line-height: 26px; font-family: 'STHeiti Light';">  新浪微博</span>  

下面详解Socket通信:

布局如下:

              

每日更新关注:http://weibo.com/hanjunqiang  新浪微博

引进框架:



服务端代码:

[objc]  view plain  copy
  1. //  Created by 韩俊强 on 15/12/25.  
  2. //  Copyright © 2015年 韩俊强. All rights reserved.  
  3.   
  4. #import "ViewController.h"  
  5. // 使用CocoPods使用<>, 可以指定路径  
  6. #import <CocoaAsyncSocket/CocoaAsyncSocket.h>  
  7. #import "GNASocket.h"  
  8.   
  9. @interface ViewController ()<GCDAsyncSocketDelegate>  
  10.   
  11. @property (weak, nonatomic) IBOutlet UITextField *portTF;  
  12. @property (weak, nonatomic) IBOutlet UITextView *message; // 多行文本输入框  
  13. @property (weak, nonatomic) IBOutlet UITextField *content;  
  14.   
  15. @property (nonatomicstrongGCDAsyncSocket *clientSocket;// 为客户端生成的socket  
  16.   
  17. // 服务器socket  
  18. @property (nonatomicstrongGCDAsyncSocket *serverSocket;  
  19.   
  20. @end  
  21.   
  22. @implementation ViewController  
  23.   
  24. - (void)viewDidLoad  
  25. {  
  26.     [super viewDidLoad];  
  27. }  
  28.   
  29. // 服务端监听某个端口  
  30. - (IBAction)listen:(UIButton *)sender  
  31. {  
  32.     // 1. 创建服务器socket  
  33.     self.serverSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];  
  34.       
  35.     // 2. 开放哪些端口  
  36.     NSError *error = nil;  
  37.     BOOL result = [self.serverSocket acceptOnPort:self.portTF.text.integerValue error:&error];  
  38.       
  39.     // 3. 判断端口号是否开放成功  
  40.     if (result) {  
  41.         [self addText:@"端口开放成功"];  
  42.     } else {  
  43.         [self addText:@"端口开放失败"];  
  44.     }  
  45. }  
  46.   
  47. // 发送  
  48. - (IBAction)sendMessage:(UIButton *)sender  
  49. {  
  50.     NSData *data = [self.content.text dataUsingEncoding:NSUTF8StringEncoding];  
  51.     [self.clientSocket writeData:data withTimeout:-1 tag:0];  
  52.       
  53.     GNASocket *socket = [GNASocket defaultScocket];  
  54.     [socket.mySocket readDataWithTimeout:-1 tag:0];  
  55. }  
  56.   
  57. // 接收消息  
  58. - (IBAction)receiveMassage:(UIButton *)sender  
  59. {  
  60.     [self.clientSocket readDataWithTimeout:-1 tag:0];  
  61. }  
  62.   
  63.   
  64. // textView填写内容  
  65. - (void)addText:(NSString *)text  
  66. {  
  67.     self.message.text = [self.message.text stringByAppendingFormat:@"%@\n", text];  
  68. }  
  69.   
  70. - (void)didReceiveMemoryWarning  
  71. {  
  72.     [super didReceiveMemoryWarning];  
  73.       
  74. }  
  75.   
  76. #pragma mark - GCDAsyncSocketDelegate  
  77. // 当客户端链接服务器端的socket, 为客户端单生成一个socket  
  78. - (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket  
  79. {  
  80.     [self addText:@"链接成功"];  
  81.     //IP: newSocket.connectedHost  
  82.     //端口号: newSocket.connectedPort  
  83.     [self addText:[NSString stringWithFormat:@"链接地址:%@", newSocket.connectedHost]];  
  84.     [self addText:[NSString stringWithFormat:@"端口号:%hu", newSocket.connectedPort]];  
  85.     // short: %hd  
  86.     // unsigned short: %hu  
  87.       
  88.     // 存储新的端口号  
  89.     self.clientSocket = newSocket;  
  90. }  
  91.   
  92. - (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag  
  93. {  
  94.     NSString *message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];  
  95.     [self addText:message];  
  96. }  
  97.   
  98.   
  99. @end  

客户端代码:

[objc]  view plain  copy
  1. //  Created by 韩俊强 on 15/12/25.  
  2. //  Copyright © 2015年 韩俊强. All rights reserved.  
  3. //  
  4.   
  5. #import "SecondViewController.h"  
  6. #import <CocoaAsyncSocket.h>  
  7. #import "GNASocket.h"  
  8.   
  9. @interface SecondViewController ()<GCDAsyncSocketDelegate>  
  10.   
  11. @property (weak, nonatomic) IBOutlet UITextField *addressTF;  
  12. @property (weak, nonatomic) IBOutlet UITextField *portTF;  
  13. @property (weak, nonatomic) IBOutlet UITextField *message;  
  14.   
  15. @property (weak, nonatomic) IBOutlet UITextView *content;  
  16.   
  17. @property (nonatomicstrongGCDAsyncSocket *socket;  
  18.   
  19. @end  
  20.   
  21. @implementation SecondViewController  
  22.   
  23. - (void)viewDidLoad  
  24. {  
  25.     [super viewDidLoad];  
  26.       
  27. }  
  28.   
  29. // 和服务器进行链接  
  30. - (IBAction)connect:(UIButton *)sender  
  31. {  
  32.     // 1. 创建socket  
  33.     self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];  
  34.       
  35.     // 2. 与服务器的socket链接起来  
  36.     NSError *error = nil;  
  37.     BOOL result = [self.socket connectToHost:self.addressTF.text onPort:self.portTF.text.integerValue error:&error];  
  38.       
  39.     // 3. 判断链接是否成功  
  40.     if (result) {  
  41.         [self addText:@"客户端链接服务器成功"];  
  42.     } else {  
  43.         [self addText:@"客户端链接服务器失败"];  
  44.     }  
  45. }  
  46.   
  47. // 接收数据  
  48. - (IBAction)receiveMassage:(UIButton *)sender  
  49. {  
  50.     [self.socket readDataWithTimeout:-1 tag:0];  
  51. }  
  52.   
  53. // 发送消息  
  54. - (IBAction)sendMassage:(UIButton *)sender  
  55. {  
  56.     [self.socket writeData:[self.message.text dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];  
  57. }  
  58.   
  59.   
  60. // textView填写内容  
  61. - (void)addText:(NSString *)text  
  62. {  
  63.     self.content.text = [self.content.text stringByAppendingFormat:@"%@\n", text];  
  64. }  
  65.   
  66.   
  67. - (void)didReceiveMemoryWarning  
  68. {  
  69.     [super didReceiveMemoryWarning];  
  70. }  
  71.   
  72. #pragma mark - GCDAsyncSocketDelegate  
  73.   
  74. // 客户端链接服务器端成功, 客户端获取地址和端口号  
  75. - (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port  
  76. {  
  77.     [self addText:[NSString stringWithFormat:@"链接服务器%@", host]];  
  78.       
  79.     GNASocket *socket = [GNASocket defaultScocket];  
  80.     socket.mySocket = self.socket;  
  81. }  
  82.   
  83. // 客户端已经获取到内容  
  84. - (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag  
  85. {  
  86.     NSString *content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];  
  87.     [self addText:content];  
  88. }  
  89.   
  90. @end  


每日更新关注 : http://weibo.com/hanjunqiang   新浪微博


为通信传值写一个单例:

[objc]  view plain  copy
  1. //.h  
  2. #import <Foundation/Foundation.h>  
  3. #import <CocoaAsyncSocket.h>  
  4.   
  5. @interface GNASocket : NSObject  
  6.   
  7. @property (nonatomicstrongGCDAsyncSocket *mySocket;  
  8.   
  9. + (GNASocket *)defaultScocket;  
  10.   
  11. @end  
  12.   
  13.   
  14. //.m  
  15.   
  16. #import "GNASocket.h"  
  17.   
  18. @implementation GNASocket  
  19.   
  20. + (GNASocket *)defaultScocket  
  21. {  
  22.     static GNASocket *socket = nil;  
  23.     static dispatch_once_t onceToken;  
  24.     dispatch_once(&onceToken, ^{  
  25.         socket = [[GNASocket alloc] init];  
  26.     });  
  27.     return socket;  
  28. }  
  29.   
  30. @end  

最终效果:



每日更新关注:http://weibo.com/hanjunqiang  新浪微博


相关文章
|
5天前
|
前端开发 JavaScript 安全
第十篇 Axios最佳实战:前端HTTP通信的王者之选
第十篇 Axios最佳实战:前端HTTP通信的王者之选
|
6天前
|
消息中间件 网络协议 开发工具
MQ产品使用合集之rocketmq5.x只有tcp接入点吗,python sdk需要http接入点,请问怎么使用
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
23 2
|
6天前
|
网络协议 网络安全 程序员
socket,tcp,http三者之间的原理和区别
socket,tcp,http三者之间的原理和区别
socket,tcp,http三者之间的原理和区别
|
6天前
|
安全 网络协议 网络安全
干货|代理IP协议有何区别?深入了解 SOCKS5、HTTP 代理
HTTP和HTTPS是互联网主要的两大协议,HTTP是基础的简单请求-响应协议,常用于TCP上,但数据传输不安全。HTTPS是HTTP的安全版本,添加了SSL层进行加密和身份验证,提供更高的安全性,用于保护数据和验证网站真实性。HTTPS需CA证书,可能产生费用,并使用443端口而非HTTP的80端口。
|
6天前
|
网络协议 安全 数据安全/隐私保护
干货|代理IP协议有何区别?深入了解 SOCKS5、HTTP 代理
SOCKS5和HTTP是两种代理协议,前者是通用型,支持多种网络流量,提供身份验证、IPv6支持及UDP兼容性,更适合实时数据传输。HTTP代理专用于HTTP协议,适用于Web资源请求。SOCKS5在传输方式、功能、兼容性和安全性上更胜一筹,而HTTP代理则在处理HTTP请求时更专业。选择代理协议应根据需求和应用场景,考虑服务的稳定性和安全性。付费代理如kookeey全球代理,支持双协议,速度快且可扩展性强,是可靠的选择。
|
6天前
|
网络协议 应用服务中间件 nginx
nginx 302 301 设置 url 转跳 nginx 资源重定向 nginx tcp 和 http 转发
nginx 代理后端网站,和 网站资源目录重定向到其他连接地址
78 3
|
6天前
|
API
http代理ip请求并发数是什么?有什么用?
HTTP代理IP请求并发数指单个客户端对API或代理IP同时发起的请求数量,分为API链接请求并发和IP最大连接数。并发是瞬时同时请求,不同提供商限制不同。高并发请求的代理IP服务商能更好地应对程序压力。选择时应考虑这一因素。
|
6天前
|
缓存 负载均衡 网络协议
【亮剑】一次完整的HTTP请求的重要性和详细过程
【4月更文挑战第30天】本文介绍了HTTP请求的重要性和详细过程。首先,DNS解析将域名转换为IP地址,通过递归和迭代查询找到目标服务器。接着,TCP三次握手建立连接。然后,客户端发送HTTP请求,服务器处理请求并返回响应。最后,理解这个过程有助于优化网站性能,如使用DNS缓存、HTTP/2、Keep-Alive、CDN和负载均衡等实践建议。
|
6天前
|
数据采集 缓存 网络协议
静态代理IP是否支持HTTP和HTTPS?
静态代理IP支持HTTP、HTTPS、FTP、Socks5等协议,HTTP协议因其简单、灵活而常用,通常比HTTPS速度快,因无需加密处理。HTTP代理比SOCKS5代理通常更快,因为HTTP专注于HTTP请求,而SOCKS5处理多种网络流量。静态HTTP代理适合浏览器和爬虫,SOCKS5代理支持更多协议,如TCP、UDP。选择取决于应用场景和需求。
|
6天前
|
数据采集
如何选择高质量http/Socks5代理ip?
选择高质量HTTP、Socks5代理IP对爬虫和数据采集至关重要。了解代理IP类型,根据需求选择HTTP或Socks5代理。选择稳定、快速、分布广泛、数量充足且不易被封的代理IP供应商。关注代理IP速度、质量、稳定性、区域和使用频率。测试代理IP的连接速度、可用性、匿名性和使用频率。定期更换代理IP以保持效率和可靠性。