Socket网络协议简单介绍和使用
2014-03-01 00:44
656 查看
在Unix中,网络既是Socket,并不局限在TCP/UDP ,Socket可以用于自定义协议,例如:QQ
通信的两端都是Socket
网络通信其实就是Socket间的通信
数据在两个Socket间通过IO传输
Socket通讯流程图:
socket通信的特点:使用Socket开发网络通讯
在Web服务(WebServices=>XML)大行其道的今天,调用Web服务的代价是高昂的,尤其是仅仅是抓取少量数据的时候尤其如此。
而使用Socket,可以只传送数据本身而不用进行XML封装,大大降低数据传输的开销(JSON)
Socket允许使用长连接,允许应用程序运行在异步模式(提高效率),只有在需要的时候才接收数据
iOS中常用的两种Socket类型
流式Socket(SOCK_STREAM):流式是一种面向连接的Socket,针对于面向连接的TCP服务应用
数据报式Socket(SOCK_DGRAM):数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用
简单步骤:
网络连接设置
设置网络连接,绑定到主机和端口
设置输入流和输出流的代理,监听数据流的状态
将输入输出流添加至运行循环
打开输入流和输出流
发送消息给服务器
有可读取字节时,读取服务器返回的内容
到达流末尾时,关闭流,同时并从主运行循环中删除
- (void)connectToServer:(NSString *)hostName port:(NSInteger)port { // 要进行Socket开发,以下代码都是固定的 // 设置网络 CFReadStreamRef readStream; CFWriteStreamRef writeStream; // 此方法可以连接到服务器,并分配输入流和输出流的内存空间 CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)hostName, port, &readStream, &writeStream); // 记录已经分配的输入流和输出流 _inputStream = (__bridge NSInputStream *)readStream; _outputStream = (__bridge NSOutputStream *)writeStream; // 设置代理,监听输入流和输出流中的变化 _inputStream.delegate = self; _outputStream.delegate = self; // Scoket是建立的长连接,需要将输入输出流添加到主运行循环 // 如果不将流加入主运行循环,delegate拒绝工作 [_inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; [_outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; // 打开输入流和输出流,准备开始文件读写操作 [_inputStream open]; [_outputStream open]; }
#pragma mark NSStream的代理方法
/**
NSStreamEventNone = 0, // 无事件
NSStreamEventOpenCompleted = 1UL << 0, // 建立连接完成
NSStreamEventHasBytesAvailable = 1UL << 1, // 有可读的字节,接收到了数据,可以读了
NSStreamEventHasSpaceAvailable = 1UL << 2, // 可以使用输出流的空间,此时可以发送数据给服务器
NSStreamEventErrorOccurred = 1UL << 3, // 发生错误
NSStreamEventEndEncountered = 1UL << 4 // 流结束事件,在此事件中负责做销毁工作
*/
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
switch (eventCode) {
case NSStreamEventOpenCompleted:
NSLog(@"连接完成");
break;
case NSStreamEventHasBytesAvailable:
NSLog(@"有可读字节");
// 读从服务器接收到得数据,从输入流中读取
// 先开辟一段缓冲区以读取数据,用空间来换取程序的简单
uint8_t buffer[1024];
// read返回的是输入流缓冲区中实际存储的字节数
NSInteger len = [_inputStream read:buffer maxLength:sizeof(buffer)];
if (len > 0) { // 读到数据
// 将buffer中的数据,转换成字符串,输出
NSString *str = [[NSString alloc] initWithBytes:buffer length:len encoding:NSUTF8StringEncoding];
// 将接收到的内容添加到数组
[_dataList addObject:str];
// 刷新表格
[_tableView reloadData];
}
break;
case NSStreamEventHasSpaceAvailable:
NSLog(@"可以写入数据");
break;
case NSStreamEventErrorOccurred:
NSLog(@"发生错误");
break;
case NSStreamEventEndEncountered:
NSLog(@"流结束");
// 做善后工作
// 关闭流的同时,将流从主运行循环中删除
[aStream close];
[aStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
default:
break;
}
}
相关文章推荐
- Socket网络协议简单介绍和使用
- iOS开发中大部分App的网络数据交换是基于HTTP协议的。本文将简单介绍在Swift中使用HTTP进行网络请求的几种方法。
- Linux Socket网络编程 分别使用TCP协议 和 UDP协议
- python使用socket进行简单网络连接的方法
- 网络协议初探和Socket的使用
- c# socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
- IOS学习之 网络编程(10)--简单介绍ASI框架的使用
- 使用SuperSocket实现TLV自定义协议网络通信的Demo
- 关于网络传输协议的介绍(TCP、UDP、IP、Http、Socket)
- 计算机网络自顶向下 :应用层(简单概念和http协议相关简单介绍)
- iOS开发网络—09简单介绍ASI框架的使用
- 常见网络协议简单介绍
- 网络编程:使用Socket实现简单的服务器和客户端的通信
- 【网络协议】TCP协议简单介绍
- 移动网络应用开发中,使用 HTTP 协议比起使用 socket 实现基于 TCP 的自定义协议有哪些优势?
- could not install *smartsocket* listaner cannot bind to 127.0.0.1:5037: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次
- 简单的网络协议介绍
- Android Netroid框架介绍及使用,又一简单粗暴的网络框架!<Garry进阶(二)>
- 移动网络应用开发中,使用 HTTP 协议比起使用 socket 实现基于 TCP 的自定义协议有哪些优势?
- 百度笔试题2005题目大致是这样的: 第一部分选择题: 有几道网络相关的题目,巨简单,比如第一题是TCP、RIP、IP、FTP中哪个协议是传输层的......。有一道linux的 chown使用题目。其他的全是数据结构的题目!什么链,表