09-Python-Socket编程
一、Python-Socket编程
1.1、弄懂HTTP、Socket、TCP这几个概念
什么是HTTP协议?浏览器的本质就是一个socket客户端遵循HTTP协议,HTTP协议的本质:通过\r\n分割的规范+请求响应之后断开连接。HTTP协议是建立在tcp之上的,HTTP是一种规范,它规定了发送数据的数据格式,这个数据格式是通过\r\n进行分割的,请求头与请求体也是通过2个\r\n分割的。响应的时候,响应头与响应体也是通过\r\n分割,并且规定了请求已响应就会断开连接,是一种短连接,无状态。
什么是socket?socket是应用层与tcp/ip协议族通信的中间软件的抽象层,他是一组接口。在设计模式中,socket其实就是一个门面模式,他把复杂的TCP/IP协议族隐藏在socket接口后面,对用户来说一组接口就是全部。
什么是TCP?TCP三次握手,四次挥手的流程。三次握手:1客户端先向服务器发送SYN状态码,告诉服务器想要建立连接。2然后服务端向客户端回复ACK+SYN状态码告诉客户端可以连接。3然后客户端回复确认ACK状态码给服务器,建立连接。四次挥手:1客户端向服务器发送FIN+SEQ状态码,告诉服务器想要断开。2然后服务器向客户端回复ACK+SEQ状态码,服务器此时进入close-wait状态,等待连接通道数据传输完毕,传输完毕后。3然后服务器向客户端发送FIN+SEQ状态码,此时服务器进入最后确认状态。4最后客户端向服务器发送ACK+SEQ状态码,服务器接收到后立即进入close状态,连接断开。
socket套接字抽象层接口:
1.2、socket和server实现通信
- import socket
- server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#协议
- server.bind(('0.0.0.0', 8000)) #地址,端口
- server.listen(10) #监听socket客户端请求
- sock, addr = server.accept() #阻塞等待连接请求
- #获取从客户端发送的数据
- #一次获取1k的数据
- data = sock.recv(1024)
- print(data.decode("utf8"))
- re_data = input() #输入发送给客户端的消息
- sock.send(re_data.encode("utf8"))
- sock.close() #关闭连接
- server.close() #关闭服务器
socket_server
- import socket
- client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- client.connect(('127.0.0.1', 8000)) #连接服务端
- client.send("lishuntao".encode("utf8"))
- data = client.recv(1024)
- print (data.decode("utf8"))
- client.close()
socket_client
1.3、socket实现聊天和多用户连接
socket_server:
- import socket
- import threading
- backlog = 10
- server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- server.bind(('0.0.0.0', 8000))
- server.listen(backlog)
- def handle_sock(sock, addr):
- while True:
- data = sock.recv(1024)
- if data.decode("utf8") == "Q" or data.decode("utf8") == "q":
- break
- print(data.decode("utf8"))
- re_data = input()
- sock.send(re_data.encode("utf8"))
- sock.close()
- server.close()
- while True:
- sock, addr = server.accept()
- #用线程去处理新接收的连接(用户)
- client_thread = threading.Thread(target=handle_sock, args=(sock, addr))
- client_thread.start()
socket_client:
- import socket
- client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- client.connect(('127.0.0.1', 8000))
- while True:
- re_data = input()
- if re_data.upper() == "Q":
- break
- client.send(re_data.encode("utf8"))
- data = client.recv(1024)
- print(data.decode("utf8"))
- client.close()
1.4、socket模拟http请求
- #requests(封装了urlib) -> urlib(封装了socket) -> socket(封装TCP/UDP协议)
- import socket
- from urllib.parse import urlparse
- def get_url(url):
- #通过socket请求html
- url = urlparse(url)
- host = url.netloc
- path = url.path
- if path == "":
- path = "/"
- #建立socket连接
- client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- # client.setblocking(False)
- client.connect((host, 80)) #阻塞不会消耗cpu
- #不停的询问连接是否建立好, 需要while循环不停的去检查状态
- #做计算任务或者再次发起其他的连接请求
- client.send("GET {} HTTP/1.1\r\nHost:{}\r\nConnection:close\r\n\r\n".format(path, host).encode("utf8"))
- data = b""
- while True:
- d = client.recv(1024)
- if d:
- data += d
- else:
- break
- data = data.decode("utf8")
- html_data = data.split("\r\n\r\n")[1]
- print(html_data)
- client.close()
- if __name__ == "__main__":
- url = "https://www.baidu.com/"
- get_url(url)
09-Python-Socket编程的更多相关文章
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- python/socket编程之粘包
python/socket编程之粘包 粘包 只有TCP有粘包现象,UDP永远不会粘包. 首先需要掌握一个socket收发消息的原理 发送端可以是1k,1k的发送数据而接受端的应用程序可以2k,2k的提 ...
- PYTHON SOCKET编程简介
原文地址: PYTHON SOCKET编程详细介绍 Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 Soc ...
- python socket编程笔记
用python实现一个简单的socket网络聊天通讯 (Linux --py2.7平台与windows--py3.6平台) 人生苦短之我用Python篇(socket编程) python之路 sock ...
- [Python_7] Python Socket 编程
0. 说明 Python Socket 编程 1. TCP 协议 [TCP Server] 通过 netstat -ano 查看端口是否开启 # -*-coding:utf-8-*- "&q ...
- Python Socket 编程示例 Echo Server
简评:我们已经从「Python Socket 编程概览」了解了 socket API 的概述以及客户端和服务器的通信方式,接下来让我们创建第一个客户端和服务器,我们将从一个简单的实现开始,服务器将简单 ...
- Python Socket 编程——聊天室演示样例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和client的代码了解主要的 Python Socket 编程模型.本文再通过一个样例来加强一下对 Socket ...
- python socket编程入门(编写server实例)+send 与sendall的区别与使用方法
python 编写server的步骤: 1. 第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参 ...
- 第九章:Python高级编程-Python socket编程
第九章:Python高级编程-Python socket编程 Python3高级核心技术97讲 笔记 9.1 弄懂HTTP.Socket.TCP这几个概念 Socket为我们封装好了协议 9.2 cl ...
- python socket编程详细介绍
Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...
随机推荐
- p4141(消失之物)
题目描述 ftiasch 有 N 个物品, 体积分别是 W1, W2, …, WN. 由于她的疏忽, 第 i 个物品丢失了. “要使用剩下的 N – 1 物品装满容积为 x 的背包,有几种方法呢?” ...
- 大数据之路week01--自学之集合_2(Iterator迭代器)
选代器:是遍历集合的一种方式.迭代器是依赖于集合而存在的.我有一个集合: Collection c = new ArrayList();我们给集合中添加元素: c. add("hello' ...
- Project Euler 58: Spiral primes
从一开始按以下方式逆时针旋转,可以形成一个边长为七的正方形螺旋: 一个有趣的现象是右下对角线上都有一个奇完全平方数,但是更有趣的是两条对角线上的十三个数中有八个数是素数(已经标红),也就是说素数占比为 ...
- 二叉搜索树BST(C语言实现可用)
1:概述 搜索树是一种可以进行插入,搜索,删除等操作的数据结构,可以用作字典或优先级队列.二叉搜索树是最简单的搜索树.其左子树的键值<=根节点的键值,右子树的键值>=根节点的键值. 如果共 ...
- Java基础 ArrayList源码分析 JDK1.8
一.概述 本篇文章记录通过阅读JDK1.8 ArrayList源码,结合自身理解分析其实现原理. ArrayList容器类的使用频率十分频繁,它具有以下特性: 其本质是一个数组,因此它是有序集合 通过 ...
- Java多态——代码示例
刚开始看多态的文字定义时,总是不明白说的啥意思,看了一些示例代码后,总算知道了,其实也就是“多态”的字面意思. 如下: class A{ public void Out() { System.out. ...
- nyoj 78-圈水池 (凸包)
78-圈水池 内存限制:64MB 时间限制:3000ms 特判: No 通过数:5 提交数:6 难度:4 题目描述: 有一个牧场,牧场上有很多个供水装置,现在牧场的主人想要用篱笆把这些供水装置圈起来, ...
- 力扣(LeetCode)整数形式的整数加法 个人题解
对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组.例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]. 给定非负整数 X 的数组形式 A,返回整数 X+K 的 ...
- 【故障公告】数据库服务器 CPU 近 100% 引发的故障(源于 .NET Core 3.0 的一个 bug)
非常抱歉,这次故障给您带来麻烦了,请您谅解. 今天早上 10:54 左右,我们所使用的数据库服务(阿里云 RDS 实例 SQL Server 2016 标准版)CPU 突然飙升至 90% 以上,应用日 ...
- Springboot 系列(十六)你真的了解 Swagger 文档吗?
前言 目前来说,在 Java 领域使用 Springboot 构建微服务是比较流行的,在构建微服务时,我们大多数会选择暴漏一个 REST API 以供调用.又或者公司采用前后端分离的开发模式,让前端和 ...