zoukankan      html  css  js  c++  java
  • day31 socket 一套编程接口【套接字】

    今日回顾

    网络编程: C(client) / S(server)   |   B(browers)/S(server)

    网络通信:计算机间的数据传输,传输需要统一的协议

    OSI:开放系统互联参考模型

    应用层 |  表示层 | 会话层 |  传输层 |  网络层  |   数据链路层 |  物理层

    数据链路层:以太网协议  每一个链接网路的设备必须有一个网卡(世界上独一无二的MAC地址);

                 每一组数据需【head:固定长度18个字节(6源地址,6个目标地址,2个数据类型),date(最短46字节,最长1500字节)】

          数据链路层通过广播的方式来查找某一台计算机【通过交换机,在一个局域网】, 某一个mac响应后, 交换机会自主学习将保存mac与网口的映射关系

          问题:广播风暴,且没有可以链接所有设备的交换机

    网络层:方要是IP协议

        1.每台设备必须有一个IP地址:四段三位点分十进制【其中前三段是网络号(常规情况), 最后一段是主机号】  000.000.000.000 --255.255.255.255

        2. ip数据包 【以太帧head  [ip head |  date]  】

        3.子网掩码  :用于标示IP中哪些是网络号,哪些是言主机号

              255.255.255.0

              11111111.11111111.11111111.00000000

              1表示网络号 0标示主机号

                                        将IP转为二进制,子网掩码转为二进制

                 使用AND来计算两个IP是否处于同一局域网

              例如 1号ip 转换的结果如下

              11011111.00001111.10101010.00001

              11111111.11111111.11111111.0000000

             结果: 11011111.00001111.10101010.00000

     

             例如2号ip 转换的结果如下

              11011111.00001111.10101010.00010

              11111111.11111111.11111111.0000000

            结果: 11011111.00001111.10101010.00000

        4.ARP  Address Resolution Protocol

         该协议用于将IP转为MAC地址

         1.先比对子网掩码 判断两个IP是否处于同一子网中

         2.1如果是 则直接在当前局域网中进行广播

         2.2如果不是同一局域网,则将数据包发送对方的网关

         2.3对方网关收到数据包后回复自己的MAC地址

         2.4发送的交换机收到数据包在发送给 发送者同时存储对方网关与MAC的对应关系

                      2.5 发送已经明确对方网关的MAC以及对方的IP

           3. 发送数据 【我的MAC 对方网关的MAC【我的IP 对方的IP】】

       5. 路由协议:找到一条最佳的路径

       到此可以使用IP来定位到全球的某一个明着说网中的某一台计算机

    传输层

      1.端口号:每个应用程序都必须绑定一个端口号,用于标识你是谁,是QQ,还是Pycharm

        端口号不能重复,为一个整形数字 取值范围 0-65535 0-1023为系统保留

           3. 传输层主要的传输协议

       TCP【传输控制协议】--可靠协议:三次握手建立链接,其目的是为了确认传输路径可用

                        传输过程中 每一个数据包都需要确认信息

                       四次挥手断开链接  是为了保障双方数据都已经传输完毕

                                                       传输效率较低

               UDP 【用户数据报协议】不关心数据是否传输成功,甚至不关心是否存在,传输效率高

    应用层: 数据已经通过下面这种协议传入应用程序

         应用程序可以自己定义自己的协议,只要客户端程序与服务端程序能看懂就行:如 HTTP/HTTPS  SMTP FTP

    今日内容   socket  【套接字】

    socket: 一套编程接口,内部封装了一堆底层协议,隐藏了内部复杂的实现细节,提供了简单的使用接口---- 即一个位于TCP/UDP间的接口模块

    socket的发展史:

      最开始socket使用来完成进程间通讯的,并不是用来网络通讯,那时候还没有网络

           后来有了网络之后 .基于之前的socket来进行了更新 使其可以支持网络通讯

           所以socket分为两种类型

           AF_UNIX : 进程间通讯

      AF_INET : 网络通讯 

     

    socket 模块使用:

      服务端:phone = socket.socket( socket.AF_INET, socket.SOCK_STREAM)  # 拿到一个接口

          phone.bind(('127.0.0.1', 端口号))   #绑定一个IP号及端口号,【客户端不要绑定,没必要】

          phone.listen()  # 准备好了,听着呢

    server端:

    import socket
    phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    phone.bind(('127.0.0.1', 9000))
    phone.listen()

    count = 1
    while True:
    print('第%s个客户来了'% count)
    client, addr = phone.accept()

    while True:
    try:
    date = client.recv(1024)
    if not date:
    print('windows 中的第%s个客户正常退出或收到linux 中的空值'% count)
    client.close()
    count +=1
    break
    client.send(date.upper())
    except ConnectionResetError as e:
    client.close()
    print('第%s个客户非正常断开' % count)
    count += 1
    break

    服务端:

    import socket

    phone1 = socket.socket()
    phone1.connect(('127.0.0.1', 9000))

    while True:
    cmd = input('cmd:').strip()
    if cmd == 'q':break
    if not cmd:continue
    phone1.send(cmd.encode('utf-8'))

    date = phone1.recv(1024)
    print(date)


    phone1.close()
  • 相关阅读:
    学习Ember遇到的一些问题
    angular学习资源
    电话号码验证(正则)
    使用 Bitbucket Pipelines 持续交付托管项目
    zookeepercli
    如何用 JIRA REST API 创建 Issue
    Maven如何传递系统属性变量到TestNG
    基于WebDriver&TestNG 实现自己的Annotation @TakeScreenshotOnFailure
    25+ Useful Selenium Web driver Code Snippets For GUI Testing Automation
    Selenium WebDriver 之 PageObjects 模式 by Example
  • 原文地址:https://www.cnblogs.com/qingqinxu/p/10940753.html
Copyright © 2011-2022 走看看