B19-socket初窥(上)

本文章内容总结自网络视频,感谢🙏

学前知识

一、网路通讯三要素

1、IP地址(主机名)
    1》网络中设备的标示
    2》不易记忆,可以用主机名
    3》本地回环地址:127.0.0.1 主机名:localhost
2、端口号
    1》用于标示进程的逻辑地址,不同进程的标示
    2》有效端口:0~65535
    3》其中0~1024由系统使用或者保留端口,开发中不要使用1024以下的端口
3、传输协议(通讯的规则)
    1》TCP
    2》UDP
     ps:www.ip138.com网站可以用来查询IP信心。

二、常见网络协议

三、网络七层协议

      传递信息时,由上到下再由下到上分别是封包和解包。

四、TCP和UDP

1、UDP(用户数据报协议)
    1》只管发送,不确认对方是否接收到
    2》将数据及源和目的封装成数据包中,不需要建立连接
    3》每个数据报的大小限制在64K之内
    4》因为无需连接,因此是不可靠协议
    5》不需要建立连接,速度快
    6》应用场景:多媒体教室/网络流媒体,用得很少
2、TCP(传输控制协议)
    1》建立连接,形成传输数据的通道
    2》在连接中进行大数据传输(数据大小不收限制)
    3》通过三次握手完成连接,是可靠协议,安全送达
    4》必须建立连接,效率会稍低
 

五、建立连接的三次握手,断开连接的四次握手

正文

一、Socket(插座)概念

    1、Socket就是为网络服务提供的一种机制
        1》在Unix中,网络既是Socket,并不局限在TCP/UDP
        2》Socket可以用于自定义协议
    2、通信的两端都是Socket
    3、网络通信其实就是Socket间的通信
    4、数据在两个Socket间通过IO传输
    5、Socket开始时是纯C语言的,是跨平台的

二、Socket通讯示意图

三、利用终端nc建立socket聊天

 1 // 1. 创建 socket
 2     /**
 3      参数
 4      
 5      domain:    协议域,AF_INET->IPV4
 6      type:      Socket 类型,SOCK_STREAM(TCP)/SOCK_DGRAM(报文 UDP)
 7      protocol:  IPPROTO_TCP,如果传入0,会自动根据第个参数,选择合适的协议
 8      
 9      返回值
10      socket > 0 就成功
11      */
12     int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
13     
14     // 2. 连接到服务器
15     /**
16      参数
17      1> 客户端socket
18      2> 服务器地址结构体指针
19      3> 结构体数据长度
20      返回值
21      0 成功/其他 错误代号
22      */
23     struct sockaddr_in serverAddr;
24     serverAddr.sin_family = AF_INET;
25     // 端口
26     serverAddr.sin_port = htons(12345); // 终端输入 $nc -lk 12345才能连接成功(打开本机12345端口,并持续监听)
27     // 地址 inet_addr 函数,可以将 ip 地址转换成一个数字
28     serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
29     // 在 C 语言开发中,经常传递一个数据结构的指针同时,需要指定该数据结构的长度
30     int connResult = connect(clientSocket, (const struct sockaddr *)&serverAddr, sizeof(serverAddr));
31     if (connResult == 0) {
32         NSLog(@"连接成功");
33     } else {
34         NSLog(@"连接失败-%d",connResult);
35     }
36     
37     // 3. 发送数据给服务器
38     /**
39      参数
40      1> 客户端socket
41      2> 发送内容地址
42      3> 发送内容长度
43      4> 发送方式标志,一般为0
44      返回值
45      如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR
46      */
47     NSString *sendMsg = @"are you ok?";
48     ssize_t sendLength = send(clientSocket, sendMsg.UTF8String, strlen(sendMsg.UTF8String), 0);
49     NSLog(@"发送了%ld个字节",sendLength);
50     
51     // 4. 从服务器接收数据
52     /**
53      参数
54      1> socket
55      2> 接收数据的缓冲区地址,需要提前准备
56      3> 缓冲区长度
57      4> 标记,0,阻塞式
58      
59      返回值
60      如果成功,则返回接收到的字节数
61      */
62     uint8_t buffer[1024]; // 要把空间准备出来
63     ssize_t recvLength = recv(clientSocket, buffer, sizeof(buffer), 0);
64     NSLog(@"接收了%ld个字节",recvLength);
65     // 获取服务器返回的数据,从缓冲区中读取 recvLen 个字节!
66     NSData *data = [NSData dataWithBytes:buffer length:recvLength];
67     // 转换成字符串
68     NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
69     NSLog(@"%@",str);
70     
71     // 5、关闭
72     /**
73      长连接:连上就一直聊!通常用于 QQ,即时通讯,效率高!
74      短连接:通讯一次,马上断开,下一次再次建立连接,效率低
75      */
76     close(clientSocket);

1、Netcat

    1》是一个终端下用于调试和检查网络的工具包
    2》可用于创建 TCP/IP 连接
2、智能家居原理
    1》手机端只是发送指令和接收回执解析。核心控制模块都在硬件里集成,无法扩展或改变。

四、socket的HTTP访问的实现

1、HTTP访问本地
     1》打开本地apache服务器
         $ sudo apachectl -k start
     2》用socket访问127.0.0.1:80,发送一句话,不会接收到回复信息
     3》在火狐浏览器输入localhost会返回It works!
     4》复制火狐浏览器访问localhost时的请求源给socket,socket再次访问127.0.0.1:80,会返回It works!。(请求头信息可以简化)
2、HTTP访问本地,返回自定义文件
     1》创建文件
          $ more  /etc/apache2/httpd.conf
          $ /DocumentRoot   // 拿到目录
          $ cd  //Library/WebServer/Documents   // (pwd ls 确认一下)
          $ sudo vim demo.txt  // 创建后添加数据
     2》更改请求字符串的请求行
          NSString *request = @"GET /abc.txt HTTP/1.1\n"
     3》重新请求就会接收到自定义文件内容。
3、HTTP访问百度
     1》获取百度IP地址
         $ ping www.baidu.com
     2》访问IP改为百度IP
         访问会返回一个cookie
     3》由于百度的安全机制,需要拿到的cookie进行拼接,再次请求才会返回实体信息。
 
ps:HTTP协议规定的请求和响应的结构分析
     1》请求包括:
          a、请求行:(请求方法、请求资源路径、HTTP协议版本)
          b、请求头:(对客户端的环境描述、客户端请求的主机地址等信息)
          c、请求体:(发给服务器的具体数据)
     2》响应
          a、状态行:(HTTP协议版本、状态码、状态英文名称)
          b、响应头:(对服务器的描述、对返回数据的描述)
          c、实体内容:(服务器返回给客户端的具体数据)
 
 
 
posted @ 2015-11-15 10:05  朱亚男  阅读(205)  评论(0编辑  收藏  举报