网络的概念:主机   端口  IP  协议
  • 服务器:
  • localhost/127.0.0.1
  • 客户端:
  • 只是在本机启动客户端,用127.0.0.1访问
 
 
  • 服务器:
  • 0.0.0.0
  • 客户端:
  • 可以在本机用127.0.0.1、192.168.0.1
 
  • 服务器:
  • 192.168.0.1
  • 客户端:
  • 局域网内用192.168.0.1
 
 
socket(创建套接字) ---> bind(绑定地址) ---> listen(设置监听)---> accept(等待链接) ---> recv/send(收/发消息) ---> close ()
 
 
 
收发函数特性:
     recv特征:
  1. 如果建立的另一端链接被断开, 则recv立即返回空字符串
  2. recv接受缓冲区取出内容,当缓冲区为空则阻塞
  3. recv如果一次接受不完缓冲区的内容下次执行会自动接受
     send特征:
  1. 如果发送的另一端不存在则会产生Pipe Broken异常
  2. send发送缓冲区发送内容,缓冲为满则堵塞
 
网络的收发缓存区:
    在内存中开辟区域,用于发送和接受的缓冲
    作用:
  1. 协调数据的收发(接受和处理速度
  2. 减少磁盘的交互
sendall(date):
   功能:tcp套接字发送消息
   参数:同send
   返回值:如果发送成功返回None   否则返回异常
 
 
tcp粘包:
   产生原因:
        1.tcp传输以字节流的方式发送消息,消息之间没有边界
2.发送比接受的速度快
   影响:
        对每次发送的内容是一个独立的意识需要单独识别时 容易使用原文件被更改
   如何处理:
        1.每次发送后追加一个结尾标志,代表本次发送完毕
2.发送一个数据结构
3.每次发送有一个时间间隔
 
基于udp的服务端编程:
    1.创建套接字:
        sockfd = socket(AF_INET,SOCK_DGRAM)
    2.绑定地址:
        sockfd.bind()
    3.消息收发
        data, addr = sockfd.recvfrom(buffersize)
         功能:接受udp消息
 参数:接受消息的大小
 返回值:
     data 接受到的内容
     addr 消息发送的地址
        
recvfrom每次接受一个报文,如果没有接受到的内容则直接丢弃
        sockfd.sendto(data, addr)
  功能:udp消息发送
  参数:
      data 要发送的内容 bytes
      addr 目标地址
  返回:发送字节数
    4.关闭套接字:
        socket.close()
 
 
import sys
   sys.argv
   作用:
      获取从命令行获取的参数内容
      Python3 demo.py 参数1, 参数2.....
 
      sys.argv[0] 是命令本身(程序本身)
 
 
tcp流式套接字和udp数据报套接字区别:
  • 1.流式套接字采用字节流的方式进行传输,
  • 而数据报套接字使用数据报形式传输数据
  • 2.tcp套接字会产生粘包,udp不会
  • 3.tcp编程可以保证消息的完整性,udp则不一定
  • 4.tcp需要listen、accept、udp不用
  • 5.tcp消息的发送接收使用recv、send、sendall、
  • udp使用recvfrom,sendto
 
 
 
socket模块套接字属性(s为套接字)
  • s.type:表示套接字类型
  • s.family地址类型
 
  套接字属性方法
    s.fileno()
    功能:
       获取套接字的文件描述符
  文件描述符:
     每一个IO事件 操作系统都会分配一个不同的的正整数,
     该正整数即为此IO操作的文件描述符
     默认开启的描述符:
  1.          sys.stdin      0
  2.          sys.stdout   1
  3.          sys.stderr    2
 
  s.getsockname()
     功能:
       获取套结字绑定的地址
  s.getpeername()
     功能:
       获取链接套接字客户端的地址
  s.setsockopt(level,optname, value)
       (# 设置端口可立即重用 必须在链接端口前设置
        s.setsockopt(SOL_SOcKET, SO_REUSEADDR))
     功能:设置套接字选项
     参数:
        level:设置选项的类型(大类型)  常用:SOL_SOCKET
optname:子类选项
value:要设置的值
 
  s.getsockopt(level, optname)
     功能:获取套接字选项值
     参数:
        level:选项的类型
 
udp套接字应用--->  广播
    一点发送多点接收
    目标地址:广播地址 172.18.32.255
 
 
tcp应用---> http传输
 
http协议:
   超文本传输协议
   用途:
      网站中浏览器网页的获取,基于网站事物数据传输
      编写基于http协议的数据传输
   特点:
      1.应用层协议,传输层使用tcp服务
      2.简单、灵活,可以使用多种编程语言操作
      3.无状态的协议,既不用记录用户的输入内容
      4.http1.1  ---> http2.0(还没发布)  技术的成熟和稳定性
   http请求(request):
      请求格式:
         1.请求行:说明具体的请求类别和内容
          GET    /index.html    /HTTP/1.1
                请求类别   请求内容    协议版本
     请求类别:
  1. GET:              获取网络资源
  2. POST:           提交一定的附加数据
  3. HEAD:          获取响应头
  4. PUT:             更新服务器资源
  5. DELETE:        删除服务器资源
  6. CONNECT:   未使用
  7. TRACE:         用于测试
  8. OPTIONS:    获取服务器性能信息
 
 2.请求头:请求的具体描述
     Accept:text/html
        每一个键值对占一行,描述了一个特定信息
 3.空行
 4.请求体: 具体参数或提交的内容
    get参数或者post提交的内容
   http响应(response):
      响应格式:
         1.响应行:反馈具体的响应情况
          HTTP/1.1     20       OK
  版本协议   响应码   附加信息
    响应码:
  1. 1xx:提示信息,表示请求已接收
  2.  2xx:响应成功
  3. 3xx:响应需要定向(重新记载链接第三方链接)
  4. 4xx:客户端错误
  5.  5xx:服务器端错误
    常见响应码:
     200  成功
     404  请求内容不存在
     401  没有访问权限
     500  服务器未知错误
     503  服务器暂时无法执行
      2.响应头:对响应内容的具体描述
      3.空行
      4.响应体:
         将客户端请求内容进行返回
 

 
 
 
 
这里这个图就看了一眼 没特意去记  凭印象画的  可能不对 但是大体逻辑应该没错 
我去百度搜了 什么也没搜到 不知道是不是我的打开方式不对还是什么
只搜到了上面的两张图..........
 
总结:
tcp,udp协议的区别和编程实现上的差异:
          tcp:
  • tcp是一种可靠的、面向有链接数据传输服务
  • tcp能够保证数据的完整性、顺序性、无重复以及无差错
  • tcp是一种以文件流的形式传输数据的服务 文件流之间是没有边界
  • 的所以基友可能会产生粘包的情况 粘包是因为接受速度没有传输速度快
  • 导致缓存区的数据拥堵 下次取出数据时从而产生非独立数据的链接 这种情况
  • 叫做粘包  粘包只有传输多个数据时才会出现
  • tcp的编程需要监听套接字 和 等待链接过程 只有链接成功才能发送数据
  • 这种情况叫做三次握手、还有断开时的四次挥手
  • 三次挥手:客户端请求链接、服务器返回报文、客户端完成链接
  • 四次挥手:客户端请求断开、服务器接受请求、服务器准备完毕可以断开、客户端断开
  • tcp收发送消息需要使用recv、send、sendall方法
  • sendall比特殊 功能和send一样 但sendall有事务  若发送成功返回None 否则触发异常
  • 链接时必须先运行服务器端后运行客户端
         udp:
  • udp就比较简单了  是面向无连接的不可靠的数据传输服务
  • udp没有数据流  接受大小取决于接收方
  • 若数据超出接收方接受范围则丢掉所有超出范围的内容
  • udp不存在粘包的情况
  • udp不需要等待链接 没有挥手过程 先发就发 想收就收 自由度比较高
  • udp编程时收发消息使用recvfrom、sendto方法
  • udp可用于广播可以随时断开或链接
  • 客户端和服务器端可以随时运行
 
什么是http?
 
       http 是超文本传输协议
               一种网络数据传输的协议
              没错就是  协议
             并且所有的www文件都必须遵守这个标准
http作用是什么?
 
      可以用力来网站中浏览器网页获取,基于网站上的一些数据传输 例如目前我正在打的字......
      编写基于http协议的数据传输  
 
http协议 请求和响应的格式以及每一部分做什么
      请求部分:
               请求行:请求的具体类别和内容   比如说  类别、内容、版本协议
               请求头:请求具体描述
               空行:就是空行
               请求体:请求具体参数或内容
      响应部分:
               响应行:具体响应情况     比如说  版本协议 、响应码 、附加信息  
               响应头:响应具体描述
               空行
               响应体:响应具体参数或内容
http协议中请求的基本类型和作用:
        GET:获取网络资源
        POST:提交一定的附加数据
        HEAD:获取响应头 响应返回的文件信息
        PUT:更新服务器资源
        DELETE:删除服务器资源
        TRACE:用于测试
         OPIONS:获取服务器性能信息
        CONNECT:备用
http协议响应码的类型和表达含义:
          以1开头的表示请求已经链接
          以2开头的表示成功接收、提示
          以3开头的代表重新定向进一步处理 第三方
          以4开头的客户端错误
          以5开头的服务器错误
http协议请求网页的流程:
           建立连接、发送请求、响应请求、断开链接
           这样的一个过程称为一个事物
           
 
 文件传输示例:
服务器端
from socket import *
from time import sleep s = socket() s.bind(('0.0.0.0',8888))
s.listen(5) c,addr = s.accept()
print("Connect from ",addr) f = open('img.jpg','rb')
#将文件名称告知对方
c.send('img.jpg'.encode())
sleep(0.1) while True:
data = f.read(1024)
if not data:
break
c.send(data) sleep(0.1)
c.send('##'.encode()) data = c.recv(1024)
print(data.decode()) f.close()
c.close()
s.close()

客户端

from socket import * 

s = socket()

s.connect(('172.60.50.181',8888))

filename = s.recv(1024).decode()

f = open('/home/tarena/'+filename,'wb')

while True:
data = s.recv(1024)
if data == b'##':
break
f.write(data) s.send("接收完成".encode()) f.close()
s.close()

Python网络编程(socket模块、缓冲区、http协议)的更多相关文章

  1. python 网络编程--socket模块/struct模块

    socket模块: 客户端:CS架构,  client -> server 浏览器:BS架构,  browser -> server 网络通信本质:传输字节 doc命令查看ip地址:ipc ...

  2. 铁乐学Python_Day33_网络编程Socket模块1

    铁乐学Python_Day33_网络编程Socket模块1 部份内容摘自授课老师的博客http://www.cnblogs.com/Eva-J/ 理解socket Socket是应用层与TCP/IP协 ...

  3. Python网络编程socket

    网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...

  4. Day07 - Python 网络编程 Socket

    1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...

  5. 《Python网络编程》学习笔记--UDP协议

    第二章中主要介绍了UDP协议 UDP协议的定义(转自百度百科) UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向事务 ...

  6. python网络编程-socket套接字通信循环-粘包问题-struct模块-02

    前置知识 不同计算机程序之间数据的传输 应用程序中的数据都是从程序所在计算机内存中读取的. 内存中的数据是从硬盘读取或者网络传输过来的 不同计算机程序数据传输需要经过七层协议物理连接介质才能到达目标程 ...

  7. python网络编程--socket,网络协议,TCP

    一. 客户端/服务端架构(用到网络通信的地方) 我们使用qq.微信和别人聊天,通过浏览器来浏览页面.看京东的网站,通过优酷.快播(此处只是怀念一下)看片片啥的等等,通过无线打印机来打印一个word文档 ...

  8. Python的网络编程socket模块

    (1)利用socket进行简单的链接 Python里面的socket支持UDP.TCP.以及进程间的通信,socket可以把我们想要发送的东西封装起来,发送过去,然后反解成原来的样子,事实上网路通信可 ...

  9. python网络编程-socket编程

     一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...

  10. Day10 Python网络编程 Socket编程

    一.客户端/服务器架构 1.C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务)[QQ,SSH,MySQL,FTP] 2.C/S架构与socket的关系: 我们学习soc ...

