一、Python-Socket编程

1.1、弄懂HTTP、Socket、TCP这几个概念

  什么是HTTP协议?浏览器的本质就是一个socket客户端遵循HTTP协议,HTTP协议的本质:通过\r\n分割的规范+请求响应之后断开连接。HTTP协议是建立在tcp之上的,HTTP是一种规范,它规定了发送数据的数据格式,这个数据格式是通过\r\n进行分割的,请求头与请求体也是通过2个\r\n分割的。响应的时候,响应头与响应体也是通过\r\n分割,并且规定了请求已响应就会断开连接,是一种短连接,无状态。

  什么是socketsocket是应用层与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实现通信

  1. import socket
  2.  
  3. server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#协议
  4. server.bind(('0.0.0.0', 8000)) #地址,端口
  5. server.listen(10) #监听socket客户端请求
  6. sock, addr = server.accept() #阻塞等待连接请求
  7. #获取从客户端发送的数据
  8. #一次获取1k的数据
  9. data = sock.recv(1024)
  10. print(data.decode("utf8"))
  11. re_data = input() #输入发送给客户端的消息
  12. sock.send(re_data.encode("utf8"))
  13. sock.close() #关闭连接
  14. server.close() #关闭服务器

socket_server

  1. import socket
  2. client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  3.  
  4. client.connect(('127.0.0.1', 8000)) #连接服务端
  5. client.send("lishuntao".encode("utf8"))
  6. data = client.recv(1024)
  7. print (data.decode("utf8"))
  8. client.close()

socket_client

1.3、socket实现聊天和多用户连接

socket_server:

  1. import socket
  2. import threading
  3.  
  4. backlog = 10
  5. server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  6. server.bind(('0.0.0.0', 8000))
  7. server.listen(backlog)
  8.  
  9. def handle_sock(sock, addr):
  10. while True:
  11. data = sock.recv(1024)
  12. if data.decode("utf8") == "Q" or data.decode("utf8") == "q":
  13. break
  14. print(data.decode("utf8"))
  15. re_data = input()
  16. sock.send(re_data.encode("utf8"))
  17. sock.close()
  18. server.close()
  19.  
  20. while True:
  21. sock, addr = server.accept()
  22.  
  23. #用线程去处理新接收的连接(用户)
  24. client_thread = threading.Thread(target=handle_sock, args=(sock, addr))
  25. client_thread.start()

socket_client:

  1. import socket
  2. client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  3. client.connect(('127.0.0.1', 8000))
  4. while True:
  5. re_data = input()
  6. if re_data.upper() == "Q":
  7. break
  8. client.send(re_data.encode("utf8"))
  9. data = client.recv(1024)
  10. print(data.decode("utf8"))
  11. client.close()

1.4、socket模拟http请求

  1. #requests(封装了urlib) -> urlib(封装了socket) -> socket(封装TCP/UDP协议)
  2. import socket
  3. from urllib.parse import urlparse
  4.  
  5. def get_url(url):
  6. #通过socket请求html
  7. url = urlparse(url)
  8. host = url.netloc
  9. path = url.path
  10. if path == "":
  11. path = "/"
  12.  
  13. #建立socket连接
  14. client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  15. # client.setblocking(False)
  16. client.connect((host, 80)) #阻塞不会消耗cpu
  17.  
  18. #不停的询问连接是否建立好, 需要while循环不停的去检查状态
  19. #做计算任务或者再次发起其他的连接请求
  20.  
  21. client.send("GET {} HTTP/1.1\r\nHost:{}\r\nConnection:close\r\n\r\n".format(path, host).encode("utf8"))
  22.  
  23. data = b""
  24. while True:
  25. d = client.recv(1024)
  26. if d:
  27. data += d
  28. else:
  29. break
  30.  
  31. data = data.decode("utf8")
  32. html_data = data.split("\r\n\r\n")[1]
  33. print(html_data)
  34. client.close()
  35.  
  36. if __name__ == "__main__":
  37. url = "https://www.baidu.com/"
  38. get_url(url)

