iOS Socket

网络:

服务器

客户端

  • 网络架构:
    CS:Client Server 客户端(Android iOSC、C++)和服务器
    BS:Browser Server 浏览器 (web前端)和 服务器(Java)
  • 长链接:客户端请求服务器建立链接,链接成功后理论上会一直保持链接 可以随时客户端和服务器进行数据传输
  • 短链接:客户端请求服务器建立链接并传输数据给服务器 服务器接收到数据后给客服端返回数据 返回之后 链接断开
  • Socket:是基于TCP协议 和 UDP协议数据传输的方法集
image.png
  • 端口:有0-25535个端口 1000以内是系统预留端口


    image.png

    image.png

    image.png
  • TCP协议:链接协议“三次握手”保证数据安全到达

  • UDP协议:非链接协议 可以广播一对多 不能保证数据安全性,传输效率高(省去了建立链接的过程)

image.png

Socket详解

image.png

AsyncSocket 框架

  • 1.Socket创建TCP服务器


    image.png
  • 2.Socket创建TCP客户端


    image.png
  • 3.发送数据


    image.png
    1. Socket服务器接收数据的协议方法


      image.png
  • 5.文件传输


    image.png
  • 6.简易的聊天工具


    image.png

ViewController.m

#import "ViewController.h"
#import "GCDAsyncSocket.h"
@interface ViewController ()<GCDAsyncSocketDelegate>
@property(nonatomic,strong)GCDAsyncSocket *serverSocket;
@property(nonatomic,strong)GCDAsyncSocket *clientSocket;
@property(nonatomic,strong)NSMutableArray *sockets;
@property (weak, nonatomic) IBOutlet UITextField *scoketTF;
@property (weak, nonatomic) IBOutlet UITextField *clientTF;
@property (weak, nonatomic) IBOutlet UITextView *textvView;
@property(nonatomic,strong)NSMutableData *fileData;
@property(nonatomic)NSInteger fileLength;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.fileData = [NSMutableData data];
    self.sockets = [NSMutableArray array];
    self.serverSocket = [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
    //监听端口 等待被人链接
    [self.serverSocket acceptOnPort:8000 error:nil];
}
-(void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket{
    NSLog(@"有新的socket链接进来");
    [self.sockets addObject:newSocket];
    //跟客户端要数据
    [newSocket readDataWithTimeout:-1 tag:self.sockets.count];
}
//已经读取到数据
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData*)data withTag:(long)tag{
    NSString *text = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    if (text.length>0) {
        //得到对方的IP地址
        NSString *host = sock.connectedHost;
        self.textvView.text = [self.textvView.text stringByAppendingFormat:@"\n%@说:%@",host,text];
        //给客户端返回数据
        [sock writeData:[@"我是服务器 我收到了!"dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
    }else{//接收到的是图片
        [self.fileData appendData:data];
        UIImage *image = [UIImage imageWithData:self.fileData];
        //判断如果数据接收完成才需要显示界面中
        NSLog(@"服务器接收到:%@",text);
        if(self.fileData.length == self.fileLength){
        UIImageView *iv = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
        iv.image = image;
        [self.view addSubview:iv];
      }
        
    }
    //跟客户端继续要数据
    [sock readDataWithTimeout:-1 tag:0];
}
-(void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err{
    NSLog(@"已经断开链接");
    [self.sockets removeObject:sock];
}
- (IBAction)senderAction:(UIButton*)sender {
    self.clientSocket = [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
    [self.clientSocket connectToHost:self.scoketTF.text onPort:8000 error:nil];
    if (sender.tag == 0) {
        [self.clientSocket writeData:[self.clientTF.text dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
        //显示自己说的内容
        self.textvView.text = [self.textvView.text stringByAppendingFormat:@"\n我说:%@",self.clientTF.text];
    }else{
        NSString *path = [[NSBundle mainBundle]pathForResource:@"timg2" ofType:@"jpg"];
        NSData *imageData = [NSData dataWithContentsOfFile:path];
        self.fileLength = imageData.length;
        [self.clientSocket writeData:imageData withTimeout:-1 tag:0];
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 227,367评论 6 532
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,001评论 3 413
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 175,213评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,535评论 1 308
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,317评论 6 405
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,868评论 1 321
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,963评论 3 440
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,090评论 0 285
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,599评论 1 331
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,549评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,712评论 1 367
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,233评论 5 356
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,961评论 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,353评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,607评论 1 281
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,321评论 3 389
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,686评论 2 370

推荐阅读更多精彩内容