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()

          

        

  • 相关阅读:
    linux下使用c99链接libuv遇到的问题
    linux连接lua遇到的问题
    uv_timer_t的释放问题
    libuv的源码分析(1)
    [转]关于截取字符串substr和substring两者的区别
    输入框获取焦点后placeholder文字消失、修改placeholder的样式
    发送验证码功能
    针对移动浏览器判断不同的内核的方法
    preventDefault()对象
    [转]JQ中$(window).load和$(document).ready区别与执行顺序
  • 原文地址:https://www.cnblogs.com/lvyipin1/p/9898104.html
Copyright © 2011-2022 走看看