• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >swift > iOS socket网络编程实例详解

iOS socket网络编程实例详解

作者:jiuchabaikaishui 字体:[增加 减小] 来源:互联网 时间:2017-05-28

jiuchabaikaishui 通过本文主要向大家介绍了ios socket,ios socket网络编程,ios socket通信,ios socket编程,ios socket发送空格等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

代码下载

服务端代码下载地址

客户端代码下载地址

相关概念

socket是一个针对TCP和UDP编程的接口,你可以借助它建立TCP连接等。socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口。

socket连接:socket连接就是所谓的长连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉;但是由于各种环境因素可能会是连接断开,比如说:服务器端或客户端主机down了,网络故障,或者两者之间长时间没有数据传输,网络防火墙可能会断开该连接以释放网络资源。所以当一个socket连接中没有数据的传输,那么为了维持连接需要发送心跳消息~~具体心跳消息格式是开发者自己定义的。

TCP连接的三次握手:

第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”。

socket建立网络连接的步骤

建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。

套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

1。服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

2。客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

3。连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

BSD socket

BSD socket:完全由c语言实现,并且可以在Objective-C代码中使用。

优点:不同平台中易于移植

缺点:

无法访问操作系统内建的网络特性(比如系统范围的VPN)。
更糟糕的是初始化socket连接并不会自动打开设备的Wi-Fi或是蜂窝网络,无线网络会智能的关闭以节省电池电量,任何通信连接都会失败,除非其他网络进程激活了无线网。

CFNetwork对BSD Socket的分装可以激活设备的无线网,所以几乎所有场景都建议使用CFNetwork而不是BSD Socket.

最常用的API:

1.int socket(int, int, int):创建并初始化新的socket,如果成功放回一个文件描述符,如果失败返回0。

2.int bind(int, const struct sockaddr *, socklen_t):为指定的地址与端口号分配socket。

3.int listen(int, int) __DARWIN_ALIAS(listen):用于服务端监听客户端

4.int accept(int, struct sockaddr * __restrict, socklen_t * __restrict):接受连接请求,将客户端地址存储到clientAddress中。

5.int connect(int, const struct sockaddr *, socklen_t):连接到指定的服务器。

6.ssize_t send(int, const void *, size_t, int):在socket上最多发送XX数据。

7.ssize_t recv(int, void *, size_t, int):在socket上最多读取XX数据。

……

服务端逻辑:如果接收到客户端发送过来”1”,那么回复”你猜!”;客户端发送过来”2”,那么回复”谢谢!”;客户端发送过来”3”,那么回复”对不起!”;客户端发送过来”4”,那么回复”好的!”;客户端发送过来其他的内容,那么一半概率原样回复,一半概率回复”不知道你在说什么!”。

屏幕快照 2017-03-16 下午2.16.02.png

创建服务端:

1.创建socket

struct sockaddr_in server_addr;
 server_addr.sin_len = sizeof(struct sockaddr_in);
 server_addr.sin_family = AF_INET;//AF_INET互联网地址簇
 server_addr.sin_port = htons(port);
 server_addr.sin_addr.s_addr = inet_addr(address);
 bzero(&server_addr.sin_zero, 8);
 //创建socket
 int server_socket = socket(AF_INET, SOCK_STREAM, 0);//SOCK_STREAM 有链接
 if (server_socket == -1) {
  perror("socket error!");
  return 1;
 }
</div>

2.绑定socket:将创建的socket绑定到本地的IP地址和端口,此socket是半相关的,只是负责侦听客户端的连接请求,并不能用于和客户端通信

 int bind_result = bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr));
 if (bind_result == -1) {
  perror("bind error!");

  return 1;
 }
</div>

3.listen侦听

 if (listen(server_socket, 5)) {
  perror("listen error!");
  return 1;
 }
</div>

4.接受客户端连接

int client_socket;
 socklen_t address_len;
 struct sockaddr_in client_address;
 for (; ; ) {
  address_len = sizeof(client_address);
  client_socket = accept(server_socket, (struct sockaddr*)&client_address, &address_len);
  //1.使用多线程
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   //这个函数进行数据操作
   str_echo(client_socket);
  });
 }
</div>

5.接收和发送数据

 char buf[1024];
 while (1) {
  bzero(buf, 1024);
  long byte_num = recv(socket, buf, 1024, 0);
  if (byte_num < 0) {
   return;
  }
  buf[byte_num] = '\0';
  printf("client said:%s\n", buf);
  char *result;
  NSString *str = [NSString stringWithCString:buf encoding:NSUTF8StringEncoding];
  if ([str isEqualToString:@"1"]) {
   result = "你猜!";
  }
  else if ([str isEqualToString:@"2"])
  {
   result = "谢谢!";
  }
  else if ([str isEqualToString:@"3"])
  {
   result = "对不起!";
  }
  else if ([str isEqualToString:@"4"])
  {
   result = "好的!";
  }
  else
  {
   if (arc4random()%2 == 0) {
    result = "不知道你在说什么!";
   }
   else
   {
    result = buf;
   }
  }
  send(socket, result, 1024, 0);
 }
</div>

创建客户端:

struct sockaddr_in server_addr;
 server_addr.sin_len = sizeof(struct sockaddr_in);
 server_addr.sin_family = AF_INET;
 server_addr.sin_port = htons(11332);
 server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
 bzero(&(server_addr.sin_zero), 8);
 int server_socket = socket(AF_INET, SOCK_STREAM, 0);
 if (server_socket == -1) {
  perror("socket error");
  return 1;
 }
 char receive_msg[1024];
 char reply_msg[1024];
 if (connect(server_socket, (struct sockaddr*)&server_addr, sizeof(struct sockaddr_in)) == 0) {
  //connect 成功之后,其实系统将你创建的socket绑定到一个系统分配的端口上,且其为全相关,包含服务器端的信息,可以用来和服务器端进行通信。
  while (1) {
   bzero(reply_msg, 1024);
   printf("replay:");
   scanf("%s", reply_msg);
   if (send(server_socket, reply_msg, 1024, 0) == -1) {
    perror("send error!");
    return 1;
   }
   bzero(receive_msg, 1024);
   long byte_num = recv(server_socket, receive_msg, 1024, 0);
   receive_msg[byte_num] = '\0';
   printf("server said:%s\n", receive_msg);
  }
 }
 return 0;
</div>

NSStream 读写文件

Cocoa

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • iOS socket网络编程实例详解

相关文章

  • 2017-05-28Swift心得笔记之字符串
  • 2017-05-28Swift快速集成下拉刷新和上拉加载更多示例代码
  • 2017-05-28Swift中定义二维数组的方法及遍历方法示例
  • 2017-05-28swift学习文档(笔记)
  • 2017-05-28Swift编程之枚举类型详解
  • 2017-05-28深入理解Swift中的访问控制关键字
  • 2017-05-28使用Post方法模拟登陆爬取网页的实现方法
  • 2017-05-28详解Swift编程中下标的用法
  • 2017-05-28支付宝开发平台之第三方授权登录与获取用户信息
  • 2017-05-22Swift 可选(Optionals)类型

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • FineReport中自定义登录界面的方法
    • Swift中使用正则表达式的一些方法
    • iOS UITableView展开缩放动画实例代码
    • 10个惊艳的Swift单行代码
    • 零基础上手Swift快速入门教程概览
    • eclipse中maven插件安装教程
    • Swift中通过叠加UILabel实现混合进度条的方法
    • Swift心得笔记之控制流
    • Swift教程之方法详解
    • Swift编程中实现希尔排序算法的代码实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有