iOS-网络编程iOS 进阶开发

iOS开发轻松学习Socket

2021-10-12  本文已影响0人  Cooci_和谐学习_不急不躁

这两天很多学员都想听听关于 Socket 的内容! 所以花了一点时间就给它备了出来,公开课分享完全足够了!

这里通过文字形式纪录下来,方便大家对应学习

Socket是什么?

要了解什么是 Socket,首先需要了解 TCP/IP、UDP! 📚

TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。

image

TCP/IP协议族包括运输层、网络层、链路层。现在你知道TCP/IP与UDP的关系了吧。

如果大家对于 七层协议模型 不是非常了解的话,你可以,沉下心来看看下面👇🏻 这张图:

image

那么TCP/IP、UDPsocket又有什么关系呢???

Socket应用层TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

image

Socket怎么用

这里其实还有很多网络相关的知识需要科普,但是篇幅有限,如果靓仔靓女的你对于这一块有点陌生,你可以买一些网络相关的书籍

Socket 作为一套接口,那么是怎么用的呢? 下面一图胜前言: 👇

image

Socket 传输的特点:

正因为这些优势,常被用来做即时通讯重要媒介

image

上图就是通过 socket 在客户端和终端做的来回通讯

socket使用代码实现:

1: 创建socket

int socketID = socket(AF_INET, SOCK_STREAM, 0);
self.clinenId= socketID;
if (socketID == -1) {
    NSLog(@"创建socket 失败");
    return;
}

注意:1.typeprotocol不可以随意组合,如SOCK_STREAM不可以跟IPPROTO_UDP组合。当第三个参数为0时,会自动选择第二个参数类型对应的默认协议。

2: 建立连接

int result = connect(socketID, (const struct sockaddr *)&socketAddr, sizeof(socketAddr));

if (result != 0) {
    NSLog(@"链接失败");
    return;
}
NSLog(@"链接成功");
struct sockaddr_in socketAddr;
socketAddr.sin_family = AF_INET;
socketAddr.sin_port   = SocketPort;
struct in_addr socketIn_addr;
socketIn_addr.s_addr  = SocketIP;
socketAddr.sin_addr   = socketIn_addr;

3: 发送消息

if (self.sendMsgContent_tf.text.length == 0) {
    return;
}
const char *msg = self.sendMsgContent_tf.text.UTF8String;
ssize_t sendLen = send(self.clinenId, msg, strlen(msg), 0);
NSLog(@"发送 %ld 字节",sendLen);
[self showMsg:self.sendMsgContent_tf.text msgType:0];
self.sendMsgContent_tf.text = @"";

4: 接受消息

while (1) {
    uint8_t buffer[1024];
    ssize_t recvLen = recv(self.clinenId, buffer, sizeof(buffer), 0);
    if (recvLen == 0) {
        NSLog(@"接收到了0个字节");
        continue;
    }
    // buffer -> data -> string
    NSData *data = [NSData dataWithBytes:buffer length:recvLen];
    NSString *str= [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@---%@",[NSThread currentThread],str);
    dispatch_async(dispatch_get_main_queue(), ^{
        [self showMsg:str msgType:1];
        self.sendMsgContent_tf.text = @"";
    });
}

Socket 总结

Socket 的使用还是非常简单的! 对于iOS开发有点吃力的原因是在于:

如果想更加傻瓜式开发,那么就请看下一个篇章: CocoaAsyncSocket 关于tcp和udp 实战
大师重磅内容(17)-CocoaAsyncSocket实现即时通讯
大师重磅内容(18)-CocoaAsyncSocket实现画板功能

上一篇下一篇

猜你喜欢

热点阅读