socket是什么?套接字是什么?
网络编程就是编写程序使两台联网的计算机相互交换数据。
那么,这两台计算机之间用什么传输数据呢?首先你肯定先需要物理连接嘛。
在此基础上,只需要考虑如何编写数据传输程序。看似很麻烦,但实际上这点不用愁,因为操作系统已经提供了 socket。即使对网络数据传输的原理不太熟悉,我们也能通过 socket 来编程。
一、什么是socket
socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。
通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。
socket 的典型应用就是 Web 服务器和浏览器:浏览器获取用户输入的 URL,向服务器发起请求,服务器分析接收到的 URL,将对应的网页内容返回给浏览器,浏览器再经过解析和渲染,就将文字、图片、视频等元素呈现给用户。
例如我们每天浏览网页、QQ 聊天、收发 email 等等。
二、socket 套接字的分类
这个世界上有很多种套接字,Internet 套接字、Unix套接字、X.25 套接字等。
这里我们讨论 Internet 套接字,它是最具代表性的,也是最经典最常用的。我们经常提及的套接字,基本也都是指 Internet 套接字。
根据数据的传输方式,可以将 Internet 套接字分成两种类型。
通过 socket() 函数创建连接时,必须告诉它使用哪种数据传输方式。
1、流格式套接字(SOCK_STREAM)
流格式套接字(Stream Sockets)也叫“面向连接的套接字”,在代码中使用 SOCK_STREAM 表示。
SOCK_STREAM 是一种可靠的、双向的通信数据流,数据可以准确无误地到达另一台计算机,如果损坏或丢失,可以重新发送。
SOCK_STREAM 有以下几个特征:
- 数据在传输过程中不会消失;
- 数据是按照顺序传输的;
- 数据的发送和接收不是同步的(有的说法也称“不存在数据边界”)。
可以将 SOCK_STREAM 想象成一条传输带,只要传输带本身没有问题(不会断网),就能保证数据不丢失;同时,较晚传送的数据不会先到达,较早传送的数据不会晚到达,这就保证了数据是按照顺序传递的。
为什么流格式套接字可以达到高质量的数据传输呢?这是因为它使用了 TCP 协议(The Transmission Control Protocol,传输控制协议),TCP 协议会控制你的数据按照顺序到达并且没有错误。
你也许见过 TCP,是因为你经常听说“TCP/IP”。TCP 用来确保数据的正确性,IP(Internet Protocol,网络协议)用来控制数据如何从源头到达目的地,也就是常说的“路由”。
那么,“数据的发送和接收不同步”该如何理解呢?
假设传输带传送的是水果,接收者需要凑齐 100 个后才能装袋,但是传送带可能把这 100 个水果分批传送,比如第一批传送 20 个,第二批传送 50 个,第三批传送 30 个。接收者不需要和传送带保持同步,只要根据自己的节奏来装袋即可,不用管传送带传送了几批,也不用每到一批就装袋一次,可以等到凑够了 100 个水果再装袋。
流格式套接字的内部有一个缓冲区(也就是字符数组),通过 socket 传输的数据将保存到这个缓冲区。接收端在收到数据后并不一定立即读取,只要数据不超过缓冲区的容量,接收端有可能在缓冲区被填满以后一次性地读取,也可能分成好几次读取。
也就是说,不管数据分几次传送过来,接收端只需要根据自己的要求读取,不用非得在数据到达时立即读取。传送端有自己的节奏,接收端也有自己的节奏,它们是不一致的。
2、数据报格式套接字(SOCK_DGRAM)
数据报格式套接字(Datagram Sockets)也叫“无连接的套接字”,在代码中使用 SOCK_DGRAM 表示。
计算机只管传输数据,不作数据校验,如果数据在传输中损坏,或者没有到达另一台计算机,是没有办法补救的。也就是说,数据错了就错了,无法重传。
因为数据报套接字所做的校验工作少,所以在传输效率方面比流格式套接字要高。
可以将 SOCK_DGRAM 比喻成高速移动的摩托车快递,它有以下特征:
- 强调快速传输而非传输顺序;
- 传输的数据可能丢失也可能损毁;
- 限制每次传输的数据大小;
- 数据的发送和接收是同步的(也称为“存在数据边界”)。
总之,数据报套接字是一种不可靠的、不按顺序传递的、以追求速度为目的的套接字。
数据报套接字也使用 IP 协议作路由,但是它不使用 TCP 协议,而是使用 UDP 协议(User Datagram Protocol,用户数据报协议)。
QQ 视频聊天和语音聊天就使用 SOCK_DGRAM 来传输数据,因为首先要保证通信的效率,尽量减小延迟,而数据的正确性是次要的,即使丢失很小的一部分数据,视频和音频也可以正常解析,最多出现噪点或杂音,不会对通信质量有实质的影响。
注意:SOCK_DGRAM 没有想象中的糟糕,不会频繁的丢失数据,数据错误只是小概率事件。
三、代码方式创建socket
在 Python 中 使用socket 模块的函数 socket 就可以完成:
import socket
socket.socket(AddressFamily, Type)
说明:
函数 socket.socket 创建一个 socket,该函数带有两个参数:
- Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET
- Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)
以下我们稍微简略地用 python 表达下套接字的代码写法。
1、创建一个tcp socket(tcp套接字)
import socket#创建tcp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# ...这里是使用套接字的功能(省略)...# 不用的时候,关闭套接字
s.close()
2、创建一个udp socket(udp套接字)
import socket# 创建udp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# ...这里是使用套接字的功能(省略)...# 不用的时候,关闭套接字
s.close()
说明:
套接字使用流程与文件的使用流程很类似,三部曲:创建套接字,使用套接字收/发数据,关闭套接字。
socket是什么?套接字是什么?相关推荐
- python套接字编程_Python套接字编程(1)——socket模块与套接字编程
在Python网络编程系列,我们主要学习以下内容: 5. 常见的Python异步编程框架 6. 协程在Python网络编程中的使用 本文介绍Python下的基本套接字编程,主要基于 socket 模块 ...
- 使用DatagramSocket发送、接收数据(Socket之UDP套接字)
2019独角兽企业重金招聘Python工程师标准>>> 创建一个DatagramSocket实例,并将该对象绑定到指定IP地址.指定端口. 通过上面三个构造器中的任意一个构造器即可创 ...
- JAVA socket编程 Datagram套接字 UDP协议(转)
查看文章 JAVA socket编程 Datagram套接字 UDP协议 2009-05-13 09:35 1 UDP套接字 数据报(Datagram)是网络层数据单元在介质上传输信息的一 ...
- socket:数据报套接字
数据报套接字 一.什么是数据报套接字 二.基于流套接字的客户/服务器的工作流程 1.服务器 2.客户端 三.套接字接口 1.recvfrom()系统调用 2.sendto()系统调用 四.示例 一.什 ...
- socket模块(套接字模块)
socket模块(套接字模块) 一.最简单版本(互传一次就结束) # 客户端 import socket client = socket.socket() client.connect(('127.0 ...
- 【Socket】linux套接字技术之tcp
1.mystery引入 1)UDP也可以编写出C/S程序 ,另外TCP也可以编写点对点通信. 2)网络的本质就是资源共享,当前流行的P2P应用正好暗合了这种精神. 3)当前流行的 ...
- socket网络编程——套接字地址结构
声明:此博客是本人根据老师课件总结的,如有抄袭行为,本人会即刻删除. 1.主机字节序列和网络字节序列 主机字节序列分为大端字节序和小端字节序,不同的主机采用的字节序列可能不同.大端字节序是指一个整数的 ...
- 学习笔记(05):Python网络编程并发编程-基于socket实现简单套接字通信
立即学习:https://edu.csdn.net/course/play/24458/296234?utm_source=blogtoedu 1.服务器端 #以打电话通讯为例子进行说明 #导入相应的 ...
- socket网络编程套接字TCP/UDP两种方式详解
目录 准备知识 源IP地址和目的IP地址 端口号与进程ID 传输层协议--TCP 传输层协议--UCP 网络字节序 socket套接字介绍 概念 常见的三种socket socket编程常见API s ...
- Python+socket实现TCP套接字服务端自由限速
好消息:"Python小屋"编程比赛正式开始 推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国,清华大学出版社, ...
最新文章
- JS组件系列——Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
- gedit乱码 fedora
- 硬核创客DIY遥控氦气球飞行器——会飞的鲨鱼的诞生的全过程
- 浅谈零样本网络表示学习
- 李宏毅《机器学习》完整版笔记发布
- 压测瓶颈在mysql_MySQL的性能基线收集及压力测试
- IT人士十大不良饮食习惯及改进建议
- 260.只出现一次的数字III
- Flask 下载中文名文件
- 利用C++语法进行特殊类设计
- JNA模拟复杂的C类型——Java映射char*、int*、float*、double*
- 计算机学业水平测试初中生操作题,高二计算机学业水平测试——excel操作题
- 是时候抛弃 Svelte、React 和 VUE 了吗?
- 新浪php工程师面试题
- ROS机器人021-机器人命令行发送cmd_vel话题及/cmd_vel geometry_msgs/Twist示例
- 公众号服务器配置如何不显示,公众号服务器配置信息怎么设置
- html鼠标悬停图片释义文字消失,鼠标悬停,在图片上显示文字~
- css——指定某个区域可垂直或水平滑动
- Maven - 2、安装、配置、mvn运行过程详解
- 美好音乐不只在现场,索尼播放器NW-WM1ZM2和NW-WM1AM2满足聆听热爱
热门文章
- SOCKS5实现(一)
- 离散数学(4)——集合的概念和集合之间的关系、集合的运算、基本的集合恒等式
- myeclipse 6.5 注册码 myeclipse 6.0 注册码
- 2023年软考高级系统分析师考试时间及安排
- 一个光子的能量是多少?
- Mastering Selections in Photoshop CC Photoshop CC选区教程 Lynda课程中文字幕
- LCA 用到LCA的各种题目
- c语言深度剖析(12)—注释符号
- Python基础 | Spyder的使用
- 非线性回归-转化为线性回归以及非线性模型-用R语言实现