1.什么是socket
官方定义: 套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
2.socket()函数
socket.socket([family[, type[, proto]]])
- family: 套接字家族可以使 AF_UNIX 或者 AF_INET。
- type: 套接字类型可以根据是面向连接的还是非连接分为
SOCK_STREAM
或SOCK_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)
运行效果:
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"))
运行效果:
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)