网络编程就是编写程序使两台联网的计算机相互交换数据。

那么,这两台计算机之间用什么传输数据呢?首先你肯定先需要物理连接嘛。

在此基础上,只需要考虑如何编写数据传输程序。看似很麻烦,但实际上这点不用愁,因为操作系统已经提供了 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是什么?套接字是什么?相关推荐

  1. python套接字编程_Python套接字编程(1)——socket模块与套接字编程

    在Python网络编程系列,我们主要学习以下内容: 5. 常见的Python异步编程框架 6. 协程在Python网络编程中的使用 本文介绍Python下的基本套接字编程,主要基于 socket 模块 ...

  2. 使用DatagramSocket发送、接收数据(Socket之UDP套接字)

    2019独角兽企业重金招聘Python工程师标准>>> 创建一个DatagramSocket实例,并将该对象绑定到指定IP地址.指定端口. 通过上面三个构造器中的任意一个构造器即可创 ...

  3. JAVA socket编程 Datagram套接字 UDP协议(转)

      查看文章     JAVA socket编程 Datagram套接字 UDP协议 2009-05-13 09:35 1 UDP套接字 数据报(Datagram)是网络层数据单元在介质上传输信息的一 ...

  4. socket:数据报套接字

    数据报套接字 一.什么是数据报套接字 二.基于流套接字的客户/服务器的工作流程 1.服务器 2.客户端 三.套接字接口 1.recvfrom()系统调用 2.sendto()系统调用 四.示例 一.什 ...

  5. socket模块(套接字模块)

    socket模块(套接字模块) 一.最简单版本(互传一次就结束) # 客户端 import socket client = socket.socket() client.connect(('127.0 ...

  6. 【Socket】linux套接字技术之tcp

    1.mystery引入      1)UDP也可以编写出C/S程序 ,另外TCP也可以编写点对点通信.    2)网络的本质就是资源共享,当前流行的P2P应用正好暗合了这种精神.    3)当前流行的 ...

  7. socket网络编程——套接字地址结构

    声明:此博客是本人根据老师课件总结的,如有抄袭行为,本人会即刻删除. 1.主机字节序列和网络字节序列 主机字节序列分为大端字节序和小端字节序,不同的主机采用的字节序列可能不同.大端字节序是指一个整数的 ...

  8. 学习笔记(05):Python网络编程并发编程-基于socket实现简单套接字通信

    立即学习:https://edu.csdn.net/course/play/24458/296234?utm_source=blogtoedu 1.服务器端 #以打电话通讯为例子进行说明 #导入相应的 ...

  9. socket网络编程套接字TCP/UDP两种方式详解

    目录 准备知识 源IP地址和目的IP地址 端口号与进程ID 传输层协议--TCP 传输层协议--UCP 网络字节序 socket套接字介绍 概念 常见的三种socket socket编程常见API s ...

  10. Python+socket实现TCP套接字服务端自由限速

    好消息:"Python小屋"编程比赛正式开始 推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国,清华大学出版社, ...

最新文章

  1. JS组件系列——Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
  2. gedit乱码 fedora
  3. 硬核创客DIY遥控氦气球飞行器——会飞的鲨鱼的诞生的全过程
  4. 浅谈零样本网络表示学习
  5. 李宏毅《机器学习》完整版笔记发布
  6. 压测瓶颈在mysql_MySQL的性能基线收集及压力测试
  7. IT人士十大不良饮食习惯及改进建议
  8. 260.只出现一次的数字III
  9. Flask 下载中文名文件
  10. 利用C++语法进行特殊类设计
  11. JNA模拟复杂的C类型——Java映射char*、int*、float*、double*
  12. 计算机学业水平测试初中生操作题,高二计算机学业水平测试——excel操作题
  13. 是时候抛弃 Svelte、React 和 VUE 了吗?
  14. 新浪php工程师面试题
  15. ROS机器人021-机器人命令行发送cmd_vel话题及/cmd_vel geometry_msgs/Twist示例
  16. 公众号服务器配置如何不显示,公众号服务器配置信息怎么设置
  17. html鼠标悬停图片释义文字消失,鼠标悬停,在图片上显示文字~
  18. css——指定某个区域可垂直或水平滑动
  19. Maven - 2、安装、配置、mvn运行过程详解
  20. 美好音乐不只在现场,索尼播放器NW-WM1ZM2和NW-WM1AM2满足聆听热爱

热门文章

  1. SOCKS5实现(一)
  2. 离散数学(4)——集合的概念和集合之间的关系、集合的运算、基本的集合恒等式
  3. myeclipse 6.5 注册码 myeclipse 6.0 注册码
  4. 2023年软考高级系统分析师考试时间及安排
  5. 一个光子的能量是多少?
  6. Mastering Selections in Photoshop CC Photoshop CC选区教程 Lynda课程中文字幕
  7. LCA 用到LCA的各种题目
  8. c语言深度剖析(12)—注释符号
  9. Python基础 | Spyder的使用
  10. 非线性回归-转化为线性回归以及非线性模型-用R语言实现