Python高级知识点学习(七)

简介: HTTP、Socket、TCP概念socket属于常用的http协议之下的让我们可以使用tcp/ip协议的一个接口。socket编程image.pngsocket编程的模式其实是非常固定的。

HTTP、Socket、TCP概念

socket属于常用的http协议之下的让我们可以使用tcp/ip协议的一个接口。

socket编程

img_cc79a915d0758fb5ba7f142170de1167.png
image.png

socket编程的模式其实是非常固定的。

上图:

  • 左侧server端
  • 右侧client端

server必须是随时处于一个监听的状态和服务的状态,因为不知道客户端什么时候会发送来请求。

绑定协议、地址、端口。

每一个应用程序只能占用一个端口,服务器a到服务器b发数据时,数据是不知道是由哪个应用程序接受的,这时候就需要端口机制,每一个应用程序提供一个端口。

socket连接后,只要不关闭连接,服务端可以一直给客户端发送请求,但是在http中,只完成一次发送数据就停止了。
编写测试代码:
新建文件sever.py

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定ip 端口
server.bind(('0.0.0.0', 8000))
# 监听
server.listen()
sock, addr = server.accept()

# 接受client端发来的数据
data = sock.recv(1024)
# 打印数据
print(data.decode('utf8'))
# 给client发数据
sock.send("hello".encode("utf8"))
# 关闭
server.close()
sock.close()

新建文件client.py

import socket

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

client.connect(('127.0.0.1', 8000))
# 给server端发数据
client.send("allen".encode("utf-8"))
# 接受server端发来的数据
data = client.recv(1024)
# 打印数据
print(data.decode('utf8'))
# 关闭
client.close()

首先运行server.py,再运行client.py,观察打印结果,可以看到,数据发送接收已经是实现。

socket实现简单聊天

要实现双向交流,肯定不能做close操作,改为一直while循环,
代码:
修改srever.py

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("0.0.0.0", 8000))
server.listen()
sock, addr = server.accept()

while True:
    # 接受client端发来的数据

    data = sock.recv(1024)
    # 打印数据
    print(data.decode('utf8'))

    re_data = input()
    # 给client发数据
    sock.send(re_data.encode("utf8"))

修改client.py:

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"))
    # 接受client端发来的数据
    data = client.recv(1024)
    # 打印数据
    print(data.decode('utf8'))

运行server.py ,再运行client.py,在client.py中输入要发送的文字,在server.py中观察接收到的文字,再在server.py中发送文字,在client.py中查看。

以上就是实现了最初级的基本聊天过程。
如果要在网页上做一个聊天模块,一般都是需要用web socket来实现。

socket多用户聊天

所谓多用户聊天,其实平时我们也经常遇到。
假如你是一位线上客服人员,你需要接待的人员可能同时有多位,当你和A用户聊天时,并不妨碍和B用户C用户给你发消息,而你回消息,回给A用户的消息只有A用户可以看到,B用户是看不到的,接着看如何实现这种功能。
首先client.py的代码不用改动,只需修改server.py:

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"))

while True:
    sock, addr = server.accept()
    #用线程去处理新接收的连接(用户)
    client_thread = threading.Thread(target=handle_sock, args=(sock, addr))
    client_thread.start()

上边代码把接受处理逻辑放到了线程中,每一个线程存放一个不同的socket,主线程来查看有哪些线程进入。
运行server.py,再运行多个client.py,client.py给server发消息,测试可发现可实现上边的客服功能。

注:真正客服系统要比这个复杂得多,以上代码仅供测试。

socket模拟http请求

我们平常所用到的requests包,是基于 urllib,urllib实际上是基于socket上来完成的。
requests - urlib - socket
如何通过socket去完成类似urllib中http请求呢?

http请求无非就是在tcp协议之上加了一些协议,只要按照这个协议发,就会返回数据。
看代码:

import socket
from urllib.parse import urlparse

def request_demo(url):
    # url拆分
    url = urlparse(url)
    host = url.netloc
    path = url.path
    if path == "":
        path = "/"

    # 建立socket连接
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect((host, 80)) 
    client.send("GET {} HTTP/1.1\r\nHost:{}\r\nConnection:close\r\n\r\n".format(path, host).encode("utf8"))

    data = b""
    # 每次读取1024大小,循环知道读取完毕
    while True:
        d = client.recv(1024)
        if d:
            data += d
        else:
            break

    data = data.decode("utf8")
    print(data)
    client.close()


if __name__ == "__main__":
    url = 'http://www.baidu.com'
    request_demo(url)

运行结果包含两部分:
第一部分request header
第二部分html源码

建立连接的过程是比较费时的,一般在使用socket编程都是为了解决长连接的问题,而不是说每发送一个请求数据返回就把它关掉。

很多时候我们需要一个交互的过程,这时候socket就派上用场了,有了socket后我们的代码灵活性高,它完全可以让我们将整个过程变得可以操控。

