socket初级使用(客户端)

  在国庆这段时间里用零星的一些时间看了一下socket的学习资料,由于笔者偏向学习实用方面的内容,因此此篇文章涉及理论知识较少,主要是以实现思路(怎么做)为主,但在实现之前还是需要了解一些基础的理论知识(如果其中有误请指出)

  TCP是用socket来实现,或者说socket就是对TCP的封装,因此要想明白Socket连接,先要明白TCP连接。

  TCP(传输控制协议)(对应TCP的另一种协议是UDP协议,读者可自行查阅相关资料)

  作用:建立连接,形成传输数据的通道

  特点:在连接中进行大数据传输(数据大小不收限制)

  优点:通过三次握手完成连接,是可靠协议,安全送达(关于三次握手可以用打电话的例子说明)

劣势:必须建立连接,效率会稍低
通过此图可以看出通信的两端都是Socket,因此网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输
这里不做服务端介绍,主要介绍客户端的实现,以下为实现代码及说明
/**    
      主要实现思路* 1.创建主机地址,设置端口号2.连接到主机3.将c语言输入输出流转化为oc语言并代理4.打开输入输出流,并加入消息循环池
     最后个根据代理方法来监听输入输出流的变化即可 
*///设置主机地址和端口号根据服务端所给端口号设置NSString *host = @"127.0.0.1";int port = 12345;//创建c语言输入输出流 CFReadStreamRef readStream;CFWriteStreamRef writeStream;//链接至主机CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);//将c语言输入输出流转化为oc对象,此处用到定义好的OC全局变量_outputStream = (__bridge NSOutputStream *)writeStream;_inputStream = (__bridge NSInputStream *)readStream;//设置代理_outputStream.delegate = self;_inputStream.delegate = self;//打开输入输出流通道并监听 [_outputStream open];[_inputStream open];//加入消息循环池,若不放入消息循环池不能做到监听 [_outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];[_inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

