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月前
|
缓存 网络协议 安全
计算机网络 TCP、RPC、GRPC、HTTP 对比
【1月更文挑战第1天】计算机网络 TCP、RPC、GRPC、HTTP 对比
|
6月前
|
存储 iOS开发 开发者
使用克魔助手进行iOS数据抓包和HTTP抓包的方法详解
使用克魔助手进行iOS数据抓包和HTTP抓包的方法详解
103 0
|
5月前
|
网络协议 安全 Java
Java网络编程入门涉及TCP/IP协议理解与Socket通信。
【6月更文挑战第21天】Java网络编程入门涉及TCP/IP协议理解与Socket通信。TCP/IP协议包括应用层、传输层、网络层和数据链路层。使用Java的`ServerSocket`和`Socket`类,服务器监听端口,接受客户端连接,而客户端连接指定服务器并交换数据。基础示例展示如何创建服务器和发送消息。进阶可涉及多线程、NIO和安全传输。学习这些基础知识能助你构建网络应用。
50 1
|
3月前
|
XML 安全 Android开发
Flutter配置Android和IOS允许http访问
Flutter配置Android和IOS允许http访问
120 3
|
5月前
|
移动开发 Java
Java Socket编程 - 基于Socket实现HTTP下载客户端
Java Socket编程 - 基于Socket实现HTTP下载客户端
35 1
|
6月前
|
Android开发 数据安全/隐私保护 iOS开发
ios和安卓测试包发布网站http://fir.im的注册与常用功能
ios和安卓测试包发布网站http://fir.im的注册与常用功能
285 0
ios和安卓测试包发布网站http://fir.im的注册与常用功能
|
5月前
|
网络协议 安全 网络性能优化
HTTP、HTTPS和TCP的特点和三者的区别
TCP提供连接、可靠性、流量和拥塞控制,HTTP基于请求-响应模型且无连接、无状态,HTTPS则通过数字证书确保服务器身份验证和加密通信。
|
5月前
|
JSON 安全 Java
JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求
JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求
75 0
|
6月前
|
网络协议 Linux Windows
TCP/IP、Http、Socket之间的区别
TCP/IP、Http、Socket之间的区别
144 3
|
6月前
|
移动开发 iOS开发 Perl
iOS客户端和h5页面的互相调用,服务器和客户端间通信方式
iOS客户端和h5页面的互相调用,服务器和客户端间通信方式
93 0