zoukankan      html  css  js  c++  java
  • 学习python课程第二十六天

    一.    传输层

      在上述三层协议中我们,ip协议帮我们定位到子网络. mac地址帮我们定位到一台计算机,并与其通讯,

      但本质上,计算机的通讯是为了应用程序能够通讯,而一台计算机上不可能运行一个应用程序

      问题:

        就像我们同时运行QQ软件和微信软件, 当计算机收到一个数据包时, 需要知道这个数据包到底是给

        哪个应用程序的.

      解决方案:

        为每一个应用程序绑定一个端口号,  端口号就是一个数字, 取值范围为 0 -- 65536 其中 0 -- 1023是

        系统保留的

      再次捋清思路:

        端口定位应用程序, ip 定位网络, mac 定位计算机

        可以通过这三个地址,找到全世界计算机中唯一的一个应用程序, 使我们编写网络应用程序成为可能.

      

      传输层协议 :

        为什么要有传输层协议 ?

          应用程序可相互传递数据了, 还记得在ip协议中有一个路由算法么? 会自动选择最佳的传输路径,

          将导致你的数据包可能走了不同的路线, 造成接受顺序错乱, 以及发生丢包等, 为了保证数据传输的

          完整性, 诞生了传输层协议!

        TCP :基于链接传输数据, 可保证数据传输的完整性

          优点 :通过三次握手来与服务器建立连接

              可以保证数据的完整性.

               a机器给b机器发送数据包, 要求b机器必须立即返回一个确认包,

               a机器会等待一段时间,如果超时还没有收到确认, 则重发数据.       

          缺点:

            传输效率低.

          使用场景 :  文字聊天. 支付宝转账等,

        UDP : 不需要建立连接,直接发送

          缺点:

            不能保证数据的完整性

          优点:

            传输效率比TCP高很多

          使用场景 :  视频通话,语音通话, 游戏等.

        socket 是什么?

        

          Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,

          Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,

          一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

          所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的

          规定去编程,写出的程序自然就是遵循tcp/udp标准的。

        使用 socket:

          在使用socket的时候用户需要关心的是, ip地址, port端口. 传输协议TCP/UDP,你要发送的数据data

          在写网络编程的时候,必然是两台代码, 对应着客户端和服务器.

        socket 的工作流程 :

           一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,

          这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。

          生活中的场景就解释了这工作原理。

        

          先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),

          调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器

          (connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,

          服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭

          连接,一次交互结束

        

        服务端套接字函数

        s.bind() 绑定(主机,端口号)到套接字
        
        s.listen() 开始TCP监听
        
        s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来

        客户端套接字函数

        s.connect() 主动初始化TCP服务器连接
        
        s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

        公共用途的套接字函数
        
        s.recv() 接收TCP数据
        
        s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
        
        s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
        
        s.recvfrom() 接收UDP数据
        
        s.sendto() 发送UDP数据
        
        s.getpeername() 连接到当前套接字的远端的地址
        
        s.getsockname() 当前套接字的地址
        
        s.getsockopt() 返回指定套接字的参数
        
        s.setsockopt() 设置指定套接字的参数
        
        s.close() 关闭套接字

        面向锁的套接字方法
        
        s.setblocking() 设置套接字的阻塞与非阻塞模式
        
        s.settimeout() 设置阻塞套接字操作的超时时间
        
        s.gettimeout() 得到阻塞套接字操作的超时时间

        面向文件的套接字的函数
        s.fileno() 套接字的文件描述符
        
        s.makefile() 创建一个与该套接字相关的文件

        使用socket来完成TCP通讯

        应该先完成服务器的代码编写

        TCP 服务器 :

        

          import  socket

          # 1. 先创建一个代表服务器的socket对象

          s = socket.socket()

        

          # 2.  绑定ip地址与 端口号

          # 127.0.0.1  表示当前电脑的ip

          address = ('127.0.0.1',8090)          #传入ip与端口

          s.bind((address))

          print ('服务器已启动')

          #  3. 开始监听这个端口

          #  参数5 表示可以有五个处于半连接状态的连接.(不是控制最大连接数的参数.)  

          s.listen(5)

          # 4. 接受连接请求

          # 该函数是阻塞的. 会卡主程序的执行,必须等到有一个客户端进来才会继续执行.

          它会返回一个元组, 第一个代表客户端的socket对象, 第二个是客户端的端口

          client,c_address = s.accept()

          print('有一个连接已建立')

          # 5.读写数据

          # 接受数据 , 参数1024是需要接受的字节数

          res = client.recv(1024)

          print(res)

          # 6. 关闭连接

          s.close()    (一般不会关闭服务器.都是关闭客户端)

          

        TCP 客户端:

          import  socket

          # 1. 创建客户端的socket对象

          c = socket.socket()

          # 2. 连接到服务器

          server_address = ('127.0.0.1',8080)    # 端口必须跟服务器一样

        

          # 3.建立连接

          c.connect(server_address)

          # 4.读写数据

          # 发送数据到服务器

          c.send('hello 我是客户端')

          # 5. 关闭连接

          c.close()

          

        使用socket来完成UDP通讯,一样是先创建服务端

        UDP 服务端:

        

          import  socket

          

          # 1.创建socket对象

          # 必须自己定义参数

          s = socket.socket(type = socket.SOCK_DGRAM)

          # 2. 绑定端口和ip

          s.bind(('127.0.0.1',10000))

          # 3. 接受数据. 接受数据的时候,没有客户端来连接,也会卡主,等待客户端来连接了.再正常运行程序

          res = s.recv(1024)

          print(res)

          # 4. 

        UDP  客户端 :

          import  socket

          

          # 1. 创建客户端

          c = socket.socket(type = socket.SOCK_DGRAM)

          # 不需要连接, 可以直接发送数据,只需要知道对方的ip和端口即可.

          c.sendto('这是UDP的客户端'.encode('utf-8'),(127.0.0.1,10000))

          # 关闭客户端

          c.close()

          

        

  • 相关阅读:
    微信 token ticket jsapi_ticket access_token 获取 getAccessToken get_jsapi_ticket方法
    PHP 日志 记录 函数 支持 数组 对象 新浪 sae 环境 去掉 空格 换行 格式化 输出 数组转字符串
    原生 原始 PHP连接MySQL 代码 参考mysqli pdo
    PHP 数字金额转换成中文大写金额的函数 数字转中文
    使用PHPMailer发送带附件并支持HTML内容的邮件
    设置输出编码格式 header 重定向 执行时间 set_time_limit 错误 报告 级别 error_reporting
    html5 bootstrap pannel table 协议 公告 声明 文书 模板
    指向指针的指针
    二级指针
    c语言:当指针成为参数后
  • 原文地址:https://www.cnblogs.com/lvyipin1/p/9898104.html
Copyright © 2011-2022 走看看