iOS中的TCP,UDP,socket的学习记录

其实一直对通讯这块不是很明白,所以也是有这个时间调研一下,就特此记录一下学习的东西


先贴一下之前学习过的代码:

加入CFNetwork.framework,去github上下载AsyncSocket


TCP



- (void)viewDidLoad
{
    [super viewDidLoad];

    recvArray = [[NSMutableArray alloc] init];
    //服务端
    recvSocket = [[AsyncSocket alloc] initWithDelegate:self];
    //客户端
    sendSocket = [[AsyncSocket alloc] initWithDelegate:self];
    
    //服务端开始等待别的客户端的链接
    //65535     >5000
    [recvSocket acceptOnPort:5678 error:nil];
    //那么什么时候接受到了链接
}

//调用这个方法就证明接受到了一个链接
- (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket{
    [recvArray addObject:newSocket];
    //等待客户端发送数据
    [newSocket readDataWithTimeout:-1 tag:100];
    //什么时候读取到了数据
}

//调用这个方法就证明接受到了客户端发送的数据
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
    NSString* str = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
    contentView.text = [NSString stringWithFormat:@"%@\n对方说:%@",contentView.text,str];
    //继续等待服务端发送数据
    [sock readDataWithTimeout:-1 tag:100];
}

//=============

//调用这个方法的时候,就证明链接成功
- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{

}

- (void)sendText:(id)sender{
    //如果没链接,那么去链接服务端
    if (sendSocket.isConnected == NO) {
        [sendSocket connectToHost:ipField.text onPort:5678 withTimeout:60 error:nil];
        //什么时候知道链接成功
    }
    
        
    NSData* data = [sendField.text dataUsingEncoding:NSUTF8StringEncoding];
    //发送数据
    [sendSocket writeData:data withTimeout:60 tag:100];
    //什么时候知道数据发送成功
}


//调用这个方法,就证明数据发送成功
- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag{
    
}


UDP



- (void)viewDidLoad
{
    [super viewDidLoad];
	
    recvSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
    //绑定端口
    [recvSocket bindToPort:5888 error:nil];
    
    sendSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
    [sendSocket bindToPort:5999 error:nil];
    
    //等待接受数据
    [recvSocket receiveWithTimeout:-1 tag:100];
    //什么时候接受到了数据
    
    
}

//调用这个方法的时候证明接收到了数据
- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port{
    
    NSString* str = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
    contentView.text = [NSString stringWithFormat:@"%@\n%@:%@",contentView.text,host,str];
    [recvSocket receiveWithTimeout:-1 tag:100];
    
    return YES;
}

- (void)sendText:(id)sender{
    NSData* data = [sendField.text dataUsingEncoding:NSUTF8StringEncoding];
    //发送数据
    [sendSocket sendData:data toHost:ipField.text port:5888 withTimeout:60 tag:100];
    //什么时候发送成功
}

//这里就发送成功了
- (void)onUdpSocket:(AsyncUdpSocket *)sock didSendDataWithTag:(long)tag{
    
}

首先说一下他们直接的联系,UDP和TCP就像声明的一个协议,是需要传送的东西也就是内容,而scoket就像是一个通道,用于传送这些内容,也就是用socket来实现。

UDP:UDP是一种面向无连接的用户数据报服务(user data protocol),不需要和服务器也能交互,只需要知道ip和监听端口,不需要链接没有目的的socket,只是将数据报投递出去,不管接收方是否成功接收到,因此是一种不可靠的传输,可能会造成数据丢包,但由于这些特征,传输效率要优于TCP。

TCP:TCP是一种面向连接的传输控制协议(transform contorl protocol),必须要和服务器交互,具有高安全性,可靠性,需要和服务器进行三次握手,能根据具体网络拥堵情况进行延时。

Socket:Socket有两种连接操作方式,面向连接的和面向无连接的。使用UDP就是面向无连接的,使用TCP就是面向连接的。使用UDP无需要指定一个socket目的地,而是用TCP必须要指定一个socket目的地,需要进行预链接,否则连接不到。

socket就像是API,二UDP/TCP就是协议,使用scoket来实现内容的传送。


TCP的3次握手

建立起一个TCP连接需要经过“三次握手”:

第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”(过程就不细写了,就是服务器和客户端交互,最终确定断开)



OSI模型

  


OSI/RM协议是由ISO(国际标准化组织)制定的,它有三个基本的功能:提供给开发者一个必须的、通用的概念以便开发完善、可以用来解释连接不同系统的框架。

OSI将计算机网络体系结构(architecture)划分为以下七层:

物理层: 将数据转换为可通过物理介质传送的电子信号 相当于邮局中的搬运工人
数据链路层: 决定访问网络介质的方式 在此层将数据分帧,并处理流控制。本层 指定拓扑结构并提供硬件寻 址。相当于邮局中的装拆箱工人
网络层: 使用权数据路由经过大型网络 相当于邮局中的排序工人
传输层: 提供终端到终端的可靠连接 相当于公司中跑邮局的送信职员
会话层: 允许用户使用简单易记的名称建立连接 相当于公司中收寄信、写信封与拆信封的秘书
表示层: 协商数据交换格式 相当公司中简报老板、替老板写信的助理
应用层: 用户的应用程序和网络之间的接口 老板


参考文章:UDP、TCP、socket区别 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值