python网络编程 - tcp
网络编程
低级别的网络服务
高级别的网络服务
socket又称“套接字”,应用程序通过“套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
tcp
tcp优劣势:


TCP三次握手

第一次握手

客户端先发一个“syn”的数据包给服务器。数据包中包括参数:序列号(SEQUENCE NUM),假设为J。上述为0.

第二次握手

第三次握手

客户端给服务端发一个“ack”的数据包。

HTTP请求过程
TCP四次挥手

TCP的十种状态

注

TTL
2MSL

TCP的最后一次挥手,怎么能保证服务器端一定会收到呢?
长连接和短链接
TCP通信的整个过程

1. TCP短连接
2. TCP长连接
3. TCP长/短连接操作过程
3.1 短连接的操作步骤是:

3.2 长连接的操作步骤是:

4. TCP长/短连接的优点和缺点
5. TCP长/短连接的应用场景
python代码实现
服务端
流程
代码
# coding:utf-8 import socket
import config
import logging
logging.basicConfig(level=logging.INFO, format="%(asctime)-15s %(levelname)s %(filename)s %(lineno)d %(message)s",) def main():
# 创建套接字
# family:套接字家族,AF_UNIX或者AF_INET(默认)
# type:套接字类型,面向连接的还是面向非连接的,SOCK_STREAM(默认)或者SOCK_DGRAM
# protocol:一般不填默认为0
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 重用ip和port,防止报错
sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 绑定ip和port
sk.bind((config.host, config.port)) # 使套接字变为被动连接,最多可接收给定参数的客户端的连接(默认套接字是主动去连接别人的)
sk.listen(5) nsk, addr = sk.accept()
logging.info("client connected! socket={}, addr={}".format(nsk, addr)) data = nsk.recv(1024)
if len(data) == 0:
# 客户端关闭了连接
nsk.close()
else:
nsk.send("thank you".encode("utf-8")) data2 = nsk.recv(1024)
print(data2) if __name__ == '__main__':
main()
客户端
代码实现的客户端
# coding:utf-8 import socket
import config def main():
# 创建socket
sk = socket.socket()
print("client connected! socket={}".format(sk)) # 连接服务器
sk.connect((config.host, config.port)) # 发送数据到服务器
sk.send(b"") data = sk.recv(1024)
if len(data) == 0:
# 服务器端主动断开连接
sk.close()
else:
print(data)
sk.close() if __name__ == '__main__':
main()
浏览器客户端
使用postman模拟浏览器请求(get/post/put/delete都可以),修改服务器代码如下:
def main():
# 创建套接字
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 重用ip和port,防止报错
sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 绑定ip和port
sk.bind((config.host, config.port)) # 使套接字变为被动连接,最多可接收给定参数的客户端的连接(默认套接字是主动去连接别人的)
sk.listen(5) nsk, addr = sk.accept()
logging.info("client connected! socket={}, addr={}".format(nsk, addr)) data = nsk.recv(1024)
if len(data) == 0:
# 客户端关闭了连接
nsk.close()
else:
nsk.send("thank you".encode("utf-8")) data2 = nsk.recv(1024)
print(data2)
调试发现,一次浏览器的请求,其实做了四个操作,分别是:
- 创建套接字:sk = socket.socket()
- 连接服务器:sk.connect((ip, port))
- 发送消息:socket.send(请求头)。请求头如:b'POST / HTTP/1.1\r\nUser-Agent: PostmanRuntime/7.17.1\r\nAccept: */*\r\nCache-Control: no-cache\r\nPostman-Token: 016ca998-9f45-4ba5-949b-07a51ea0f3e9\r\nHost: 127.0.0.1:5002\r\nAccept-Encoding: gzip, deflate\r\nContent-Length: 0\r\nConnection: keep-alive\r\n\r\n'
- 关闭连接:sk.close()。通过调试发现data2的数据为空字符串,说明客户端关闭了连接
python网络编程 - tcp的更多相关文章
- python 网络编程 TCP/IP socket UDP
TCP/IP简介 虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多. 计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Micro ...
- python 网络编程 -- Tcp协议
Socket是网络编程的一个抽象概念.通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可. 客户端 大多数连接都是可靠 ...
- python网络编程-TCP协议中的三次握手和四次挥手(图解)
建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...
- python 网络编程 tcp和udp 协议
1. 网络通信协议 osi七层,tcp\ip五层 tcp\ip五层 arp协议:通过IP地址找到mac地址 2.tcp和udp的区别 tcp协议:面向连接,消息可靠,相对udp来讲,传输速度慢,消息是 ...
- python网络编程--TCP连接的三次握手(三报文握手)与四次挥手
一.TCP连接 运输连接有三个阶段: 连接建立.数据传送和连接释放. 在TCP连接建立过程中要解决以下三个问题: 1,要使每一方能够确知对方的存在. 2.要允许双方协商一些参数(如最大窗口之,是否使用 ...
- [Python 网络编程] TCP Client (四)
TCP Client 客户端编程步骤: 创建socket对象 连接到服务端的ip和port,connect()方法 传输数据 使用send.recv方法发送.接收数据 关闭连接,释放资源 最简单的客户 ...
- [Python 网络编程] TCP编程/群聊服务端 (二)
群聊服务端 需求分析: 1. 群聊服务端需支持启动和停止(清理资源); 2. 可以接收客户端的连接; 接收客户端发来的数据 3. 可以将每条信息分发到所有客户端 1) 先搭架子: #TCP Serve ...
- [Python 网络编程] TCP、简单socket模拟ssh (一)
OSI七层模型(Open System Interconnection,开放式系统互联) 应用层 网络进程访问应用层: 为应用程序进程(例如:电子邮件.文件传输和终端仿真)提供网络服务: 提供用户身份 ...
- python网络编程--TCP客户端的开发
#导入socket模块 2 import socket 3 #参数说明 4 """ 5 socket类的介绍 6 创建客户端socket对象 7 socket.socke ...
随机推荐
- 第三篇 -- XML Schema
验证XML文档是否符合议定的XML结构有两种方法,分别是DTD模式与XML Schema.本文主要介绍XML Schema. 一.XML Schema的优点 XML Schema基于XML,没有专门的 ...
- 项目Beta冲刺--6/7
项目Beta冲刺--6/7 作业要求 这个作业属于哪个课程 软件工程1916-W(福州大学) 这个作业要求在哪里 项目Beta冲刺 团队名称 基于云的胜利冲锋队 项目名称 云评:高校学生成绩综合评估及 ...
- Spring Boot属性配置文件:application.properties 详解
学习资料 网址 官方说明文档 https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-pro ...
- mysql免安装版本测试(mysql-5.7.18-winx64)
最近在某大学代课要安装mysql,由于他们的电脑机器不能用installer安装(具体原因我也不清楚,一点击就显示要结束进程),在查阅了资料之后在我的小笔记本上做了一把实验,下面记录过程 参考博客为: ...
- 关于springboot项目的jar和war两种打包方式部署的区别
关于springboot项目的jar和war两种打包方式部署的区别 关于springboot项目的jar和war两种打包方式部署的区别? https://bbs.csdn.net/topics/392 ...
- 第八次 Java 作业 重写正方形周长方法
# 题目 编写一个应用程序,创建一个矩形类,类中具有长.宽两个成员变量和求周长的方法. 再创建一个矩形类的子类——正方形类,类中定义求面积方法.重写求周长的方法. 在主类中,输入一个正方形边长,创建正 ...
- PHP字符串比较函数详解
在PHP中,对于字符串之间的比较有很多种方法,第一种是使用 strcmp()函数和 strcasecmp()函数按照字节进行比较,第二种是使用 strnatcmp()函数按照自然排序法进行比较,第三种 ...
- canal简单安装使用
canal简介:https://github.com/alibaba/canal 1.数据库配置 首先使用canal需要修改数据库配置 [mysqld] log-bin=mysql-bin # 开启 ...
- javascript获取手机上媒体设备,摄像头和话筒
主要运用H5的媒体接口API,MDN文档: navigator.mediaDevices(新版API),Navigator.getUserMedia(旧版API,不建议使用,但某些浏览器还支持),本文 ...
- http 缓存机制简介
我们应该从两个角度来看http的缓存:缓存控制 和 缓存校验.缓存控制:控制缓存的开关,用于标识请求或访问中是否开启了缓存,使用了什么样的存方式.缓存校验:如何校验缓存,缓存的有效期,如何确定缓存是最 ...