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  新浪微博


相关文章
|
6天前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
29 13
|
7天前
|
网络协议 前端开发 API
HTTP 和 TCP 协议的应用场景有哪些不同
【10月更文挑战第25天】HTTP(超文本传输协议)和 TCP(传输控制协议)处于网络协议栈的不同层次,各自具有独特的功能和特点,因此它们的应用场景也存在明显的差异。
|
7天前
|
网络协议
http 与 tcp 的关系
【10月更文挑战第25天】总的来说,HTTP 和 TCP 是网络通信中不可或缺的两个协议,它们共同为网络应用提供了可靠的数据传输和交换服务。理解它们之间的关系对于开发和维护网络应用具有重要的意义。
|
7天前
|
网络协议 API 数据格式
HTTP 和 TCP 协议的主要区别
【10月更文挑战第25天】HTTP 和 TCP 在网络通信中扮演着不同的角色,各自具有独特的功能和特点,它们相互配合,共同为实现网络应用的各种需求提供了基础支持。
|
5月前
|
网络协议 安全 Java
Java网络编程入门涉及TCP/IP协议理解与Socket通信。
【6月更文挑战第21天】Java网络编程入门涉及TCP/IP协议理解与Socket通信。TCP/IP协议包括应用层、传输层、网络层和数据链路层。使用Java的`ServerSocket`和`Socket`类,服务器监听端口,接受客户端连接,而客户端连接指定服务器并交换数据。基础示例展示如何创建服务器和发送消息。进阶可涉及多线程、NIO和安全传输。学习这些基础知识能助你构建网络应用。
48 1
|
5月前
|
开发框架 网络协议 Unix
【嵌入式软件工程师面经】Socket,TCP,HTTP之间的区别
【嵌入式软件工程师面经】Socket,TCP,HTTP之间的区别
61 1
|
3月前
|
移动开发 监控 网络协议
在Linux中,如何查看 http 的并发请求数与其 TCP 连接状态?
在Linux中,如何查看 http 的并发请求数与其 TCP 连接状态?
|
2月前
|
网络协议
网络协议概览:HTTP、UDP、TCP与IP
理解这些基本的网络协议对于任何网络专业人员都是至关重要的,它们不仅是网络通信的基础,也是构建更复杂网络服务和应用的基石。网络技术的不断发展可能会带来新的协议和标准,但这些基本协议的核心概念和原理将继续是理解和创新网络技术的关键。
124 0
|
3月前
|
前端开发 C# 开发者
WPF开发者必读:MVVM模式实战,轻松构建可维护的应用程序,让你的代码更上一层楼!
【8月更文挑战第31天】在WPF应用程序开发中,MVVM(Model-View-ViewModel)模式通过分离关注点,提高了代码的可维护性和可扩展性。本文详细介绍了MVVM模式的三个核心组件:Model(数据模型)、View(用户界面)和ViewModel(处理数据绑定与逻辑),并通过示例代码展示了如何在WPF项目中实现MVVM模式。通过这种模式,开发者可以更高效地构建桌面应用程序。希望本文能帮助你在WPF开发中更好地应用MVVM模式。
166 0
|
3月前
|
网络协议 编译器 Go
揭秘!TCP、RPC、gRPC、HTTP大PK,谁才是网络通信界的超级巨星?一篇文章带你秒懂!
【8月更文挑战第25天】本文以教程形式深入对比了TCP、RPC、gRPC与HTTP这四种关键通信协议,并通过Go语言中的示例代码展示了各自的实现方法。TCP作为一种可靠的传输层协议,确保了数据的完整性和顺序性;RPC与gRPC作为远程过程调用框架,特别适合于分布式系统的函数调用与数据交换,其中gRPC在性能和跨语言支持方面表现出色;HTTP则是广泛应用于Web浏览器与服务器通信的应用层协议。选择合适的协议需根据具体需求综合考量。
223 0

热门文章

最新文章