在国庆这段时间里用零星的一些时间看了一下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

socket初级使用(客户端)相关推荐

  1. 使用C++的Socket实现从客户端到服务端,服务端到客户端传输文件

    使用: (1)首先运行服务端,待服务端运行起来: (2)最后运行客户端,输入要传输文件到哪个目标机器的IP地址: (3)输入传输文件的路径及文件(完成的路径),其中包含文件的类型,也就是后缀需要包含( ...

  2. Socket简介及客户端服务器连接实例

    注:  在客户端游戏开发中,使用HTTP进行网络通信的比较少,一般使用的都是Socket进行通信.而HTTP一般用于网页或者网页游戏. [Socket简介] 1.套接字(socket)概念 套接字(s ...

  3. android socket io和服务器_Java socket通讯服务器和客户端教学版

    什么是socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API), ...

  4. Socket之UDP客户端【Python】

    下面是其他相关的终端的创建: Socket之TCP服务器[Python] Socket之TCP客户端[Python] Socket之UDP服务器[Python] 在我们编写的4个终端中,UDP客户端的 ...

  5. Socket之TCP客户端【Python】

    下面是其他相关的终端的创建: Socket之TCP服务器[Python] Socket之UDP服务器[Python] Socket之UDP客户端[Python] 同样的,跟创建TCP服务器一样,我们也 ...

  6. Socket实现Android客户端与服务器的通信

    前言:题目要求故写一下总结. 1.什么是Socket? 网络用语叫套接字原理是基于tcp/ip 协议的一种通信手段,目前题目中要求无非就是当客户端数据异常时推送给服务器报警信息 往常接下来都是先看效果 ...

  7. socket java 客户端_Java基于socket实现的客户端和服务端通信功能完整实例

    本文实例讲述了Java基于socket实现的客户端和服务端通信功能.分享给大家供大家参考,具体如下: 以下代码参考马士兵的聊天项目,先运行ChatServer.java实现端口监听,然后再运行Chat ...

  8. Linux Socket 两个客户端通信,服务端作为中转

    Socket 两个客户端通信,服务端作为中转 Socket两个客户端通信,服务端作为中转,通过sockket的通信原理,简单的做了一个以c语言写的服务端,与自己制作的Android app 与树莓派为 ...

  9. Socket在iOS客户端上的简单实现 - 利用GCAsyncSocket框架

    Socket在iOS客户端上的简单实现 - 利用GCAsyncSocket框架 GCAsyncSocket 这是一个2003的开发出来的一个开源框架 首先把GCDAsyncSocket的.h和.m文件 ...

最新文章

  1. 7个值得推荐的优质软件,让人忍不住体验!
  2. hadoop之MapReduce自定义二次排序流程实例详解
  3. linux共享内存示例,linux 进程间共享内存示例
  4. 最近很火的桌面小猫代打器 人性化UI设置界面
  5. MySQL高级知识(六)——索引优化
  6. 当动态T-SQL语句遇到除零的问题
  7. 深入浅出mysql 出版社_深入浅出mysql
  8. 仿真软件proteus构建流水灯实验
  9. 照相机的计算机微处理器芯片是什么,芯片到底是什么?
  10. Elasticsearch高级(Shards、高可用集群搭建)
  11. C#语言实例源码系列-实现Word转换TXT
  12. springboot中的各个模块及其功能
  13. 微信如何查看是否被删好友,这4种方法简单快捷!
  14. echarts 显示隐藏后宽度高度变小问题
  15. day35 数据库的初步认识
  16. spoon各个控件的说明
  17. 单片机右移c语言程序,51单片机+点阵8*8上、下、左、右移显示C程序(原创)
  18. PyQt5--UI大全
  19. SQL Server 2012 导出数据及分离MDF、LDF
  20. 清华工科博士答辩PPT(转载)

热门文章

  1. 算法篇---java经典问题!!!
  2. 记录一些容易忘记的属性 -- UITabBarController
  3. 【转】测试过程管理案例6---如何做项目的测试经理?
  4. WPF疑难杂症之二(全屏幕窗口)
  5. postman提取返回值
  6. Python 3.8.0a2 发布,面向对象编程语言
  7. fastlane use_legacy_build_api true
  8. 【效率专精系列】善用API统一描述语言提升RestAPI开发效率
  9. 3.SFB标准版前端安装
  10. SCOM数据库整理索引计划出错