python学习-13【网络编程】

news/2024/9/30 2:18:56/

1、Socket 网络模块

Socket 模块

在 Python 中,使用 socket 模块的 socket() 函数来创建一个 socket 对象:
socket.socket(family, type, proto)

  • family:套接字家族,该参数指定调用者期待返回的套接字接口地址结构的类型
    • AF_UNIX:同一台机器上的进程通信
    • AF_INET:使用 IPv4 通信,不会返回 IPv6 的信息
    • AF_INET6:使用 IPv6 通信,不返回 IPv4 的信息
    • AF_UNSPEC:函数返回的是适用于指定主机名和服务名,并且适合任何协议族的地址
  • type:套接字类型。根据是面向连接还是非连接分为 SOCK_STREAM(对应 TCP 协议)和 SOCK_DGRAM(对应 UDP 协议)
  • proto:默认为 0
python">import socket
socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建 TCP Socket
socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建 TCP Socket
Socket 方法
  • 服务器端套接字方法

    方法说明
    s.bind()以 (hostname, port) 的形式绑定地址到套接字,在 AF_INET 下,以元组的形式表示地址
    s.listen()进行 TCP 监听。backlog 指定在拒绝连接之前,操作系统可以挂起的最大连接数量(≥1)
    s.accept()被动接受 TCP 客户端连接,以阻塞式等待连接的到来
  • 客户端套接字方法

    方法说明
    s.connect()主动初始化 TCP 服务器连接。一般 address 的格式为元组形式。如果连接出错,返回 socket.error 错误
    s.connect_ex()是 connect() 的扩展版本,出错时返回出错码,不会抛出异常
  • 公共用途的套接字方法

    方法说明
    s.recv()用于接收 TCP 数据,数据以 字符串 形式返回
    s.send()发送 TCP 数据。返回值是要发送的字节数量
    s.sendall()完整发送 TCP 数据。成功返回 None,失败则抛出异常
    s.recvfrom()接受 UDP 数据,与 recv() 类似,但返回的是(data, address)
    s.sendto()发送 UDP 数据,address 是形式为(ipaddr, port)的元组,指定远程地址,返回的是发送的字节数
    s.close()关闭套接字
    s.getpeername()返回套接字的远程地址,返回值通常是元组
    s.getsockname()返回套接字自己的地址。通常是一个元组(ipaddr, port)
    s.setsockopt(level, optname, value)设置给定套接字选项的值
    s.getsockopt(level, optname[.buflen])返回套接字选项的值
    s.settimeout(timeout)设置套接字操作的超时期,timeout 是一个浮点数,单位是。值为 None 白哦是没有超时期
    s.gettimeout()返回当前超时期的值,单位是,没有则返回 None
    s.fileno()返回套接字的文件描述符
    s.setblocking(flag)如果 flag 为 0,则将套接字设置为非阻塞模式,否则设为阻塞模式(默认值)
    s.makefile()创建一个与该套接字相关联的文件

2、TCP 编程

TCP 客户端
python">import sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建 socket 对象
s.connect(('www.baidu.com', 80)) # 主动发起 TCP 连接
s.send(b'GET / HTTP/1.1\r\nHOST: www.baidu.com\r\nConnection: close\r\n\r\n') # 发送 HTTP 请求buffer = []
while True:data = s.recv(1024) # 接收数据if data:buffer.append(data)else:break
web_data = b''.join(buffer)http_header, http_content = web_data.split(b'\r\n\r\n', 1)
with open('web_info.html', 'wb') as f:f.write(http_content)
TCP 服务器

服务器端:

python">import socket
import threadingdef tcp_server(client: socket.socket, address: tuple):print(f"The Client come from {address[0]}:{address[1]}")client.send(f"Welcone from {address[0]}:{address[1]}\r\n".encode("utf-8"))while True:content = client.recv(1024)if content == b"exit":breakelif content:print(content.decode("utf-8"))else:breakprint("Client exits, connection closed!")client.close()s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("127.0.0.1", 8888)) # 绑定 IP 地址和端口号
s.listen(5) # 进行监听
print('waiting connection...')
print('Server is launching the new connection from 127.0.0.1:8888')while True:client, address = s.accept() # 接受客户端的连接t = threading.Thread(target=tcp_server, args=(client, address))t.start()

客户端:

python">import socketclient = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("127.0.0.1", 8888))
client.send("Hi, I am Client!".encode("utf-8"))
server_content = client.recv(1024)
print(server_content.decode("utf-8"))
client.send(b"exit")
client.close()

3、UDP 编程

UDP 服务器
python">import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('127.0.0.1', 8888))
while True:data, address = s.recvfrom(1024)print('Launching connection...')print(f'Server receive the message from {address[0]}:{address[1]}')print(data.decode("utf-8"))

不需要使用 listen() 方法监听,直接调用 recvfrom() 方法接收数据

UDP 客户端
python">import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server = ("127.0.0.1", 8888)
s.sendto("Hi, I am Client!".encode("utf-8"), server)
print('connecting Server...')
s.close()

http://www.ppmy.cn/news/1532196.html

相关文章

焊接错误总结

1.如果焊接完后,发现芯片不工作,检测电压又出问题,比如你的3.3v引脚和GND之间的压差为1.8v,那就是5v转3.3v那个三脚芯片坏了,你可以去用电表测测那个三脚芯片的输出电压是否为3.3 2.如果焊接后的芯片能运行但是速度明…

学习threejs,实现几何体阴影效果

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言二、🍀绘制任意字体模型…

PyTorch用map函数进行tokenize之后,为什么需要remove_columns?

遇到的问题 下面以GLUE数据集中的tokenize为例,下面是典型的处理方法,经过一个map函数,使用lambda表达式对数据进行tokenize。后面会跟上remove_columns这句话,这是为什么呢? if(task_name"sst2"):tokeniz…

TypeScript是基于LLM上层研发的受益者

TypeScript优在哪里 TypeScript是一种由微软开发的开源编程语言,它是JavaScript的一个超集,添加了类型系统和一些其他特性。TypeScript的优势在于: 静态类型检查:TypeScript的最大卖点是它的静态类型系统。这允许开发者在编写代码…

Python 异步编程:如何从入门到精通

在现代编程实践中,异步编程已成为提高程序性能和效率的关键技术之一。Python,作为一种动态、解释型的高级编程语言,提供了强大的异步编程能力。本文将带你从异步编程的基础知识入手,逐步深入到实际应用,探索Python异步…

Groupby_SQL和pandas等效例子

在SQL中使用PARTITION BY与在Pandas中使用groupby().agg()有一定的相似性,因为它们都是用于分组数据并对每组应用某种聚合函数。 例一 下面将给出一个SQL的例子和等效的Pandas代码。 SQL 示例 假设我们有一个名为employees的表,包含以下列&#xff1a…

javascript手写实现instanceof函数 介绍判断数组的方法

1 手写实现instanceof函数 instanceof 是 JavaScript 中的一个运算符,用于检测一个对象是否是某个构造函数的实例。它的语法是 object instanceof Constructor,如果 object 是 Constructor.prototype 的一个实例,返回 true,否则返…

LSTM预测未来30天销售额

加入深度实战社区:www.zzgcz.com,免费学习所有深度学习实战项目。 1. 项目简介 本项目旨在利用深度学习中的长短期记忆网络(LSTM)来预测未来30天的销售额。LSTM模型能够处理时序数据中的长期依赖问题,因此在销售额预测这类涉及时…