接下来实现输入输出流的代理方法让我们可以实时监听输入输出流的改变

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {switch (eventCode) {case NSStreamEventOpenCompleted:
//            NSLog(@"%@",[aStream class]);NSLog(@"连接到主机完成");break;case NSStreamEventHasBytesAvailable:
//            NSLog(@"%@",[aStream class]);NSLog(@"有字节可读");
       //读取对应的字节[self readData];
break;case NSStreamEventHasSpaceAvailable:NSLog(@"%@",[aStream class]);NSLog(@"可发送字节");break;case NSStreamEventErrorOccurred:NSLog(@"链接错误");break;case NSStreamEventEndEncountered:NSLog(@"断开链接");//链接断开后需要关闭输出输出流通道并将其移出消息循环池 [_outputStream close];[_inputStream close];[_outputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];[_inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];break;default:break;} }

 对应的就有输出数据和输入数据

    //输出数据,此处name需要匹配服务器端输入格式要求NSString *name = [@"iam:" stringByAppendingString:@"lisi"];//做出对应的转化 NSData *data = [name dataUsingEncoding:NSUTF8StringEncoding];//将数据输出
    [_outputStream write:data.bytes maxLength:data.length];//有输出后输入端会监听到接收了新的数据此处就可以直接读取
- (void)readData {//设置一个字符数组用于接收字符数据uint8_t buff[1024];//获取字符数据并得到其长度NSUInteger length = [_inputStream read:buff maxLength:sizeof(buff)];//将接收的字符数组转化为OC对象NSString *receving = [[NSString alloc] initWithBytes:buff length:length encoding:NSUTF8StringEncoding];NSLog(@"%@",receving);
}

  从上述代码中可以看出socket的使用方法其实还是较为简单,关键是需要理解到其实现步骤,只要记住了步骤再做出对应的转化就能很好的实现,当然此处只是最简单的socket编程。希望此文对各位有帮助,最后祝大家国庆快乐!

转载于:https://www.cnblogs.com/purple-sweet-pottoes/p/4856955.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CRC16循环冗余校验 RTU-MODBUS标准 Linux C

1、概述 CRC16循环冗余校验常用在MODBUS协议中,用于校验报文的完整性。CRC16校验值为uint16_t 无符号整形2字节,在MODBUS协议中,低检验字节在前,高校验字节在后,比如校验结果crc160x1788,则MODBUS中的校验…

第11章 路由器OSPF动态路由配置

实验目标: 一、掌握OSPF协议的配置方法; 二、掌握查看通过动态路由协议OSPF学习产生的路由信息; 三、熟悉广域网线缆连接方式; 技术原理: OSFP开放式最短路径优先协议,是目前网络中最广泛的路由协议之一。属…

Hi3515的开发板 Hi3515 SDK编译出错 提示缺少libpciv.a的解决办法

From: http://zyd87818.blog.163.com/blog/static/17488150120124300261687/ 这是HI3515说明文档的说明 但是我进去编译却通不过,提示错误如下 通过qq群里的好人帮助解决方法如下首先看一下makefile自己看不懂,经高人指点需要修改Makefile.param文件…

[react] React为什么要搞一个Hooks?

[react] React为什么要搞一个Hooks? 动机 Hook 解决了我们五年来编写和维护成千上万的组件时遇到的各种各样看起来不相关的问题。无论你正在学习 React,或每天使用,或者更愿尝试另一个和 React 有相似组件模型的框架,你都可能对这…

有关Botton的用法(二)

关于设置listener监听onClicked事件的步骤分析 Steps: 1.tell android you are interested in listening to a button click 2.bring your xml button inside java 3.tell your java button whose responding when its clicked 4.what should happen when button is clicked 1 …

poj1222

题意:一个01矩阵,表示灯的亮灭状态,每次操作可以改变一个十字形状内的五个灯的状态。问能否将所有灯熄灭。 分析:高斯消元法 对于每个灯的两灭有影响的开关就是它附近十字形内的五个开关。所以对于每个灯可以列一个方程&#xff0…

[react] React Hooks帮我们解决了哪些问题?

[react] React Hooks帮我们解决了哪些问题? React hooks help use get rid of js class and all trouble with this pointer. 个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌…

李秋红130705010066

3-9、没有冗余度的信源还能不能压缩?为什么? 解答:可以压缩。这种情况下,不能使用无损压缩,但可以使用有损压缩。 3-10、不相关的信源还能不能压缩?为什么? 解答:可以压缩。对于不相…

iphone开发我的新浪微博客户端-用户登录准备篇(1.1)

首先说一下我这个的实现思路,登录支持多个账号,也就是说可以保存多个微博账号登录的时候选择其中一个登录。多个账号信息保存在sqlite的数据库中, 每一个账号信息就是一条记录, 当用户启动微博客户端的时候去取保存在sqlite数据库中的账号记录…

基于密度的异常值检测方法整理

基于密度的异常值检测方法的原理认为正常样本点所处的类簇密度要高于异常点样本所处的类簇密度。为解决实际异常值检测情况 中出现的问题,有一种基于局部异常因子 LOF 方法。

[react] 有在项目中使用过Antd吗?说说它的好处

[react] 有在项目中使用过Antd吗?说说它的好处 They gave every user a big surprise on Christmas Holiday. 个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端…

TCP的流模式与UDP的报文模式对比

1 案例背景 在学习TCP-IP协议详解卷一时,读到介绍TCP协议的部分,发现TCP的首部是没有报文总长度字段的,而在UDP中是有的,对这个问题的思考引出了两者之间的区别。 2 案例分析 TCP报文的格式: TCP首部的格式&a…

GWT 入门介绍

From: http://blog.csdn.net/struts2/article/details/1758122 GWT 入门介绍 GWT使用JSON格式的数据通讯 GWT是 Google Web Toolkit的简称。 GWT是一个以Java语言为工具,以类似Swing的方式编写UI组件,之后通过GWT Compiler编译 为JavaScritp和HTM…

SQL Server 2008空间数据应用系列十一:Bing Maps中呈现GeoRSS订阅的空间数据

友情提示,您阅读本篇博文的先决条件如下: 1、本文示例基于Microsoft SQL Server 2008 R2调测。 2、具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验。 3、熟悉或了解Microsoft SQL Server 2008中的空间数据类型。 4、具备相应&am…

聚类算法的分类整理

1、基于划分的聚类算法 基于划分的聚类算法 主要通过聚类中心的迭代重置,直到达到“簇内点足够近,簇间点足够远”的目标效果,完成样本集的最优化分。其算法优点是时间、空间复杂度低,可以处理大规模数据集。缺点包括容易陷入局部…

[react] 为什么标签里的for要写成htmlFor呢?

[react] 为什么标签里的for要写成htmlFor呢? 为了区别和html自身标签中属性 个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

minGW64安装和使用 极简教程

1、下载minGW64 官网下载:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/我的FTP:a、minGW64 install.exe b、解压免安装版 2、解压 3、添加环境变量 4、CMD 运行gcc 安装完成。 5、使用minGW编译C源码 6、运行

培训总结2

今天,我学习了工具类java.util.包中的几个平时经常用到的几个类,例如ArrayList、HashMap、Hashtable等几个类,在这我总结一下ArrayList的用法。 特征:允许null在内的所有元素,大致上等同于Vector类,但是他是…

GWT 开发入门

From: http://home.cnblogs.com/group/topic/47694.html 在使用GWT开发web程序时,首先得到GWT下载其SDK,目前的最新版为GWT 2.3。 安装插件,目前两大Java IDE: Eclipse 和 NetBeans都有其开发插件,建议使用Eclipse &…