当前位置: 首页 > news >正文

python学习-13【网络编程】

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
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 客户端
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 服务器

服务器端:

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

客户端:

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 服务器
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 客户端
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()

相关文章:

  • SBB Usage Parameters
  • Supervision 计算机视觉工具
  • 【网络安全】网络基础第一阶段——第四节:网络协议基础---- VRRP与网络架构设计
  • 基站定位与Wi-Fi定位?看这篇就够了
  • C++——认识STL及使用及实现第一个容器string
  • 关于若依前端界面缓存问题
  • 【Tomcat】常见面试题整理 共34题
  • Docker本地部署Chatbot Ollama搭建AI聊天机器人并实现远程交互
  • 如何在 macOS 上恢复未保存的 Excel 文件 – 文件恢复的最佳方法
  • IP地址与智能家居能够碰撞出什么样的火花呢?
  • more、less 命令:阅读文本
  • 记录一次排查sql server 服务调用异常的问题
  • C++:fstream类中seekg()/seekp()与tellg()/tellp()的用法详解
  • 等保测评中的密码学应用分析
  • 基于CentOS7上安装MicroK8s(最小生产的 Kubernetes)
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 【刷算法】从上往下打印二叉树
  • conda常用的命令
  • HTML5新特性总结
  • Java IO学习笔记一
  • jdbc就是这么简单
  • Linux快速复制或删除大量小文件
  • mysql_config not found
  • Next.js之基础概念(二)
  • pdf文件如何在线转换为jpg图片
  • PHP的类修饰符与访问修饰符
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Transformer-XL: Unleashing the Potential of Attention Models
  • TypeScript实现数据结构(一)栈,队列,链表
  • WebSocket使用
  • 给第三方使用接口的 URL 签名实现
  • 老板让我十分钟上手nx-admin
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 通信类
  • 无服务器化是企业 IT 架构的未来吗?
  • PostgreSQL之连接数修改
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • # 职场生活之道:善于团结
  • #数据结构 笔记三
  • (LLM) 很笨
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (三分钟)速览传统边缘检测算子
  • (十)T检验-第一部分
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • (正则)提取页面里的img标签
  • (转)setTimeout 和 setInterval 的区别
  • (转载)hibernate缓存
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • [ C++ ] template 模板进阶 (特化,分离编译)