前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python的socket编程

python的socket编程

作者头像
make a bug
发布2022-09-20 14:57:29
3400
发布2022-09-20 14:57:29
举报
文章被收录于专栏:我和bug只能活一个

套接字

说起套接字,我们得先知道什么是TCP,TCP协议对于web开发人员来讲那是最熟悉不过的,它是OSI七层网络模型中的传输层,是一种可靠的点对点传输。具体为什么这么可靠,我准备下一篇文章单独讲讲,因为发现是面试必问,并且有些面试官会问的很细很细。

如果把TCP比喻成一条马路的话,那么套接字就是在马路上的车辆。实现货物得点对点传输。

规范点说:所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。

python模拟一个socket连接

socket编程流程图如下

web框架中实现的socket一般不负责通信,socket一般是用运行服务器的容器去运行的。python中一般用uwsgi实现socket协议,用于和nginx通信。所以说这里来得web框架一般不用socket通信,而只是我们为了模拟socket连接过程而去这么写。

>>>延申:uwsgi是什么,和wsgi有什么关系,不多说,直接上图,如下图:

代码如下:

server端:

import socket

import threading

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

server.bind(('0.0.0.0', 8000))

server.listen()

def handle_sock(sock, addr):

while True:

data = sock.recv(1024)

print(data.decode("utf8"))

re_data = input()

sock.send(re_data.encode("utf8"))

#获取从客户端发送的数据

#一次获取1k的数据

while True:

sock, addr = server.accept()

#用线程去处理新接收的连接(用户)

client_thread = threading.Thread(target=handle_sock, args=(sock, addr))

client_thread.start()

客户端:

import socket

client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

client.connect(('127.0.0.1', 8000))

while True:

re_data = input()

client.send(re_data.encode("utf8"))

data = client.recv(1024)

print(data.decode("utf8"))

socket模拟http请求

请求层级:#requests -> urlib -> socket

http对于大家来说想必很容易理解,这里直接上代码。

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__": import time start_time = time.time() for url in range(20): url = "http://shop.projectsedu.com/goods/{}/".format(url) get_url(url) print(time.time()-start_time)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI懒人星球 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档