目录
相关文章
|
25天前
|
Python
python知识点
【8月更文挑战第27天】python知识点
32 1
WK
|
1月前
|
存储 机器学习/深度学习 JSON
Python入门知识点
Python入门覆盖历史、设计理念、变量、数据类型、控制结构等。了解Python的发展,掌握动态类型的灵活性,熟悉整数、浮点数、字符串等数据类型。学会if/else、for/while循环构建逻辑流程,使用def定义函数,lambda快速创建匿名函数。通过类实现面向对象编程,利用模块和包组织代码。掌握try-except处理异常,open()进行文件操作。利用标准库和第三方库增强功能,理解集合、字典、列表推导式的应用,深入魔法方法、递归、装饰器等高级特性,以及上下文管理器和字符串、列表、元组的操作技巧。
WK
25 0
|
9天前
|
监控 Python Windows
python知识点100篇系列-pysnooper用于调试
PySnooper是一个便捷的Python调试工具,用于监控代码执行过程及局部变量的变化,替代繁琐的打印语句。作为GitHub上的热门开源项目,它通过装饰器自动记录代码执行细节。安装简便,支持多种平台,可通过pip安装。使用时,只需在目标函数上添加装饰器即可实时查看变量变化或将其记录至日志文件。此外,还支持使用with块对特定代码段进行调试。更多详细信息可参阅其官方使用文档。
python知识点100篇系列-pysnooper用于调试
|
1月前
|
存储 Python
Python时间模块四大必备知识点
Python时间模块四大必备知识点
40 4
Python时间模块四大必备知识点
|
28天前
|
Unix 开发者 iOS开发
开发知识点-Python-virtualenv
`virtualenv`通过其简易性、灵活性与高度的可配置性,成为Python开发中推荐的环境隔离工具之一。随着Python生态的发展,类似的工具如 `venv`(Python 3.3+自带的轻量级环境构建工具)和 `pipenv`(提供更复杂的依赖管理功能)也越来越受欢迎,但 `virtualenv`仍保持着重要的地位,尤其是在需要维护旧项目或者系统没有提供最新工具的情况下。
31 1
|
29天前
|
程序员 测试技术 开发工具
豆瓣评分7.9!世界级讲师耗时5年整理出的Python学习手册!
Python是一门流行的开源编程语言,广泛用于各个领域的独立程序与脚本化应用中。它不仅免费、可移植、功能强大,同时相对简单,而且使用起来充满乐趣。从软件业界的任意一角到来的程序员,都会发现Python着眼于开发者的生产效率以及软件质量,因此无论你的项目是大还是小,选择Python都将带来战略性的优势。 今天给小伙伴们分享的这份手册讲述了完整的Python语言,力争满足“语言”和“原理”两个方面的需求,并拥有足够的深度以便实用。废话不多说,下面展示给大家。
|
29天前
|
数据采集 数据可视化 Ruby
GitHub星标破万!Python学习教程(超详细),真的太强了!
Python 是一门初学者友好的编程语言,想要完全掌握它,你不必花上太多的时间和精力。 Python 的设计哲学之一就是简单易学,体现在两个方面: 1. 语法简洁明了:相对 Ruby 和 Perl,它的语法特性不多不少,大多数都很简单直接,不玩儿玄学。 2. 切入点很多:Python 可以让你可以做很多事情,科学计算和数据分析、爬虫、Web 网站、游戏、命令行实用工具等等等等,总有一个是你感兴趣并且愿意投入时间的。
|
1月前
|
机器学习/深度学习 开发者 Python
Python 与 R 在机器学习入门中的学习曲线差异
【8月更文第6天】在机器学习领域,Python 和 R 是两种非常流行的编程语言。Python 以其简洁的语法和广泛的社区支持著称,而 R 则以其强大的统计功能和数据分析能力受到青睐。本文将探讨这两种语言在机器学习入门阶段的学习曲线差异,并通过构建一个简单的线性回归模型来比较它们的体验。
47 7
|
1月前
|
JSON API 开发者
Python学习Get方式通过商品 ID请求 获取拼多多商品详情数据接口
拼多多商品详情数据接口服务使开发者或商家能编程获取平台商品详情,涵盖标题、价格、销量等关键信息,助力市场分析与决策。使用前需注册开发者账号并获取API密钥;构造含商品ID等参数的请求URL后发送至API服务器;接口以JSON格式返回数据。应用场景包括商品销售分析、选品、品牌口碑挖掘及竞品分析,为商家提供强大数据支持。
|
1月前
|
算法 数据挖掘 大数据
深入学习Python的性能优化
【8月更文挑战第9天】深入学习Python性能优化涵盖设定明确目标、运用timeit与cProfile等工具诊断瓶颈、优化代码结构与算法、采用并行/并发技术、利用生成器与第三方库等策略。这是一个持续学习的过程,旨在全面提升代码效率与响应速度。
26 1