Python高级网络编程系列之基础篇
一、Socket简介
1、不同电脑上的进程如何通信?
进程间通信的首要问题是如何找到目标进程,也就是操作系统是如何唯一标识一个进程的!
在一台电脑上是只通过进程号PID,但在网络中是行不通的,因为每台电脑的IP可能都是不一样的,因此TCP/IP协议族通过使用IP地址+端口号的方式来标识任意一台主机的应用进程。
因此,利用IP地址 + 协议 + 端口号就可以用来标识网络进程了,网络中可以利用这个标识来与其他进程通信。
2.什么是socket
Socket简称为套接字,是进程间通信的一种方式,它与其他进程间通信的一个不同之处在于:它能实现不同主机间的进程间通信,网络上各种各样的服务大多是基于Socket来完成的。
二、TCP简介
1.介绍:TCP协议,传输控制协议(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
2.通信流程:建立连接、数据传输、终止连接,就类似我们生活中的“打电话”。
三、TCP特点:
1.面向连接:通信前必须先建立连接才能进行数据传输,双方都必须为该连接分配必要的系统内核资源。
2.可靠传输:主要体现在:
1). TCP采用发送应答机制:TCP发送的每个报文都必须得到接收方的应答才能成功传输该报文。
2). 超时重传:如果发出的报文在一段时间内没有收到应答那么就重新发送这个报文段。此外,TCP是为每个包都分配一个序号,用来保证不会发送方丢包和用于在接收端重组。
3). 错误检验:TCP用一个校验和函数来校验数据是否有误,
4). 流量控制和阻塞管理:用来避免主机发送得过快而使接收方来不及全部收下。
四、UDP协议
UDP是一中无需建立连接就能通信的协议,只需要发送数据即可。因此一般适用于广播的应用程序。
五、TCP与UDP的不同点
- 面向连接(确认有创建三方交握,连接已创建才作传输。)
- 有序数据传输
- 重发丢失的数据包
- 舍弃重复的数据包
- 无差错的数据传输
- 阻塞/流量控制
六、TCP/IP协议族
互联网协议包含了上百种协议标准,但是最重要的两个协议是TCP和IP协议,因此一般把互联网的协议简称为TCP/IP协议族。
七、TCP/IP协议传输示意图
以QQ间发送消息为例!

八、TCP通信模型
主要是使用TCP协议来进行通信!

