什么是socket

.什么是Socket

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)。


.TCPSocket的使用

1.TCP客户端的写法

1).创建客户端套接字对象

    _clientSocket = [[AsyncSocket alloc]initWithDelegate:self];

建立与服务器的链接

    [_clientSocket connectToHost:@"192.168.1.1" onPort:5555 error:nil];

客户端监听

    [_clientSocket readDataWithTimeout:-1 tag:100];


2)客户端代理

建立与服务器的连接

- (BOOL)onSocketWillConnect:(AsyncSocket *)sock


连接服务器成功

- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port

[sock writeData:[@"登录请求" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:100];


向服务器发送数据成功

- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag


收到来自服务器的消息

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag

NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

断开连接

- (void)onSocketDidDisconnect:(AsyncSocket *)sock


2.TCP服务端的写法

1).创建服务端套接字对象

_serverSocket = [[AsyncSocket alloc]initWithDelegate:self];

if ([_serverSocket acceptOnPort:5555 error:nil])

    {

        NSLog(@"服务器启动了");

    }else

    {

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

    }

2).服务端代理


收到了来自客户端的TCP连接请求

- (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket

[newSocket writeData:[@"蓝翔技校欢迎你..." dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:100];

    //保存客户端

    _clientSocket = newSocket;


收到了来自客户端的数据

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag

NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

服务端发送消息成功

- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag

//继续监听客户端数据

     [_clientSocket readDataWithTimeout:-1 tag:100];

.UDPSocket的使用

1.创建UDP套接字对象

_recevSocket = [[AsyncUdpSocket alloc]initWithDelegate:self];

       _sendSocket = [[AsyncUdpSocket alloc]initWithDelegate:self];

    

      [_recevSocket bindToPort:0x1234 error:nil];

          [_sendSocket bindToPort:0x4321 error:nil];

    

      //监听

      [_recevSocket receiveWithTimeout:-1 tag:100];


2.UDPSokect代理

收到了对方传过来的消息

- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port

[_recevSocket receiveWithTimeout:-1 tag:100];

发送消息成功

- (void)onUdpSocket:(AsyncUdpSocket *)sock didSendDataWithTag:(long)tag


3.UDPSoket发送消息

[_sendSocket sendData:[contentField.text dataUsingEncoding:NSUTF8StringEncoding] toHost:ipField.text port:0x1234 withTimeout:-1 tag:200];


tcp协议 对应于传输层

ip协议 对应于网络层 TCP、ip是传输层协议主要解决数据如何在网络中传输;二HTTP是应用层协议 主要解决如何包装数据。

socket 是对TCP、ip协议的封装,socket本身并不是协议 而是一个调用接口(API)通过socket 我们才嫩使用TCP IP协议

HTTP 链接 HTTP连接就是所谓的短连接 即客户端向服务器端发送一次请求服务端相应后链接就会立即断掉。

socket 链接 socket链接就是所谓的长连接 理论上客户端和服务器端一旦建立链接就不会主动断掉

TCP (Transmission Control Protocol 传输控制协议)是基于连接的协议也就是说。在正式发送数据前 必须和对方建立可靠地连接 。一个TCP链接必须要经过三次对法才能建立起来

1  主机 A 向主机B发处连接请求数据包 

2 主机B先主机A发送同意连接 和要求同步(同步就是两个主机一个在发送。一个在接受)的数据包

3 主机A再发出一个数据包确认主机B的要求同步 我现在就发你接着吧

三次对话的目的是使得数据包的发送和接受同步 经过三次对话主机a和b 才能正式发送数据

UDP (user data Protocol,用户数据报协议)是与TCP相对应的协议它是面向非连接的协议,它不与对方建立链接 而是直接发送过去 udp适合于一次传输大量数据堆可靠性要求不高的环境。

TCP协议和UDP协议的差别

                         tcp                         UDP

是否连接           面向链接                  面向非连接

传输可靠性        可靠                        不可靠

应用场合            传输少量数据            传输大量数据

速度                    慢                            快



socketTCP的三次握手建立连接详解

       我们知道tcp建立连接要进行三次握手,即交换三个分组。大致流程如下:

客户端向服务器发送一个SYN J

服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1

客户端再想服务器发一个确认ACK K+1


socketTCP的四次握手释放连接详解

       上面介绍了socketTCP的三次握手建立过程,及其涉及的socket函数。现在我们介绍socket中的四次握手释放连接的过

某个应用进程首先调用close主动关闭连接,这时TCP发送一个FIN M

另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据;

一段时间之后,接收到文件结束符的应用进程调用close关闭它的socket。这导致它的TCP也发送一个FIN N

接收到这个FIN的源发送端TCP对它进行确认。

这样每个方向上都有一个FINACK

OSI (Open system Interconnection 开放系统互联)

 



 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值