随机推荐

  1. autofac 的好博文

    https://www.cnblogs.com/neverc/p/4914091.html#e https://www.cnblogs.com/stulzq/p/8547839.html

  2. c#方法(整理自菜鸟网)

    定义一个方法,根本上说就是在声明它的结构的元素 定义方法的语法如下: <访问修饰符(public啥的)> < 返回值数据类型,没有返回值的为void >  <方法名称&g ...

  3. tp5 验证是不是ajax提交

    话不多说,看代码 if(request()->isAjax()){ return "是ajax提交"; }else{ return "不是ajax提交"; ...

  4. 深入理解HDFS的架构和原理

    (一) HDFS主要是用于做什么的? HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处 ...

  5. javascript入门笔记3-dom

    1.通过ID获取元素 document.getElementById("id") <!DOCTYPE HTML> <html> <head> & ...

  6. java XML 通过BeanUtils的population为对象赋值 根据用户选择进行dom4j解析

    根据xml文件设计Student对象 <?xml version="1.0" encoding="UTF-8"?> <students> ...

  7. exa命令详解

    exa 是 ls 文件列表命令现代化替代品. 官网:https://the.exa.website/ GitHub:https://github.com/ogham/exa 后续整理中……

  8. eCharts.js使用心得

    最近刚刚做了一个项目,需求是使用eCharts实现实时监控,可以动态的增加和删除数据,可以全屏展示,趁着现在还没忘干净,整理一下使用过程中出现的问题和经验.可能有分析的不到位的地方,不喜勿喷! 一.图 ...

  9. PHP生成ZIP压缩文件

    PHP生成ZIP压缩文件 /* * 生成zip压缩文件 * $sourceDir:被压缩的文件夹或文件 * $outFileName:输出的压缩文件名称 * */ function createZip ...

  10. 多线程(threading module)

    一.线程与进程 线程定义:线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不 ...