UDP应用:广播

  • 广播:一点发送,多点接收
  • 广播地址:一个网段内有一个指定的广播地址,是该网段的最大地址
    • 192.168.2.255
  • 广播风暴:一个网络中有大量的广播就会产生广播风暴占用大量带宽,影响正常的访问速度
# 接受广播:
from socket import * #创建套接字
s = socket(AF_INET,SOCK_DGRAM) #设置套接字可以发送接收广播
s.setsockopt(SOL_SOCKET,SO_BROADCAST,1) #固定接收端口
s.bind(('0.0.0.0',9999)) while True:
try:
msg,addr = s.recvfrom(1024)
print("从{}获取信息:{}".\
format(addr,msg.decode()))
except (KeyboardInterrupt,SyntaxError):
raise
except Exception as e:
print(e)
s.close()
# 发送广播
from socket import *
from time import sleep #设置目标地址
dest = ('192.168.2.255',9999) s = socket(AF_INET,SOCK_DGRAM) #设置能够发送广播
s.setsockopt(SOL_SOCKET,SO_BROADCAST,1) while True:
sleep(2)
s.sendto("来呀,带你去看晴空万里".encode(),dest) s.close()

TCP应:http传输

  • http协议:超文本传输协议,是一个应用层协议

  • 用途:网页数据的传输,数据传输方法

  • 特点 :

    1. 应用层协议,传输层使用tcp服务
    2. 简单,灵活,多种语言都有http相关操作接口
    3. 无状态的协议,即不记录用户传输的信息
    4. http1.1 支持持久连接
  1. 一端通过http请求的格式发送具体请求内容,另一端接收http请求,按照协议格式解析

  2. 获取真实请求后按照http协议响应格式组织回复内容,回发给请求方,完成一次数据交互

http请求(request)

  • 请求行:具体的请求类别和请求内容

    • 格式:GET / HTTP/1.1(请求类别 请求内容 协议版本)
    • 请求类别:表示请求的种类
      • GET 获取网络资源
      • POST 提交一定的附加信息,得到返回结果
      • HEAD 获取响应头
      • PUT 更新服务器资源
      • DELETE 删除服务器资源
      • CONNECT
      • TRACE 用于测试
      • OPTIONS 获取服务器性能信息
  • 请求头:对请求内容的具体描述信息

    • Accept-Encoding: gzip, deflate
    • Accept-Language: zh-CN,zh;q=0.9
    • Cache-Control: max-age=0
    • Connection: keep-alive
  • 空行

  • 请求体:请求参数或者是提交内容

http响应(response)

  • 响应行:反馈响应的情况

    • 格式 : HTTP/1.1 200 OK(协议版本 响应码 附加信息)
    • 响应码:响应的具体情况
      • 1xx : 提示信息,表示请求成功
      • 2xx : 响应成功
      • 3xx : 响应需要重定向
      • 4xx : 客户端错误
      • 5xx : 服务端错误
    • 常见响应码:
      • 200 成功
      • 404 请求内容不存在
      • 401 没有访问权限
      • 500 服务器发生未知错误
      • 503 暂时无法执行
  • 响应头:对响应内容的具体描述

    • Connection: keep-alive
    • Content-Encoding: gzip
    • Content-Type: text/html
    • Date: Thu, 06 Sep 2018 09:11:18 GMT
  • 空行

  • 响应体:返回给请求端的具体内容

from socket import * 

#创建tcp套接字
s = socket() s.bind(('0.0.0.0',8000))
s.listen(5) while True:
c,addr = s.accept()
print("Connect from",addr)
data = c.recv(4096)
print("*******************")
print(data) #浏览器发来的http请求
print("*******************") #组织响应内容
data = '''HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Type: text/html <h1>Welcome back Home</h1>
<p>这是一个测试</p>
'''
c.send(data.encode())
c.close() s.close()

要求

  1. 什么是http协议
  2. 请求的格式和每一部分的功能
  3. 响应的格式和每一部分功能
  4. 常见的请求类型和响应码代表什么

通过tcp套接字完成一个文件的发送,将一个文件从客户端发送给服务端,或者从服务端发送给客户端均可,文件可以是文本,也可以是图片

HTTPServer

