学习python课程第二十六天

一.    传输层算法

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

  但本质上,计算机的通信是为了应用程序可以通信,而一台计算机上不可能运行一个应用程序设计模式

 

  问题:缓存

    就像咱们同时运行QQ软件和微信软件, 当计算机收到一个数据包时, 须要知道这个数据包究竟是给服务器

    哪一个应用程序的.微信

 

  解决方案:网络

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

    系统保留的tcp

  再次捋清思路:函数

    端口定位应用程序, 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()

相关文章
相关标签/搜索