注意点:
- tcp服务器一般情况下都需要绑定端口,否则客户端找不到这个服务器
- tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip、port等信息就好,本地客户端可以随机
- tcp服务器中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务器时必须要做的
- 当客户端需要链接服务器时,就需要使用connect进行链接,udp是不需要链接的而是直接发送,但是tcp必须先链接,只有链接成功才能通信
- 当一个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务
- listen后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的
- 关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。
- 关闭accept返回的套接字意味着这个客户端已经服务完毕
- 当客户端的套接字调用close后,服务器端会recv解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线
代码实现如:
import socket def main():
pass
# 1.创建TCP套接字
tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置地址可重用
tcp_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 2.把套接字绑定到主机上
tcp_sock.bind(('', 6060))
# 3.被动套接字
tcp_sock.listen(128)
print('{}正在监听中'.format(tcp_sock.getsockname()))
# 4.与客户端进行连接
while True:
client, addr = tcp_sock.accept() # Ctrl+Shift +i
print('已经连接到了客户端:{}'.format(addr))
# 接收来自客户端的消息
data = client.recv(1024)
print(data.decode('utf-8'))
# 消息一经发送完毕就断开了连接
client.close() # 短连接 tcp_sock.close() if __name__ == '__main__':
main()
Python高级网络编程系列之基础篇的更多相关文章
- Python高级网络编程系列之第一篇
在上一篇中我们简单的说了一下Python中网络编程的基础知识(相关API就不解释了),其中还有什么细节的知识点没有进行说明,如什么是TCP/IP协议有几种状态,什么是TCP三次握手,什么是TCP四次握 ...
- Python高级网络编程系列之第二篇
在上一篇中,我们深入探讨了TCP/IP协议的11种状态,理解这些状态对我们编写服务器的时候有很大的帮助,但一般写服务器都是使用C/Java语言,因为这些语言对高并发的支持特别好.我们写的这些简单的服务 ...
- Python高级网络编程系列之终极篇---自己实现一个Web框架
通过前面几个小节的学习,现在我们想要把之前学到的知识点给串联起来,实现一个很小型的Web框架.虽然很小,但是用到的知识点都是比较多的.如Socket编程,装饰器传参在实际项目中如何使用.通过这一节的学 ...
- Python高级网络编程系列之第三篇
在高级篇二中,我们讲解了5中常用的IO模型,理解这些常用的IO模型,对于编写服务器程序有很大的帮助,可以提高我们的并发速度!因为在网络中通信主要的部分就是IO操作.在这一篇当中我们会重点讲解在第二篇当 ...
- 猫哥网络编程系列:HTTP PEM 万能调试法
注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...
- 猫哥网络编程系列:详解 BAT 面试题
从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...
- python之网络编程
本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 共享内存(匿名的和具名的) 远程过程调用 ...
- 网游中的网络编程系列1:UDP vs. TCP
原文:UDP vs. TCP,作者是Glenn Fiedler,专注于游戏网络编程相关工作多年. 目录 网游中的网络编程系列1:UDP vs. TCP 网游中的网络编程2:发送和接收数据包 网游中的网 ...
- Android网络编程系列 一 TCP/IP协议族
在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必 ...
随机推荐
- 排查CentOS7.0的联网情况
1.ifconfig命令. 查看网络配置是否有问题 在/etc/sysconfig/network-scripts/ifcfg-ens33里面配置好网络,记住onboot=on这个选项一定要设置,不然 ...
- springboot使用问题总结
技术说明:eclipse+springboot+mysql+mybatis 问题一:应用访问报错:Access denied for user 'root'@'localhost' (using pa ...
- C#中Main函数为什么要static
假设没有static关键字,那意味着需要用生成一个实例后才可以调用这个Main方法,而Main方法是程序入口点,你没有进入Main方法,自然无法生成一个实例,既然没有实例,那就无法调用Main函数,岂 ...
- input不可编辑且颜色不变
<input name="ly_qq" type="text" tabindex="2" onMouseOver="this ...
- JS--我发现,原来你是这样的JS(一)(初识,历史)
一.前言: 前段时间看红宝书(JavaScript高级程序设计),但没有计划的去看,也没有做详细的笔记,读了之后有点空虚,感觉不对劲啊,学的东西很难记住,印象不深啊,有种挫败感. 作前端的js都学不好 ...
- Nginx的常用功能
1.规范nginx的配置文件 在企业中我们的虚拟主机可能会很多,配置文件的内容也会有很多,这时候我们就可以规范一下我们的配置文件,把每个虚拟主机按照网站的域名或者是功能取名,放到统一的文件夹中,当然我 ...
- 语义SLAM的数据关联和语义定位(二)Semantic Localization Via the Matrix Permanent
论文假设和单目标模型 这部分想讲一下Semantic Localization Via the Matrix Permanent这篇文章的一些假设. 待求解的问题可以描述为 假设从姿态\(x\)看到的 ...
- 排错-SP2-1503:无法初始化Oracle调用界面解决
SP2-1503:无法初始化Oracle调用界面解决 by:授客 QQ:1033553122 SP2-1503:无法初始化Oracle调用界面解决 问题描述: win7下,cmd运行输入sqlplus ...
- Http 缓存机制
HTTP 缓存体系 首先我将 Http 缓存体系分为以下三个部分: HTTP/ OK Cache-Control: no-cache Content-Type: image/png Last-Modi ...
- IIS下众多网站,如何快速定位某站点日志在哪个文件夹?
windows2008,iis 多站点, 日志.应用程序池都是默认设置, 没有分开………… Logs目录里面有W3SVC43,W3SVC44,W3SVC45,W3SVC46.....等等日志文件夹. ...