Socket在百度百科的定义

  网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

 相关的描述

  Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。

  在Internet上的主机一 般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。

  Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。

 正如上述的介绍Socket一定包含了通信的双发,即客户端(Client)与服务端(server)。

  • 服务器利用Socket监听端口

  • 客户端发起连接

  • 服务端返回信息,建立连接,开始通信

  • 客户端,服务端断开连接

Socket 第三方 GCDAsyncSocket 的下载地址:https://github.com/AlonerOwl/socket

 一、服务器端:

  在服务器端构建的时候,我们需要导入第三方框架和其他的一些C语言包

#import "GCDAsyncSocket.h"

#include <arpa/inet.h>
#include <net/if.h>
#include <ifaddrs.h>

  1、声明一个 socket 并进行初始化 socket

/// 服务器端socket,决定不能使用局部变量,不能被销毁
@property (nonatomic, strong) GCDAsyncSocket *socket; // 初始化socket
self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

  2、绑定端口,监听连接消息

   端口号设置:端口号大于1024,不能使用市面上已经被占用的断开 eg.8080,8800,因此在绑定时,要进行一个安全判断。

    NSError *error;
// 绑定端口,监听连接消息
BOOL result = [self.socket acceptOnPort:[self.portTextField intValue] error:&error];

  3、监听客户端,获取新的socket连接之后调用以下方法,并进行一些逻辑处理

// 参数1:当前服务器的socket
// 参数2:接收到的客户端的新socket
- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket;

  4、读取消息

   读取方法是哪个socket调用就读取哪个socket的携带消息(对应的是客户端发送消息)

    // -1 不限定读取时间,tag为一个标记值
[newSocket readDataWithTimeout:- tag:];

  5、写数据

   写给谁就用谁来调用

// string 变量就是我们要写入的消息,它需要转为Data
// -1 和读取消息时的意思一样,表示不限定时间
// tag 为标记值,一般置为0
[newSocket writeData:[string dataUsingEncoding:NSUTF8StringEncoding] withTimeout:- tag:];

  6、读取到 socket 的消息,在 readDataWithTimeout 后执行

   主要用于对接收到消息的处理和将消息转发给另一个接收的客户端,这样就起到两个客户端的通信,具体数据格式和逻辑根据个人需求自行处理。以下方法和readDataWithTimeout 方法配套执行,只要有 readDataWithTimeout 方法,就会有下面的方法

// 参数1:服务器的socket
// 参数2:服务器读取的数据
// 参数3:标记
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;

  7、关闭服务器

  将服务器的 socket 断开连接后置为nil

#pragma mark - 关闭服务
- (IBAction)stopService:(NSButton *)sender
{
if (self.socket) {
#warning 关闭
[self.socket disconnect];
self.socket = nil;
[self addInfoString:@"关闭服务"];
} else {
[self addInfoString:@"已经关闭,无需重复"];
}
}

  8、监听连接的断开

  当服务器断开连接后调用,主要用于处理socket存储列表。

// 已经断开连接时调用,监听连接的断开,并且处理socket存储列表
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
{
// [self addInfoString:[NSString stringWithFormat:@"已经断开连接 %@", err]];
[self addInfoString:[NSString stringWithFormat:@"已经断开连接"]]; if ([self.clients allKeysForObject:sock].count > ) {
// 当客户端断开时,进行一些删除socket的操作
[self.clients removeObjectForKey:[self.clients allKeysForObject:sock][]];
NSLog(@"%@", self.clients);
} else {
// 当服务器socket断开时,处理客户端socket列表
[self.clients removeAllObjects];
NSLog(@"%@", self.clients);
}
}

二、客户端

  在构建客户器端的时候,需要导入第三方的类

#import "GCDAsyncSocket.h"

  1、声明和初始化客户端socket(和服务器端类似)

@interface ViewController () <GCDAsyncSocketDelegate>
{
// client端socket
GCDAsyncSocket *_clientSocket;
} @end _clientSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

  2、连接服务器

// 参数1:服务器的IP地址
// 参数2:服务器的端口号(服务器绑定的端口号)
// 参数3:错误信息
- (BOOL)connectToHost:(NSString*)host onPort:(uint16_t)port error:(NSError **)errPtr

  3、连接到服务器后执行的代理方法

   主要用于从服务器中读取数据

// 连接到服务器
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
{
NSLog(@"连接到服务器");
_serverSocket = sock;
// 读数据
[_serverSocket readDataWithTimeout:- tag:];
}

  4、读到服务器反馈的数据

   方法和服务器第6步的方法一样,对服务器反馈的数据进行处理和利用

  5、读写消息的方法后服务器端是一样的,在这里我就不再重复介绍了,大家可以参照服务器的读写消息的方法