09-Python-Socket编程的更多相关文章

  1. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  2. python/socket编程之粘包

    python/socket编程之粘包 粘包 只有TCP有粘包现象,UDP永远不会粘包. 首先需要掌握一个socket收发消息的原理 发送端可以是1k,1k的发送数据而接受端的应用程序可以2k,2k的提 ...

  3. PYTHON SOCKET编程简介

    原文地址: PYTHON SOCKET编程详细介绍   Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 Soc ...

  4. python socket编程笔记

    用python实现一个简单的socket网络聊天通讯 (Linux --py2.7平台与windows--py3.6平台) 人生苦短之我用Python篇(socket编程) python之路 sock ...

  5. [Python_7] Python Socket 编程

    0. 说明 Python Socket 编程 1. TCP 协议 [TCP Server] 通过 netstat -ano 查看端口是否开启 # -*-coding:utf-8-*- "&q ...

  6. Python Socket 编程示例 Echo Server

    简评:我们已经从「Python Socket 编程概览」了解了 socket API 的概述以及客户端和服务器的通信方式,接下来让我们创建第一个客户端和服务器,我们将从一个简单的实现开始,服务器将简单 ...

  7. Python Socket 编程——聊天室演示样例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和client的代码了解主要的 Python Socket 编程模型.本文再通过一个样例来加强一下对 Socket ...

  8. python socket编程入门(编写server实例)+send 与sendall的区别与使用方法

    python 编写server的步骤: 1. 第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参 ...

  9. 第九章:Python高级编程-Python socket编程

    第九章:Python高级编程-Python socket编程 Python3高级核心技术97讲 笔记 9.1 弄懂HTTP.Socket.TCP这几个概念 Socket为我们封装好了协议 9.2 cl ...

  10. python socket编程详细介绍

    Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...

随机推荐

  1. p4141(消失之物)

    题目描述 ftiasch 有 N 个物品, 体积分别是 W1, W2, …, WN. 由于她的疏忽, 第 i 个物品丢失了. “要使用剩下的 N – 1 物品装满容积为 x 的背包,有几种方法呢?” ...

  2. 大数据之路week01--自学之集合_2(Iterator迭代器)

    选代器:是遍历集合的一种方式.迭代器是依赖于集合而存在的.我有一个集合: Collection c = new ArrayList();我们给集合中添加元素: c. add("hello' ...

  3. Project Euler 58: Spiral primes

    从一开始按以下方式逆时针旋转,可以形成一个边长为七的正方形螺旋: 一个有趣的现象是右下对角线上都有一个奇完全平方数,但是更有趣的是两条对角线上的十三个数中有八个数是素数(已经标红),也就是说素数占比为 ...

  4. 二叉搜索树BST(C语言实现可用)

    1:概述 搜索树是一种可以进行插入,搜索,删除等操作的数据结构,可以用作字典或优先级队列.二叉搜索树是最简单的搜索树.其左子树的键值<=根节点的键值,右子树的键值>=根节点的键值. 如果共 ...

  5. Java基础 ArrayList源码分析 JDK1.8

    一.概述 本篇文章记录通过阅读JDK1.8 ArrayList源码,结合自身理解分析其实现原理. ArrayList容器类的使用频率十分频繁,它具有以下特性: 其本质是一个数组,因此它是有序集合 通过 ...

  6. Java多态——代码示例

    刚开始看多态的文字定义时,总是不明白说的啥意思,看了一些示例代码后,总算知道了,其实也就是“多态”的字面意思. 如下: class A{ public void Out() { System.out. ...

  7. nyoj 78-圈水池 (凸包)

    78-圈水池 内存限制:64MB 时间限制:3000ms 特判: No 通过数:5 提交数:6 难度:4 题目描述: 有一个牧场,牧场上有很多个供水装置,现在牧场的主人想要用篱笆把这些供水装置圈起来, ...

  8. 力扣(LeetCode)整数形式的整数加法 个人题解

    对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组.例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]. 给定非负整数 X 的数组形式 A,返回整数 X+K 的 ...

  9. 【故障公告】数据库服务器 CPU 近 100% 引发的故障(源于 .NET Core 3.0 的一个 bug)

    非常抱歉,这次故障给您带来麻烦了,请您谅解. 今天早上 10:54 左右,我们所使用的数据库服务(阿里云 RDS 实例 SQL Server 2016 标准版)CPU 突然飙升至 90% 以上,应用日 ...

  10. Springboot 系列(十六)你真的了解 Swagger 文档吗?

    前言 目前来说,在 Java 领域使用 Springboot 构建微服务是比较流行的,在构建微服务时,我们大多数会选择暴漏一个 REST API 以供调用.又或者公司采用前后端分离的开发模式,让前端和 ...