一、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实现通信

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编程的更多相关文章

  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. git 合并代码

    分支 dev 及衍生分支 dev-ctj 一.rebase 1.git checkout dev-ctj 2.git rebase -i head~num[num 是本分支的提交数,多个提交数先合并为 ...

  2. SSM整合相关试题

    1.下列关于Spring自动装配的说法中,错误的是() A 在Spring配置文件中,可以通过<bean>元素的autowire属性指定自动装配方式 B autowire属性值可以设置为n ...

  3. Python 基础之socket编程(一)

    Python 基础之socket编程(一) 可以进行通信玩儿了,感觉不错不错,网络通信就像打电话,我说一句你听一句之后,你再说一句,我听一句,就这样.....下去了.不扯淡了,来来来,看看今天都搞了点 ...

  4. @Transactional 的回滚

    默认情况下,Exception是不会引起回滚操作的,RuntimeException才会引起回滚操作. 当然如果所有的Exception都要回滚的话,直接@Transactional(rollback ...

  5. 解析XML数据,必看

    xml源文件 <?xml version="1.0" encoding="UTF-8"?> <humans> <zhangying ...

  6. C++中对C的扩展学习新增语法——动态内存管理

    1.C语言动态内存管理的缺点: 1.malloc对象的大小需要自己计算. 2.需要手动转换指针类型. 3.C++的对象不适合使用malloc和free. 2.C++中new/delete基本使用: 3 ...

  7. 力扣(LeetCode)第一个错误的版本 个人题解

    你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的. 假设你有 n 个版本 [1, ...

  8. php设置随机ip访问

    当我们请求一个站点的时候,http报文头会携带一些ip信息,我们通过伪造这些信息,就可以形成不同ip访问请求的效果. header的头部CLIENT-IP和X-FORWARDED-FOR我们都设置为想 ...

  9. 【Luogu P1090】合并果子

    Luogu P1090 [解题思路] 刚看到这题的时候,第一反应就是每次取两个最小,然后重新排序,再取最小.但是这样会TLE. 既然找最小的,那就可以利用单调队列了.显然输入的数据是不具有单调性的,但 ...

  10. Java基础常见笔试题总结

    1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件 2.“sta ...