套接字sockets
【sockets套接字编程】
1.目的:
通过编程语言提供的函数接口进行组合,更简单的完成基于tcp或者udp通信的网络编程
2.套接字:
完成上述目标的一种编程方法
3.套接字分类:
流式套接字(SOCK_STREAM): 传输层基于tcp的协议进行通信
数据报套接字(SOCK_DGRAM): 传输层基于udp协议进行通信
底层套接字(SOCK_RAM): 访问底层协议的套接字
【tcp流式套接字和udp数据报套接字使用区别】
流式套接字采用字节流的方式传输,而数据报套接字以数据包形式传输
tcp会产生粘包现象,udp不会
tcp编程保证数据传输的可靠性,udp则不保证
tcp需要listen accecp,udp不需要
tcp使用recv send进行消息收发,udp使用recvfrom和sendto
【补充】
sendall()
功能:同send
参数:同send
返回值:发送成功返回None,发送失败返回异常
【套接字对象】
(s表示一个套接字对象)
s.fileno()
功能:
获取套接字的文件描述符
文件描述符:
每一个IO事件操作系统都会分配一个不同的正数与之匹配,该正数即为此IO操作的文件描述符
sys.stdin 0
sys.stdout 1
sys.stderr 2
In [1]: import sysIn [2]: sys.stdin.fileno()
Out[2]: 0
In [3]: sys.stdout.fileno()
Out[3]: 1In [4]: sys.stderr.fileno()
Out[4]: 2
s.type:获取套接字的类型
s.family: 地址类型
s.getsockname()
功能:获取套接字绑定的地址
s.getpeername()
功能:用户连接套接字,获取连接端的地址
s.setsockopt(level,optname,value)
功能:
设置套接字选项
参数:
leval:设置选项的类型
IPPROTP_TCP IPPROTO_IP
SOL_SOCKET
optname:选项类型中的子选项
value:为选定的选项设置值
s.getsockopt(level,optname)
功能:获取套接字选项值
参数:
leval:获取选项的类型
IPPROTP_TCP IPPROTO_IP
SOL_SOCKET
optname:选项类型中的子选项
返回值:
获取到的值
【udp套接字应用之广播】
一点发送多点接收
目标地址:广播地址 一个网段内最大的地址
广播:176.130.5.255
广播风暴:
占用大量的带宽造成网络拥塞
示例:
broadcast_send.py
from socket import *
from time import sleep# 广播地址
dest = ('176.130.5.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()
broadcast_recv.py
from socket import *# 创建数据报套接字
s = socket(AF_INET,SOCK_DGRAM)# 设置可以接收广播
s.setsockopt(SOL_SOCKET,SO_BROADCAST,1)# 固定端口号
s.bind(('',9999))while True:try:msg,addr = s.recvfrom(1024)print('从{}获取信息:{}'.\format(addr,msg.decode()))except (KeyboardInterrupt,SyntaxError):raiseexcept Exception as e:print(e)
s.close()
【tcp应用之http传输】
HTTP协议—>超文本传输协议
用途:
编写基于http协议的数据传输程序
网站中浏览器端获取网页的过程作用:
将想要获取的内容以http协议的格式发送给服务端,
服务端根据格式进行解析获取到真实需求,
将结果以http协议的格式回复给客户端特点:
- 应用层协议,传输层使用tcp服务
- 简单、灵活、和多种语言对接方便
- 无状态的协议,即不记录用户使用过程中传递的内容
- http1.1版本 支持持久连接
请求与响应:
http请求(Request)
请求格式:
请求行:具体的请求类别
GET / HTTP/1.1
请求种类 请求内容 协议版本
请求头:对请求信息的具体描述
Accept:text/html
以键值对的格式对信息进行具体描述空行
请求体:具体的请求参数或者提交内容
请求类型:
GET:获取网络资源
POST:提交一定的附加数据,得到返回结果
HEAD:获取响应头
PUT:更新服务器资源
DELETE:删除服务器资源
CONNECT:#保留,暂无作用
TRACE:用于测试
OPTIONS:获取服务端性能
HTTP响应(Response)
是服务器给客户端发
响应格式:
响应行:反馈具体的响应情况
HTTP/1.1 200 OK
版本 响应码 附加信息
响应码:
1xx 提示信息,表示请求已被接受
2xx 响应成功
3xx 响应需要重定向
4xx 客户端错误
5xx 服务端错误
如:200 响应成功
404 请求内容不存在
401 没有访问权限
500 服务器发生未知错误(bug)
503 服务器暂时不能执行响应头:对响应的具体描述
Accept-Ranges:bytes
以键值对方式给出响应信息的具体描述
空行
响应体:将客户想要的内容进行返回
要求: 什么是http协议
请求格式和每部分的功能
响应格式和每部分功能
http请求和响应的流程
httpserver (HTTP协议):
1. 接收浏览器的连接
2. 将接收内容解析
3. 组织响应内容
4. 将响应内容回发给浏览器
【本地套接字】
Linux下文件类型:
b(快设备文件)
c(字符设备文件 显示器、键盘等)
d(目录/文件夹)
-(普通文件 压缩包、音视频、文本)
l(链接文件)
s(套接字文件)
p(管道文件)
(套接字文件不占磁盘空间的,始终在内存中运行)
srwxrwxr-x 1 tarena tarena 0 6月 8 11:07 sock_file
(所以大小为0)作用:
用于本地不同的程序间进行通信
(在Linux和Unix操作系统下,提供本地进程间通信的一种方式)本地套接字创建流程:
- 创建套接字对象(文件)
sockfd = socket(AF_UNIX,SOCK_STREAM) - 建立套接字文件
sockfd.bind(path)绑定一个文件
path是一个文件的路径字符串 - 监听
- 接收发送消息
- 创建套接字对象(文件)
补充:
os.path.exists(path)
功能:判断一个文件是否存在
参数:文件位置
返回值:存在返回True,否则返回False
os.unlink() os.remove
功能:删除一个文件
参数:要删除的文件路径
unix_recv.py
from socket import *
import os# 确定使用哪个套接字文件
sock_file = './sock_file'# 如果已经存在同名的文件则删除
if os.path.exists(sock_file):os.unlink(sock_file)# 创建本地套接字
sockfd = socket(AF_UNIX,SOCK_STREAM)
# 绑定套接字文件
sockfd.bind(sock_file)
# 监听
sockfd.listen(5)
# 消息收发
while 1:connfd,addr = sockfd.accept()while 1:data = connfd.recv(1024)if data:print(data.decode())connfd.send(b'Receive your message')else:break
unix_send.py
# 本地套接字发送端from socket import *# 确保和另一端使用相同的套接字文件
sock_file = './sock_file'
# 创建本地套接字
sockfd = socket(AF_UNIX,SOCK_STREAM)
# 连接另一端
sockfd.connect(sock_file)# 收发消息
while 1:msg = input('>>>')if msg:sockfd.send(msg.encode())data = sockfd.recv(1024).decode()print('收到消息:',data)else:break
sockfd.close()
套接字sockets相关推荐
- 未经处理的异常:System.Net.Sockets.SocketException: 以一种访问权限不允许的方式做了一个访问套接字的尝试...
报错:未经处理的异常:System.Net.Sockets.SocketException: 以一种访问权限不允许的方式做了一个访问套接字的尝试 → 尝试以"管理员身份"运行程序, ...
- 使用 TCP / IP 套接字(Sockets)
使用TCP / IP 套接字(Sockets) TCP/IP 套接字提供了跨网络的低层控制.TCP/IP套接字是两台计算机之间的逻辑连接,通过它,计算机能够在任何时间发送或接收数据:这个连接一直保持, ...
- python 图形化socket编程_Python黑帽编程2.8 套接字编程
Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...
- [转]如何借助 TLS/SSL 确保套接字连接的安全(使用 C#/VB/C++ 和 XAML 的 Windows 应用商店应用)...
本文转自:http://msdn.microsoft.com/zh-cn/library/windows/apps/jj150597.aspx 本主题将展示在使用 StreamSocket 功能时,如 ...
- Linux套接字与虚拟文件系统
引言 在Unix的世界里,万物皆文件,通过虚拟文件系统VFS,程序可以用标准的Unix系统调用对不同的文件系统,甚至不同介质上的文件系统进行读写操作.对于网络套接字socket也是如此,除了专属 ...
- python套接字编程_Python网络编程 Python套接字编程
Python 提供了两个级别访问的网络服务. 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高级别的网络服 ...
- 套接字编程(VC_Win32)
简介(源于维基) Berkeley套接字(也作BSD套接字应用程序接口)刚开始是4.2BSD Unix操作系统(于1983发布)的一套应用程序接口.然而,由于AT&T的专利保护着UNIX,所以 ...
- 浅析C#中的套接字编程
套接字基本概念: 套接字是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.可以将套接字看作不同主机间的进程进行双向通信的端点,它构成了单个主机内及整个网络间的编程界面.套接字存在于通信域中 ...
- Python网络编程2:创建套接字和套接字对象的内建方法
1.使用socket模块中socket()函数创建套接字: socket()函数返回一个socket对象,该对象的方法实现了各种socket系统调用. 语法: import socket socket ...
最新文章
- phpstudy集成环境安装redis扩展
- 开发办公APP时间估算
- OpenCV在图像上添加边框borders
- xpath 简单小记
- 我不知道的事——深克隆和浅克隆
- uvm 形式验证_UVM基础
- 使用 Skeleton Screen 提升用户感知体验
- IE每打开一个网页跳出网页处理
- redis常用命令(高级篇)
- Intel 64/x86_64/IA-32/x86处理器 - 通用指令(2) - 二进制算术指令/十进制算术指令
- 求一个二维数组的最大子矩阵的和
- android 微信分享小程序 图片显示不全
- 用python判断素数合数_使用Python判断质数(素数)的简单
- 解决VMware虚拟机无法上网
- bzoj21012101: [Usaco2010 Dec]Treasure Chest 藏宝箱(滚动数组优化dp)
- vs2015安装使用体验
- kali安装flash插件
- vue3项目源码汇集
- robotframework基础入门:(3):找不到关键字的对应方法
- 大型网站seo布局怎么做
热门文章
- 浮点数切分 C++
- 【001】机器学习基础-凸优化基础
- java点名代码滚动_JAVA多线程实现简单的点名系统
- 设计模式——策略模式
- 订单表的字段类型 mysql_Mysql数据库下订单表如何设计?
- 解密区块链最强心脏 迅雷链共识算法详解
- CSAPP Bomb Lab
- Uncaught TypeError: Cannot read property 'decimalSeparator' of undefined
- k8s 1.25学习8 - 使用Ratel工具部署应用
- 岩板铺地好吗_岩板铺大客厅路面好么 比800*800的地砖更美观大方又空气?