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

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

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

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

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

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

  劣势:必须建立连接,效率会稍低
  
  通过此图可以看出通信的两端都是Socket,因此网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输。
  这里不做服务端介绍,主要介绍客户端的实现,以下为实现代码及说明
  

  1. /**    
          主要实现思路
  2. * 1.创建主机地址,设置端口号
  3. 2.连接到主机
  4. 3.将c语言输入输出流转化为oc语言并代理
  5. 4.打开输入输出流,并加入消息循环池
         最后个根据代理方法来监听输入输出流的变化即可 
  6. */
  7. //设置主机地址和端口号根据服务端所给端口号设置
  8. NSString *host = @"127.0.0.1";
  9. int port = ;
  10. //创建c语言输入输出流
  11. CFReadStreamRef readStream;
  12. CFWriteStreamRef writeStream;
  13. //链接至主机
  14. CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);
  15. //将c语言输入输出流转化为oc对象,此处用到定义好的OC全局变量
  16. _outputStream = (__bridge NSOutputStream *)writeStream;
  17. _inputStream = (__bridge NSInputStream *)readStream;
  18. //设置代理
  19. _outputStream.delegate = self;
  20. _inputStream.delegate = self;
  21. //打开输入输出流通道并监听
  22. [_outputStream open];
  23. [_inputStream open];
  24. //加入消息循环池,若不放入消息循环池不能做到监听
  25. [_outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
  26. [_inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

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

  1. - (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
  2. switch (eventCode) {
  3. case NSStreamEventOpenCompleted:
  4. // NSLog(@"%@",[aStream class]);
  5. NSLog(@"连接到主机完成");
  6. break;
  7. case NSStreamEventHasBytesAvailable:
  8. // NSLog(@"%@",[aStream class]);
  9. NSLog(@"有字节可读");
           //读取对应的字节
  10. [self readData];
  11. break;
  12. case NSStreamEventHasSpaceAvailable:
  13. NSLog(@"%@",[aStream class]);
  14. NSLog(@"可发送字节");
  15. break;
  16. case NSStreamEventErrorOccurred:
  17. NSLog(@"链接错误");
  18. break;
  19. case NSStreamEventEndEncountered:
  20. NSLog(@"断开链接");
  21. //链接断开后需要关闭输出输出流通道并将其移出消息循环池
  22. [_outputStream close];
  23. [_inputStream close];
  24. [_outputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
  25. [_inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
  26. break;
  27. default:
  28. break;
  29. }
  30. }

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

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

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

socket初级使用(客户端)的更多相关文章

  1. Java Socket实现HTTP客户端来理解Session和Cookie的区别和联系

    HTTP协议本身是无状态的,即使是同一台电脑同一个浏览器打开同一个页面两次,服务器不知道这两次请求是同一个客户端发送过来的,两次请求是完全独立的.例如,第一次请求时已经登录了,第二次再请求服务器会“忘 ...

  2. Socket实现聊天客户端

    今天在极客学院上看到了一个关于Socket的视频讲解,感觉还不错,就写了份代码,拿来分享一下. Socket使用方法 关于Socket的使用,我们首先要弄清楚的是,在服务器端还是在客户端使用.因为这的 ...

  3. c#Socket服务器与客户端的开发(1)

    上个项目中用到了Socket通讯,项目中直接借助SuperSocket实现,但是我觉得这毕竟是一个我没接触过的东西,所以也顺便学习了一下原生socket的使用,做了一个socket服务器与客户端的开发 ...

  4. day 29 socket 初级版

    # 客户端介绍简单版# import socket# #1买手机# phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STR ...

  5. 异步Socket服务器与客户端

      本文灵感来自Andre Azevedo 在CodeProject上面的一片文章,An Asynchronous Socket Server and Client,讲的是异步的Socket通信. S ...

  6. Ajax跨域问题及解决方案 asp.net core 系列之允许跨越访问(Enable Cross-Origin Requests:CORS) c#中的Cache缓存技术 C#中的Cookie C#串口扫描枪的简单实现 c#Socket服务器与客户端的开发(2)

    Ajax跨域问题及解决方案   目录 复现Ajax跨域问题 Ajax跨域介绍 Ajax跨域解决方案 一. 在服务端添加响应头Access-Control-Allow-Origin 二. 使用JSONP ...

  7. Socket聊天程序——客户端

    写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细 ...

  8. C#版 Winform界面 Socket编程 Client客户端

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. socket编程中客户端常用函数 以及简单实现

    1 常用函数 1.1   connect() int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen); 客 ...

随机推荐

  1. Postgres-enum

    -- 1. rename the enum type you want to change alter type some_enum_type rename to _some_enum_type; - ...

  2. Box2D淌坑日记: 关节(Joint)和旋转关节(b2RevoluteJoint)

    关节在Box2D的对象组织结构中,与b2Body(刚体)并列.因此两种对象都是由b2World创建并直接管理. 然而Joint有依赖于b2Body的地方,就是它的销毁:当关节所涉及到的刚体被销毁,关节 ...

  3. shell读取文件每行,并执行命令

    #!/bin/bash while read line do $line & done < /path/filename

  4. iOS开发_统计xcode代码行数

    如果要统计ios开发代码,包括头文件的,终端命令进入项目目录下,命令如下 find . -name "*.m" -or -name "*.h" -or -nam ...

  5. ListView简单使用

    先上效果: 主要实现了Listview的绑定和点击事件.项目资源结构如下: 先创建一个动物类,用来装载数据: Animal类如下: package com.example.simplelistview ...

  6. Git 学习01

    一.下载并安装git bash 双击打开出现命令窗口 创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录: cd F: mkdir learngit pwd F/learngit 显示当 ...

  7. SQL基础巩固2

    日期函数 函数名称 含义 示例 GetDate 返回当前系统日期和时间,返回值类型为datetime select GETDATE()//输出当前日期 YEAR 返回指定日期的年份 YEAR('08/ ...

  8. Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形) .

    1.首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, ...

  9. 解析Json需要设置Mime

    IIS6.0 1.打开IIS添加Mime项 关联扩展名:*.json内容类型(MIME):application/x-javascript      2.添加映射: 位置在IIS对应站点右键属性:”主 ...

  10. ios每日一发--仿侧边抽屉效果

    效果图如下 代码实现以及思路下面分析: 代码创建导航控制器 Appdelegate.m中 #import "AppDelegate.h" #import "ViewCon ...