# 编写简易的HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>主页</title>
</head>
<body>
<h1>My first html page</h1>
</body>
</html>
# 编写本地服务端
from socket import * def handleClient(connfd):
connfd.recv(4096)
# request = connfd.recv(4096)
# #将request请求按行分割打印出来显示
# request_lines = request.splitlines()
# for line in request_lines:
# print(line.decode()) try:
f = open("index.html")
except IOError:
response = "HTTP/1.1 404 not found\r\n"
response += "\r\n" #空行
response += "====Sorry not found====="
else:
response = "HTTP/1.1 200 OK\r\n"
response += "\r\n" #空行
response += f.read()
finally:
#发送给浏览器
connfd.send(response.encode()) #创建套接字
def main():
sockfd = socket() # 设置端口重用
sockfd.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
# 绑定监听
sockfd.bind(('0.0.0.0',9999))
sockfd.listen(3)
print("Listen to the port 9999") while True:
connfd,addr = sockfd.accept()
#处理请求
handleClient(connfd)
connfd.close() if __name__ == "__main__":
main()

在浏览器中运行127.0.0.1:9999

PythonNET网络编程2的更多相关文章

  1. PythonNET网络编程1

    # PythonNET 网络编程 ISO(国际标准化组织) 制定了 OSI(Open System Interconnectio),意为开放式系统互联.国际标准化组织(ISO)制定了OSI模型,该模型 ...

  2. PythonNET网络编程4

    本地套接字 Linux 文件 b(块设备文件) c(字符设备文件) d(目录) -(普通文件) l(链接) s(套接字) p(管道) 作用:用于本地不同的程序间进行通信 创建流程 创建本地套接字 so ...

  3. PythonNET网络编程3

    IO IO input output 在内存中存在数据交换的操作都可以认为是IO操作 和终端交互 : input print 和磁盘交互 : read write 和网络交互 : recv send ...

  4. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

  5. python select网络编程详细介绍

    刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...

  6. Linux Socket 网络编程

    Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...

  7. 猫哥网络编程系列:详解 BAT 面试题

    从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...

  8. 浅谈C#网络编程(一)

    阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...

  9. C++11网络编程

    Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...

随机推荐

  1. xwiki操作手册

    Xwiki官网:http://www.xwikichina.com/xwiki/bin/view/Main/中文官网. 1   用户管理 1.1    添加新用户 用户管理需要管理员权限,管理员登陆后 ...

  2. 洛谷 P1324 矩形分割

    P1324 矩形分割 题目描述 出于某些方面的需求,我们要把一块N×M的木板切成一个个1×1的小方块. 对于一块木板,我们只能从某条横线或者某条竖线(要在方格线上),而且这木板是不均匀的,从不同的线切 ...

  3. 从Java到C++——常量的使用规则

    常量是一种标识符,它的值在执行期间恒定不变.C语言用 #define来定义常量(称为宏常量). C++ 语言除了 #define外还能够用const来定义常量(称为const常量). 一.为什么须要常 ...

  4. 目标决定人生——没有目标就失去一切 (没有目标的奋斗是浪费青春,比如交了钱却不去参加考试、让时间白白溜走。根据目标与定位来选择最合适的企业。人生要算总账)good

    没有目标就失去一切 刚毕业那会儿,幼稚得可笑,老跟同学打电话,明面上聊聊近况,暗地里比较.你要比我工资多一百块,心里特不平衡,凭什么呀,在学校那会儿公认的我比你强.你要带个头衔,而我啥也不是,普通员工 ...

  5. Netty系列之Netty编解码框架分析

    1. 背景 1.1. 编解码技术 通常我们也习惯将编码(Encode)称为序列化(serialization),它将对象序列化为字节数组,用于网络传输.数据持久化或者其它用途. 反之,解码(Decod ...

  6. Python day字符串所有使用

    字符串所有的操作name = "dio"names = "my\t name is {Name} and i am a {job}"print(name.cap ...

  7. 【Codeforces Round #426 (Div. 2) B】The Festive Evening

    [Link]:http://codeforces.com/contest/834/problem/B [Description] [Solution] 模拟水题; 注意一个字母单个出现的时候,结束和开 ...

  8. 前台技术--div的隐藏与显示

    怎样使用页面元素隐藏或显示. HTML为我们提供了两个变量visibility和display visibility:隐藏要元素可是元素所暂用的空间不予释放.也就是说元素隐藏了,可是页面上会流出一片空 ...

  9. 设计模式(7)-结构型模式-Bridge模式

    2.结构性模式 2.2  BRIDGE模式 别名:handle/body 这个模式体现了组合相对于继承的优势. 2.2.1动机 当一个抽象可能有多个实现时,通经常使用继承来协调它们.抽象类定义对该抽象 ...

  10. 20亿与20亿表关联优化方法(超级大表与超级大表join优化方法)

    记得5年前遇到一个SQL.就是一个简单的两表关联.SQL跑了几乎相同一天一夜,这两个表都非常巨大.每一个表都有几十个G.数据量每一个表有20多亿,表的字段也特别多. 相信大家也知道SQL慢在哪里了,单 ...