2018-03-12

ios开发Socket简单使用

  • 建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装.
  • Socket实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。

Socket原理图(网上借鉴)

image.png

Socket使用简单步骤

1.在客户端创建Stocket
2.连接到服务器Stocket
3.客户端向服务器发送数据
4.客户端接收服务器返回的数据
5.关闭Stocket

Stocket程序中简单使用

#import "ViewController.h"
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

// 1.创建客户端Socket
/**
 参数
 参数1 : domain,协议域/协议簇,AF_INET(IPV4的网络开发)
 参数2 : type,Socket类型,SOCK_STREAM(TCP)/SOCK_DGRAM(UDP,报文)
 参数3 : protocol,IPPROTO_TCP,协议,如果输入0,可以根据第二个参数,自动选择协议

 返回值
 int类型,如果 > 0 就表示创建客户端Socket成功,返回socket
 */
int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket > 0) {
    NSLog(@"创建客户端Socket成功");
}

// 2.客户端Socket连接到服务器Socket
/**
 参数
 参数1 :  客户端socket
 参数2 :  指向数据结构sockaddr的指针,其中包括目的端口和IP地址
         服务器的"结构体"地址
         提示:C 语言中没有对象
 参数3 :  结构体数据长度

 返回值
     0 成功/其他 错误代号,(不是非0即真)
 */

struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
addr.sin_addr.s_addr = inet_addr("119.75.217.109");

int isConnected = connect(clientSocket, (const struct sockaddr *)&addr, sizeof(addr));
if (isConnected == 0) {
    NSLog(@"连接到服务器成功");
}

// 3.客户端Socket向服务器Socket发送请求
/**
 参数
 参数1 : 客户端socket
 参数2 : 发送内容地址 void * == id
 参数3 : 发送内容长度
 参数4 : 发送方式标志,一般为0

 返回值
 如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR
 */
 
NSString *sendMsg = @"GET / HTTP/1.1\r\n"
                    "Host: www.baidu.com\r\n"
                    "User-Agent: iphone\r\n"
                    "Connection: close\r\n\r\n"
                    ;

ssize_t sendCount = send(clientSocket, sendMsg.UTF8String, strlen(sendMsg.UTF8String), 0);
NSLog(@"发送字符数 %ld",sendCount);

// 4.客户端Socket接收服务器Socket发送的数据(响应)
/**
 参数
 参数1 : 客户端socket
 参数2 : 接收内容缓冲区地址
 参数3 : 接收内容缓存区长度
 参数4 : 接收方式,0表示阻塞,必须等待服务器返回数据

 返回值
 如果成功,则返回读入的字节数,失败则返回SOCKET_ERROR

 提示 : 服务器发送给客户端数据时,是一点一点发送的
 提示 : 当服务器把数据都发送完了以后,再次发送时,只发送0字节,
 */

// 创建接收服务器发送的数据的容器 / 缓冲区 ,并且指定了容量
uint8_t buffer[1024];
// 需要创建一个容器
NSMutableData *dataM = [NSMutableData data];

// 循环的接收服务器发送的数据(每次只能接收1024字节,所以要循环接收所有的数据)
ssize_t recvCount = -1;
while (recvCount != 0) {
    // 值接收了一次
    recvCount = recv(clientSocket, buffer, sizeof(buffer), 0);
    NSLog(@"接收的内容数 %ld",recvCount);
    [dataM appendBytes:buffer length:recvCount];
}
NSString *html = [[NSString alloc] initWithData:dataM encoding:NSUTF8StringEncoding];
NSLog(@"%@",html);

// 5.关闭Socket
close(clientSocket);
}
@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 运输层协议概述 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是...
    srtianxia阅读 2,387评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 名词延伸 通俗的说,域名就相当于一个家庭的门牌号码,别人通过这个号码可以很容易的找到你。如果把IP地址比作一间房子...
    杨大虾阅读 20,585评论 2 57
  • 18.1 引言 TCP是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。本章将...
    张芳涛阅读 3,342评论 0 13
  • 特别提醒:本文参考摘自【工匠若水 http://blog.csdn.net/yanbober/article/de...
    _猜火车_阅读 1,787评论 0 3