iOS Socket/Tcp编程 GCDAsyncSocket的实战(带回调)
很多同学一听到Socket TCP UDP 这几个字眼感觉特别害怕,很怕在工作当中使用,因为他们太底层了.下面我把我在工作中使用Socket类库GCDAsyncSocket进行一次实战
文章中只适用于小型数据传输, 如果比较到,例如音频文件的话,请自行拼接data.
首先向工程导入GCDAsyncSocket.h/GCDAsyncSocket.m
下载地址:链接:http://pan.baidu.com/s/1c1bHytM密码: p22g
然后创建一个单例类Client 继承于NSObject
Client.h 文件内容如下
#import <Foundation/Foundation.h>
typedef void(^BLOCK)(idresult);
@interface RCClient : NSObject
+ (Client *)shareInstance;
- (void)sendMessage:(NSString *)strcomplete:(BLOCK)block;
@end
Client.m 文件内容如下:
#import "Client.h"
#import "GCDAsyncSocket.h"
// TCP连接
@interface Client ()
@property (nonatomic,strong)GCDAsyncSocket *socket;
@property (nonatomic,copy)BLOCK block;
@property (nonatomic,assign)NSInteger counter;
#define IP @"192.168.1.100"
#define PORT 5555
@end
@implementationClient
- (instancetype)init
{
self = [superinit];
if (self) {
[selfcreateConnection];
}
returnself;
}
+ (Client *)shareInstance {
staticClient *client =nil;
staticdispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
client = [[Clientalloc]init];
});
return client;
}
#pragma mark - 建立连接
- (void)createConnection {
self.socket = [[GCDAsyncSocketalloc]initWithDelegate:selfdelegateQueue:dispatch_get_main_queue()];
// 连接
NSError *error =nil;
[self.socketconnectToHost:IPonPort:PORTerror:&error];
if(error) {
NSLog(@"连接错误%@", error);
return;
}
[self.socketreadDataWithTimeout:-1tag:0];
}
// 发送数据
- (void)sendMessage:(NSString *)str tag:(NSInteger)tag complete:(BLOCK)block {
self.block = block;
[self.socketwriteData:[strdataUsingEncoding:NSUTF8StringEncoding]withTimeout:-1tag:0];
[self.socket readDataWithTimeout:-1 tag:0];
}
// tcp连接
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port {
NSLog(@"连接成功");
[self.socketreadDataWithTimeout:-1tag:0];
}
- (void)disconnection {
[self.socketdisconnect];
[self.socketreadDataWithTimeout:-1tag:0];
}
// 服务器返回数据
- (void)socket:(GCDAsyncSocket*)sock didReadData:(NSData *)data withTag:(long)tag {
NSString *str = [[NSStringalloc]initWithData:dataencoding:NSUTF8StringEncoding];
NSLog(@"str = %@", result);
self.block(result);
[self.socketreadDataWithTimeout:-1tag:0];
}
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err {
NSLog(@"已经断开连接!");
[self.socketreadDataWithTimeout:-1tag:0];
}
@end
转自:http://blog.5ibc.net/p/32842.html
iOS Socket/Tcp编程 GCDAsyncSocket的实战(带回调)的更多相关文章
- Linux C Socket TCP编程介绍及实例
转自:https://blog.csdn.net/lell3538/article/details/53335231 { printf("向服务器发送数据:%s\n",sendbu ...
- Socket - TCP编程
Socket是网络编程的一个抽象概念. 通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可 socket参数及常用功能 ...
- iOS socket TCP UDP
TCP: 服务器: #import <Foundation/Foundation.h> #include <sys/socket.h> #include <netinet ...
- java Socket(TCP)编程小项目
package 服务器端相关操作; import java.io.Serializable; /* * 创建存储需要传输信息的对象,方便客户端向服务器端传送数据 */ public class Cli ...
- Java Socket TCP编程(Server端多线程处理)
package com; import java.io.*; import java.net.Socket; /** * Socket Client * <p> * Created by ...
- Java Socket TCP编程
package com; import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * Socket Se ...
- JAVA 通过 Socket 实现 TCP 编程
简介 TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机 ...
- iOS socket 实现tcp和服务器长链接的简单使用心得
首先iOS端用了一个第三方的框架 GCDAsyncSocket 当然这个是CocoaAsyncSocket框架里面的一部分 Github下载地址https://github.com/robbiehan ...
- 深入浅出--iOS的TCP/IP协议族剖析&&Socket
深入浅出--iOS的TCP/IP协议族剖析&&Socket 简介 该篇文章主要回顾--TCP/IP协议族中的TCP/UDP.HTTP:还有Socket.(--该文很干,酝酿了许久! ...
随机推荐
- 1.3(学习笔记)JSP(Java Server Pages)内置对象
一.内置对象 内置对象又称内建对象.隐式对象,是由服务器自动创建实例化的, 用户在使用时不需要显示的创建,可直接使用. jsp内置对象名称,类型及作用域 Scope代表该内置对象的作用范围,page表 ...
- 6.6(java学习笔记)文件分割(IO综合例子)
基本思路: 文件分割:将一个文件分割成若干个独立的文件. 设置分割后小文件文件的字节数,然后读取被分割文件, 将对应的字节数写入分割后的小文件中. 使用seek定位下一次读取位置. 文件 ...
- Flex State
在Flex 程序中,引入了状态设计的概念.在一个程序中,按照功能的需求,将界面切分成相对独立的部分.运行过程中,随着用户交互,界面在各个部分之间切换.比如在购物车程序中,登录界面.选购商品界面.购物车 ...
- Inno Setup入门(一)——最简单的安装脚本
地址:http://379910987.blog.163.com/blog/static/3352379720110238252326/ 一个最简单的安装脚本: 1.最简单的安装文件脚本: [setu ...
- SpringBoot下文件上传与下载的实现
原文:http://blog.csdn.net/colton_null/article/details/76696674 SpringBoot后台如何实现文件上传下载? 最近做的一个项目涉及到文件上传 ...
- IIS 7 网站权限问题
IIS7 应用程序池[标识]为[ApplicationPoolIdentity] 给程序目录赋权限: IUSER IIS AppPool\[应用程序池名]
- Array.apply 方法的使用
Array.apply(null, {length: 5}) length为特殊字段,意思是生成一个长度为5的数组,由于没赋值,所以都是undefined; 如果要赋值,可以这样 console.lo ...
- [Android Pro] 通过Android trace文件分析死锁ANR
转载自: http://blog.csdn.net/oujunli/article/details/9102101#reply 对于从事Android开发的人来说,遇到ANR(Application ...
- 设计工作-Axure
1,百度百科 http://baike.baidu.com/view/3332366.htm?fromtitle=axure&fromid=5056136&type=syn 2,官方网 ...
- Java集合迭代器 Iterator分析
简介 迭代器是遍历容器的一种常用方法,它屏蔽了容器的实现细节,无需暴露数据结构内部,就可以对容器进行遍历,迭代器本身也是一种设计模式,迭代是一种特殊的遍历方式. Iterator 在java中,迭代器 ...