网络概念

OSI: 

开放系统互连参考模型 (Open System Interconnect 简称OSI)是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系统提供了一种功能结构的框架。它从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

物理层:物理层并不是物理媒体本身,它只是开放系统中利用物理媒体实现物理连接的功能描述和执行连接的规程。物理层提供用于建立、保持和断开物理连接的机械的、电气的、功能的和过程的条件。简而言之,物理层提供有关同步和全双工比特流在物理媒体上的传输手段,其典型的协议有RS 232C、RS 449/422/423、V.24和X.21、X.21bis等。

端口号:每一个应用程序有很多的服务!每一个服务对应着一个端口号。

数据链路层:数据链路可以粗略地理解为数据通道。物理层要为终端设备间的数据通信提供传输介质及其连接。

网络层:选择最优路径

// 客户端socket

#import "ViewController.h"

#import "GCDAsyncSocket.h"

@interface ViewController ()

@property(nonatomic,strong)GCDAsyncSocket *clientSocket;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

[self.clientSocket connectToHost:@"127.0.0.1" onPort:1234 error:NULL];

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

#pragma mark GCDAsyncSocketDelegate

-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port{

NSLog(@"已经连接成功后调用");

[self.clientSocket readDataWithTimeout:-1 tag:0];

}

-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{

NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);

// 发送数据

NSString *str = @"你好,服务器!";

[self.clientSocket writeData:[str dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];

// 接收数据

[self.clientSocket readDataWithTimeout:-1 tag:0];

}

#pragma mark 懒加载

-(GCDAsyncSocket *)clientSocket{

if (_clientSocket == nil) {

_clientSocket = [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue() socketQueue:NULL];

}

return _clientSocket;

}

@end

// 服务端

#import "ViewController.h"

#import "GCDAsyncSocket.h"

@interface ViewController ()// 用于监听的socket

@property(nonatomic,strong)GCDAsyncSocket *listenSocket;

// 保存用于数据交互的socket (需要强引用 但是如果群聊需要多个强引用 所以建立数组)

@property(nonatomic,strong)NSMutableArray *connectedSockets;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view.

}

- (void)setRepresentedObject:(id)representedObject {

[super setRepresentedObject:representedObject];

// Update the view, if already loaded.

}

- (IBAction)clickStartServer:(id)sender {

// 绑定ip&监听端口&接收新连接封装在一个方法中

BOOL success = [self.listenSocket acceptOnInterface:@"127.0.0.1" port:1234 error:nil];

if (success) {

NSLog(@"服务器开启成功");

}else{

NSLog(@"服务器开启失败");

}

}

#pragma mark GCDAsyncSocketDelegate

/**

*  已经接收到新的连接后调用

*

*  @param sock      服务端用于监听的socket

*  @param newSocket 服务端用于数据交互的socket

*/

-(void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket{

NSLog(@"接收到来自%@的连接,其端口为%hu",newSocket.connectedHost,newSocket.connectedPort);

[self.connectedSockets addObject:newSocket];

// 设置欢迎信息

NSString *str = [NSString stringWithFormat:@"欢迎连接我的MAC服务器"];

[newSocket writeData:[str dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];

//    // 定时器 轮询

//    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(readData:) userInfo:newSocket repeats:YES];

//    // 开启异步线程runloop(因为接收socket为异步不会执行 NSTimer)

//    [[NSRunLoop currentRunLoop]run];

// 接收数据

[newSocket readDataWithTimeout:-1 tag:0];

}

-(void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag{

NSLog(@"已经发送出去");

}

//-(void)readData:(NSTimer *)obj{

//    // 接收数据

//    GCDAsyncSocket *socket = obj.userInfo;

//    [socket readDataWithTimeout:-1 tag:0];

//}

/**

*  已经接收到的数据

*

*  @param sock 服务端用于数据交互的socket

*  @param data 接收到的数据

*  @param tag  标记

*/

-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{

NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);

// 接收的数据

[sock readDataWithTimeout:-1 tag:0];

// 转发给指定用户

for (GCDAsyncSocket *connetctedSocket in self.connectedSockets) {

if (connetctedSocket != sock) {

[connetctedSocket writeData:data withTimeout:-1 tag:0];

}

}

}

#pragma mark  懒加载

-(GCDAsyncSocket *)listenSocket{

if (_listenSocket == nil) {

_listenSocket = [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_global_queue(0, 0) socketQueue:NULL];

}

return _listenSocket;

}

-(NSMutableArray *)connectedSockets{

if (_connectedSockets == nil) {

_connectedSockets = [NSMutableArray array];

}

return _connectedSockets;

}

@end

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

推荐阅读更多精彩内容

  • 转载:http://www.cocoachina.com/ios/20170615/19529.html 参考:h...
    F麦子阅读 3,984评论 3 2
  • iPhone的标准推荐是CFNetwork 库编程,其封装好的开源库是 cocoa AsyncSocket库,用它...
    Ethan_Struggle阅读 2,205评论 2 12
  • 1, 网络是什么 计算机网络的组成组件: 节点 (node):节点主要是具有网络地址 (IP) 的设备之称。 服务...
    求闲居士阅读 1,451评论 0 3
  • 网络 网络是几乎可以实时相互发送和接收数据的计算机和其它设备的集合。 网络通过常用线缆连接,数据位转换为电磁波,通...
    雪糕的粑粑阅读 402评论 0 1
  • 你问,我的幸福在哪里? 我有两个宝贝外孙,一个06年出生,一个07年问世,一男一女相差一岁半。男宝旺明年上初中,女...
    efab227f5376阅读 592评论 18 20