三、下面是自己学习的一个简易版的Demo,有兴趣的朋友可以下载看看

 下载地址:https://github.com/AlonerOwl/Socket-

【原】iOS学习之Socket的更多相关文章

  1. iOS学习之Socket使用简明教程- AsyncSocket

    转载自:http://my.oschina.net/joanfen/blog/287238 如果需要在项目中像QQ微信一样做到即时通讯,必须使用socket通讯,本人也是刚学习,分享一下,有什么不对的 ...

  2. iOS 学习 - 17.Socket

    Socket 是应用层与 TCP / IP 协议通信的中间软件抽象层,它是一组接口   TCP:面向连接.传输可靠(保证数据正确性,保证数据顺序).用于传输大量数据(流模式).速度慢,建立连接需要开销 ...

  3. 原 iOS深入学习(Block全面分析)http://my.oschina.net/leejan97/blog/268536

    原 iOS深入学习(Block全面分析) 发表于1年前(2014-05-24 16:45)   阅读(26949) | 评论(14) 39人收藏此文章, 我要收藏 赞21 12月12日北京OSC源创会 ...

  4. 【原】iOS学习之事件处理的原理

    在iOS学习23之事件处理中,小编详细的介绍了事件处理,在这里小编叙述一下它的相关原理 1.UITouch对象 在触摸事件的处理方法中都会有一个存放着UITouch对象的集合,这个参数有什么用呢? ( ...

  5. 【原】iOS学习47之第三方-FMDB

    将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB ...

  6. 【原】iOS学习之第三方-AFNetworking1.3.0

    将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 AFNetworking 第三方集成到工程中,具体请看上篇博客iOS学习46之第三方CocoaPods的安装和使用(通用方 ...

  7. 【原】iOS学习之SQLite和CoreData数据库的比较

    1. SQLite数据库 sqlite数据库操作的基本流程是, 创建数据库, 再通过定义一些字段来定义表格结构, 可以利用sql语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系. ...

  8. iOS学习路线图

    一.iOS学习路线图   二.iOS学习路线图--视频篇       阶 段 学完后目标 知识点 配套学习资源(笔记+源码+PPT) 密码 基础阶段 学习周期:24天       学习后目标:    ...

  9. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

随机推荐

  1. Python Day3

    一.set集合 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 # 创建数值集合 list_1 = ...

  2. mysql设置远程访问权限

     查一下你的MYSQL用户表里, 是否允许远程连接  1.授权 mysql>grant all privileges on *.*  to  'root'@'%'  identified by  ...

  3. Redis中持久化的两种方法详解

    Redis提供了两种不同的持久化方法来将数据存储到硬盘里面.一种方法叫快照(snapshotting),它可以将存在于某一时刻的所有数据都写入硬盘里;另一种方法教只追加文件(append-only f ...

  4. Google 地图 API V3 使用入门

    Google官方教程: Google 地图 API V3 使用入门 Google 地图 API V3 针对移动设备进行开发 Google 地图 API V3 之事件 Google 地图 API V3 ...

  5. Express知识整理

    开发实例 Express开发实例(1) —— Hello,world! Express开发实例(2) —— Jade模板引擎

  6. thinkphp3.2.3之自动完成的实现

    有时候,我们希望系统能够帮我们自动完成一些功能,比如自动为密码加密,忽略空等,这个时候我们就需要利用到自动完成(填写)的功能. ThinkPHP 模型层提供的数据处理方法,主要用于数据的自动处理和过滤 ...

  7. android 项目中如何引入第三方jar包

    http://www.360doc.com/content/13/0828/08/11482448_310390794.shtml

  8. TraceView进行性能分析

    一.TraceView概述 TraceView 是 Android 平台配备一个很好的性能分析的工具.它可以通过图形化的方式让我们了解我们要跟踪的程序的性能,并且能具体到 method. 详细内容参考 ...

  9. css pre标签

    浏览器:firfox49.0.2 在使用<pre>标签输出格式化文本的时候,遇到了一个小问题. 要在页面的底部输出两行文本,但是最后一行的文字总是距离屏幕的底部太大.下面图中的样子: 相关 ...

  10. Ehlib安装方法有窍门

    Ehlib安装方法有窍门,如果不知道该安装方法,很难成功安装,Delphi 7(D5.D6也如此)中的安装方法       1.把EhLib中的common和DataService文件拷贝到Delph ...