【sockets套接字编程】

1.目的:
通过编程语言提供的函数接口进行组合,更简单的完成基于tcp或者udp通信的网络编程

2.套接字:
完成上述目标的一种编程方法

3.套接字分类:
流式套接字(SOCK_STREAM): 传输层基于tcp的协议进行通信
数据报套接字(SOCK_DGRAM): 传输层基于udp协议进行通信
底层套接字(SOCK_RAM): 访问底层协议的套接字

【tcp流式套接字和udp数据报套接字使用区别】

  1. 流式套接字采用字节流的方式传输,而数据报套接字以数据包形式传输

  2. tcp会产生粘包现象,udp不会

  3. tcp编程保证数据传输的可靠性,udp则不保证

  4. tcp需要listen accecp,udp不需要

  5. 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传输】

  1. HTTP协议—>超文本传输协议

  2. 用途:
    编写基于http协议的数据传输程序
    网站中浏览器端获取网页的过程

  3. 作用:
    将想要获取的内容以http协议的格式发送给服务端,
    服务端根据格式进行解析获取到真实需求,
    将结果以http协议的格式回复给客户端

  4. 特点:

    1. 应用层协议,传输层使用tcp服务
    2. 简单、灵活、和多种语言对接方便
    3. 无状态的协议,即不记录用户使用过程中传递的内容
    4. http1.1版本 支持持久连接
  5. 请求与响应:
      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. 将响应内容回发给浏览器

【本地套接字】

  1. Linux下文件类型:
    b(快设备文件)
    c(字符设备文件 显示器、键盘等)
    d(目录/文件夹)
    -(普通文件 压缩包、音视频、文本)
    l(链接文件)
    s(套接字文件)
    p(管道文件)
    (套接字文件不占磁盘空间的,始终在内存中运行)
    srwxrwxr-x 1 tarena tarena 0 6月 8 11:07 sock_file
    (所以大小为0)

  2. 作用:
    用于本地不同的程序间进行通信
    (在Linux和Unix操作系统下,提供本地进程间通信的一种方式)

  3. 本地套接字创建流程:

    1. 创建套接字对象(文件)
      sockfd = socket(AF_UNIX,SOCK_STREAM)
    2. 建立套接字文件
      sockfd.bind(path)绑定一个文件
      path是一个文件的路径字符串
    3. 监听
    4. 接收发送消息
  4. 补充:
    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相关推荐

  1. 未经处理的异常:System.Net.Sockets.SocketException: 以一种访问权限不允许的方式做了一个访问套接字的尝试...

    报错:未经处理的异常:System.Net.Sockets.SocketException: 以一种访问权限不允许的方式做了一个访问套接字的尝试 → 尝试以"管理员身份"运行程序, ...

  2. 使用 TCP / IP 套接字(Sockets)

    使用TCP / IP 套接字(Sockets) TCP/IP 套接字提供了跨网络的低层控制.TCP/IP套接字是两台计算机之间的逻辑连接,通过它,计算机能够在任何时间发送或接收数据:这个连接一直保持, ...

  3. python 图形化socket编程_Python黑帽编程2.8 套接字编程

    Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...

  4. [转]如何借助 TLS/SSL 确保套接字连接的安全(使用 C#/VB/C++ 和 XAML 的 Windows 应用商店应用)...

    本文转自:http://msdn.microsoft.com/zh-cn/library/windows/apps/jj150597.aspx 本主题将展示在使用 StreamSocket 功能时,如 ...

  5. Linux套接字与虚拟文件系统

    引言    在Unix的世界里,万物皆文件,通过虚拟文件系统VFS,程序可以用标准的Unix系统调用对不同的文件系统,甚至不同介质上的文件系统进行读写操作.对于网络套接字socket也是如此,除了专属 ...

  6. python套接字编程_Python网络编程 Python套接字编程

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

  7. 套接字编程(VC_Win32)

    简介(源于维基) Berkeley套接字(也作BSD套接字应用程序接口)刚开始是4.2BSD Unix操作系统(于1983发布)的一套应用程序接口.然而,由于AT&T的专利保护着UNIX,所以 ...

  8. 浅析C#中的套接字编程

    套接字基本概念: 套接字是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.可以将套接字看作不同主机间的进程进行双向通信的端点,它构成了单个主机内及整个网络间的编程界面.套接字存在于通信域中 ...

  9. Python网络编程2:创建套接字和套接字对象的内建方法

    1.使用socket模块中socket()函数创建套接字: socket()函数返回一个socket对象,该对象的方法实现了各种socket系统调用. 语法: import socket socket ...

最新文章

  1. phpstudy集成环境安装redis扩展
  2. 开发办公APP时间估算
  3. OpenCV在图像上添加边框borders
  4. xpath 简单小记
  5. 我不知道的事——深克隆和浅克隆
  6. uvm 形式验证_UVM基础
  7. 使用 Skeleton Screen 提升用户感知体验
  8. IE每打开一个网页跳出网页处理
  9. redis常用命令(高级篇)
  10. Intel 64/x86_64/IA-32/x86处理器 - 通用指令(2) - 二进制算术指令/十进制算术指令
  11. 求一个二维数组的最大子矩阵的和
  12. android 微信分享小程序 图片显示不全
  13. 用python判断素数合数_使用Python判断质数(素数)的简单
  14. 解决VMware虚拟机无法上网
  15. bzoj21012101: [Usaco2010 Dec]Treasure Chest 藏宝箱(滚动数组优化dp)
  16. vs2015安装使用体验
  17. kali安装flash插件
  18. vue3项目源码汇集
  19. robotframework基础入门:(3):找不到关键字的对应方法
  20. 大型网站seo布局怎么做

热门文章

  1. 浮点数切分 C++
  2. 【001】机器学习基础-凸优化基础
  3. java点名代码滚动_JAVA多线程实现简单的点名系统
  4. 设计模式——策略模式
  5. 订单表的字段类型 mysql_Mysql数据库下订单表如何设计?
  6. 解密区块链最强心脏 迅雷链共识算法详解
  7. CSAPP Bomb Lab
  8. Uncaught TypeError: Cannot read property 'decimalSeparator' of undefined
  9. k8s 1.25学习8 - 使用Ratel工具部署应用
  10. 岩板铺地好吗_岩板铺大客厅路面好么 比800*800的地砖更美观大方又空气?