1.什么是套接字(socket)?
- socket编程(套接字):通过代码来创建实现两个端(服务端,客户端)之间的通信
- socket一般可以基于TCP和UDP实现可靠传输和不可靠传输
- python中的内置模块socket可以支持socket编程
2.实现
(1)服务端
实现过程:
1)创建套接字对象
默认socket是基于ipv4的tcp传输,可省略参数
server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
2)绑定IP地址和端口
套接字对象.bind(('ip地址', 端口号))
端口号是用来区分一个计算机中不同的服务.范围是0-65535;
注意
:(1)其中0-1024是'保留端口',用来绑定一些特殊服务的,一般使用1024以后的端口
(2)同一时间,一个端口只能绑定一个服务
3)开启监听
server.listen(1) # 括号的参数代表服务器同时可接受N个连接请求,这个N值取决于服务器的性能
4)接收和发送消息
连接名称, addr = server.accept()
注意:
accept()具有阻塞功能,直到有客户端对服务器发起请求,才会开始执行
注意
两端通信时使用二进制数据进行传输,在发送和接收前,都应做相关的转化处理
#将要发送的字符串转化为二进制:
二进制数据.encode() #encode里的参数默认为encoding='utf-8',可省略
#发送数据:
连接名称.send()
#将收到的二进制数据转换成字符串:
二进制数据.decode(encoding='utf-8')
#接收数据
连接名称.recv(1024) # 1024代表依次接收多少个字节
5)关闭套接字
client.close()
实例:
"""__author__ = Sun Jiankang"""
import socket
if __name__ == '__main__':
server = socket.socket()
server.bind(('10.7.181.65', 8002))
server.listen(10)
# 保持服务器不关闭
while True:
communicate, addr = server.accept()
# 让客户端和服务器一直处于连接的状态
while True:
# 发送
message = input('>>>')
communicate.send(message.encode())
# 接收
message_data = communicate.recv(1024)
print(message_data.decode(encoding='utf-8'))
client.close()
(2)客户端
实现过程:
1)创建套接字对象
2)连接服务器
套接字对象.connect((服务端ip, 端口号))
3)发送和接收消息
4)关闭套接字
"""__author__ = Sun Jiankang"""
import socket
if __name__ == '__main__':
client = socket.socket()
# 连接服务器
client.connect(('10.7.181.65', 8002))
while True:
# 接收
data = client.recv(1024)
print(data.decode(encoding='utf-8'))
# 发送
message = input('>>>')
client.send(message.encode())
编码完成后,先运行服务端,再运行客户端进行连接
3.HTTP请求
(1)什么是HTTP请求?
是指从客户端到服务器端的请求消息。包括:消息首行中,对资源的请求方法、资源的标识符及使用的协议。
(2)HTTP协议
HTTP协议(为了可以让客户端和服务器能够进行有效的数据交流)
(3)requests第三方库
python中访问网络中的数据:第三方库request.
# GET请求:参数以?号的形式拼接到url地址后面,参数名=值得形式,多个参数用&隔开
# 1.确定url
url = 'https://www.apiopen.top/satinApi?type=1&page=1'
# 2.发出请求
response = request('POST', url)
print(type(response), response)
# 1. 以字符串的形式获取响应体(服务器返回的数据)
text = response.text
print(type(text), text)
# 2.以json的形式获取响应体
json = response.json()
print(type(json), json)
# 3.以二进制的形式获取响应体
content = response.content
print(type(content), content)
注意:
GET和POST方法的区别:
- ①GET可传输的字符串长度有限,因为浏览器地址栏最大可容纳1kb的长度,而post方法则没有这个限制
- ②GET请求能直接在地址栏中显示重要信息(如:用户名和密码),较POST安全性较差.