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

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 socket

s = 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 threading

def 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":
            break
        elif content:
            print(content.decode("utf-8"))
        else:
            break
    print("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 socket

client = 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 socket

s = 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 socket

s = 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.kler.cn/a/320666.html

相关文章:

  • 51单片机应用开发---LCD1602显示应用
  • SpringCloud篇(服务网关 - GateWay)
  • PCL 三维重建 耳切三角剖分算法
  • 前端Javascript、Vue、CSS等场景面试题目(二)
  • 从零开始学习 sg200x 多核开发之 uboot saveenv 功能使能
  • 【Golang】——Gin 框架中的路由与请求处理
  • 双端搭建个人博客
  • 安卓中有main函数吗?
  • JavaScript 基础 - 第20天_Node.js入门
  • Python-UnitTest框架
  • 基于springboot的驾校预约管理系统的设计与实现 (含源码+sql+视频导入教程)
  • 【Django5】django的helloworld
  • Hqst 品牌 H81801D 千兆 DIP 网络变压器在光猫收发器机顶盒中的应用
  • 前端——flex布局
  • 全方位洗衣洗鞋小程序系统,重塑干洗店服务新体验;
  • LeetCode 22. 括号生成
  • Vue3使用vue-quill富文本编辑器实现图片大小调整
  • 简单了解Redis(初识阶段)
  • 【STM32】 TCP/IP通信协议(1)
  • 【JavaWeb】二、HTML 入门
  • js-17-对数组、对象进行浅拷贝和深拷贝
  • 四款负载均衡工具Nginx、HAProxy、MetalLB、gobetween 比较
  • 【ARM 嵌入式 编译系列 2.8 -- GCC 编译优化参数 位置无关码】
  • Chat2VIS: Generating Data Visualizations via Natural Language
  • 【Android】BottomSheet基本用法总结(BottomSheetDialog,BottomSheetDialogFragment)
  • Unity中的GUIStyle错误:SerializedObject of SerializedProperty has been Disposed.