您的位置:首页 > 移动开发 > IOS开发

IOS socket 通信机制的实现

2014-11-24 23:12 1246 查看
socket 套接字, 是基于TCP UDP 协议的 一种通信机制, 它本身就是对TCP 和UDp 协议应用的一种管理

iOS 中 socket 通信

1,我们使用第三方库AsyncSocket

准备工作

1, 把AsyncSocket 加入到我们的工程, 这个玩意 一般是手动的, 如果你使用的是自动的, 需要再变异的时候 添加 fno-objec-arc

2, 使用第三方库, 我们需要添加一个类库,CFNetwork.framework

2, 准备工作完成后, 我们下面了解下ios 中socket 的通信 是怎么完成的

1, socket 通信, 首先 有两个端 : 客户端 和 服务端

2, 服务端的工作: 声明一个socket, 因为两个终端的通信, 必须绑定一个端口, 所以 下一步 是绑定端口, 再下一步就是监听端口, 当监听的链接请求的时候, 建立链接成功后, 然后就阻塞 等待客户端发送数据

3, 客户端: 声明一个socket, 第二步 连接指定ip, 和端口, 第三步: 发送数据

示例:

TCP

服务端:

1, 遵守协议(别忘了遵守协议<AsyncSocketDelegate>), 然后声明

_recvSocket = [[AsyncSocketalloc]initWithDelegate:self];

2, 绑定端口

//监听客户端来连接

[_recvSocketacceptOnPort:5678error:nil];
3, 监听连接, 当有链接请求的时候, 调用此方法 并把socket 存到数组 保存起来, 因为TCP 是长连接

[objc]
view plaincopy





- (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket{
[_socketArray addObject:newSocket];
//等待客户端 发送消息 -1 是永远等待
[newSocket readDataWithTimeout:-1 tag:0];
}

4, 等待客户端发送消息, 接受客户端发送消息时触发,

[objc]
view plaincopy





<pre name="code" class="objc">// 监听到客户端发送消息

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
// 继续监听 客户端 发来的消息, 形成循环监听
[sock readDataWithTimeout:-1 tag:0];

}

客户端:

1, 声明

[objc]
view plaincopy





//---客户端
_sendSocket = [[AsyncSocket alloc] initWithDelegate:self];

2, 连接服务端

[objc]
view plaincopy





//-----客户端
//连接至服务端
- (void)conToHost:(id)sender{
//如果是连接状态, 先断开连接
if (_sendSocket.isConnected) {
[_sendSocket disconnect];
}

//连接
[_sendSocket connectToHost:_ipField.text onPort:5678 withTimeout:30 error:nil];
}

3, 发送消息

[objc]
view plaincopy





[_sendSocket writeData:doc.XMLData withTimeout:30 tag:0];

以下两个方法 服务端 和 客户端 都会调用

[objc]
view plaincopy





// 作为服务器的时候, 有人断开连接 ,会调用此方法
//最为客户端 断开连接服务器的时候 也会调用此方法
//断开链接的时候, 别人与你断开连接的时候也会调用
- (void)onSocketDidDisconnect:(AsyncSocket *)sock{

NSLog(@"断开连接");
// [_socketArray removeObject:sock];
}

[objc]
view plaincopy





// 作为服务器的时候, 有人连接成功 ,会调用此方法
//最为客户端 连接成功服务器的时候 也会调用此方法
// 连接成功, 这个客户端 和服务端 都会调用这个方法, 别人链接我的时候 链接成功的时候, 会调用此方法, 我主动链接别人的服务端的时候, 如果连接成功 会调用两次这个方法
- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{

NSLog(@"连接成功%@", host);
}

UDP 通信示例:

因为UDP 发送消息 实现不需要建立连接, 这比TCP 简便多了, UDP 就一个监听接收消息端口的 函数 即可, 比较简单

服务端

1, socket 声明, 并制定委托

[objc]
view plaincopy





//服务端
_recvSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];

2, 绑定 监听的端口

[objc]
view plaincopy





//绑定一个端口
[_recvSocket bindToPort:6789 error:nil];

3, 开始监听 接受消息的端口

[objc]
view plaincopy





//开始监听接收消息
[_recvSocket receiveWithTimeout:-1 tag:0];

4, 监听到消息 调用的函数

[objc]
view plaincopy





//接收到消息, HOST:发送端的ip
- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port{
....
//继续监听 接收消息
[_recvSocket receiveWithTimeout:-1 tag:0];
return YES;
}

客户端

1

[objc]
view plaincopy





//发送端
_sendSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
[_sendSocket bindToPort:6789 error:nil];

2, 发送 , 里面的参数 需要指定 发送目的ip 端口 超时时间等

[objc]
view plaincopy





[_sendSocket sendData:doc.XMLData toHost:_ipTextfiled.text port:6789 withTimeout:30 tag:0];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: