零基础学Python之网络编程

1.什么是socket

官方定义: 套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。

2.socket()函数

socket.socket([family[, type[, proto]]])
  • family: 套接字家族可以使 AF_UNIX 或者 AF_INET。
  • type: 套接字类型可以根据是面向连接的还是非连接分为 SOCK_STREAMSOCK_DGRAM
  • protocol: 一般不填默认为 0。
AF_INET需经过多个协议层的编解码,消耗系统cpu,并且数据传输需要经过网卡,受到网卡带宽的限制。AF_UNIX数据到达内核缓冲区后,由内核根据指定路径名找到接收方socket对应的内核缓冲区,直接将数据拷贝过去,不经过协议层编解码,节省系统cpu,并且不经过网卡,因此不受网卡带宽的限制。

AF_UNIX的传输速率远远大于AF_INET

AF_INET不仅可以用作本机的跨进程通信,同样的可以用于不同机器之间的通信,其就是为了在不同机器之间进行网络互联传递数据而生。而AF_UNIX则只能用于本机内进程之间的通信。

3.UDP实现客户端与服务端通信

  • UDFClient
import socket
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
client.sendto("This is client hello".encode("utf-8"),("127.0.0.1",8888))
data,server = client.recvfrom(1024)
print(data.decode("utf-8"))
client.close()
  • UDFServer
import socket
server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
server.bind(("127.0.0.1",8888))
print("UDF Server Started")
while True:
    data,client = server.recvfrom(1024)
    print("Receive client messages:",data.decode("utf-8"))
    server.sendto("This is server hello".encode("utf-8"),client)

运行效果:
零基础学Python之网络编程_第1张图片

4.TCP实现客户端与服务端通信

  • TCPClient
import socket
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(("127.0.0.1",8080))
while True:
    print("请输入发送服务端的内容:")
    send_data = input()
    client.send(send_data.encode("utf-8"))
    if send_data == "close":
        client.close()
        print("客户端关闭...")
        break
    data = client.recv(1024).decode("utf-8")
    print("服务端响应的数据:",data)
  • TCPServer
import socket

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(("127.0.0.1",8080))
# 同一时刻,允许多少客户端进行通信
server.listen(5)
client,address = server.accept()
print("服务端启动...")
while True:
     data = client.recv(1024)
     msg = data.decode("utf-8")
     if msg == "close":
         print("服务端关闭...")
         server.close()
         break
     print("客户端发送的内容:", msg)
     print("请输入回复内容:")
     client.send(input().encode("utf-8"))

运行效果:

零基础学Python之网络编程_第2张图片

5.requests模块发送http请求

  • requests模块常用方法:
方法名 描述
requests.request(url) 构造一个请求,支持以下各种方法
requests.get() 发送一个Get请求
requests.post() 发送一个post请求
requests.head() 获取html请求头信息
requests.put() 发送put请求
requests.patch() 提交局部修改的请求
requests.delete() 提交删除请求
  • 属性及方法
属性 描述
response.status_code 响应状态码
response.content 将response对象转成二进制数据
response.text 把response对象转换成为字符串数据
response.encoding 定义response对象的编码
response.cookie 获取请求后的cookie
response.url 获取请求的地址
response.json() 内置的JSON解码器
  • 使用requests模块发送一个带参数的get请求
url = "http://192.168.140.123:9090/product/list?type=rate"
headers = {
    "token": "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIyNTYyODM4MzI1NDMzNDI1OTIiLCJzdWIiOiIxIiwiaWF0IjoxNzA2MTY3Njc3LCJleHAiOjE3MDY3NzI0Nzd9.CB0YpMwQRxGKqqeUj29D0TiFgUO7YDOx04t2-ocfTdo"
}
response = requests.get(url=url, headers=headers)
print(response.text)
  • 使用requests模块发送一个带参数的post请求
url = "http://192.168.140.123:9090/product/page"
params = {
    "current": 1,
    "size": 15
}
headers = {
    "token": "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIyNTYyODM4MzI1NDMzNDI1OTIiLCJzdWIiOiIxIiwiaWF0IjoxNzA2MTY3Njc3LCJleHAiOjE3MDY3NzI0Nzd9.CB0YpMwQRxGKqqeUj29D0TiFgUO7YDOx04t2-ocfTdo",
    "Content-Type": "application/json"
}
response = requests.post(url=url, headers=headers, data=json.dumps(params))
print(response.text)

零基础学Python之网络编程_第3张图片

你可能感兴趣的:(#,Python基础专栏,python,网络,开发语言)