socket 服务器
socket编程(套接字):指的是通过代码来创建实现通信的两个端(服务器和客户端)
socket一般可以基于TCP和UDP实现客户端和服务器之间的可靠传输和不可靠传输
python中的内置模块socket可以支持socket编程
- 导入socket包
import socket
通过socket实现服务器端功能
- 1.创建服务器套接字对象
- 2.绑定ip地址和端口
- 3.监听请求
- 4.接收客户端的请求
- 5.给客户端发送信息
- 6.关闭连接
1.创建服务器套接字对象
-
family:确定服务类型 AF_INET → ipv4
AF_INET6 → ipv6 -
type:确定传输协议类型
-
SOCK_STREAM → TCP协议
-
SOCK_DGRAM → UDP协议
# server = socket.socket(family=socket.AF_INET, type=SOCK_STREAM)
server = socket.socket()
2.绑定ip地址和端口
-
地址格式:(IP地址字符串,端口号)
-
端口号是用来区分一个计算机中不同的服务,范围是0-65535
-
注意:
-
- 其中0-1024是'著名端口'用来绑定一些他特殊的服务,一般不适用
-
- 同一时间一个端口只能绑定一个服务
server.bind(('10.7.181.92', 8080))
3.监听请求
-
参数:用来限制一次性能够接收的客户端请求数量
server.listen(20)
# 保证服务器一直处于一直启动的状态
while True:
4.接收客户端的请求
-
accept():会阻塞线程,当有客户端给这个服务器发送请求才会执行
client, addr = server.accept()
print(addr)
5.给客户端发送信息
-
send(数据):数据必须是二进制数据(bytes)类型
-
字符串转二进制:
- bytes(字符串,encoding = 编码方式)
- 字符串.encode()可以加上参数'utf-8'
# client.send('HTTP/1.1 200 OK\r\n\r\n', encoding='utf-8')
str1 = input()
client.send(bytes(str1, encoding='utf-8'))
-
从客户端接收消息
- bufsize:设置缓存大小(单位是字节)
-
二进制(bytes)转字符串
- str(二进制数据,encoding = 'utf-8') // 强制转换
- 二进制.decode(encoding = 'utf-8')
data = client.recv(1024)
str1 = data.decode(encoding='utf-8')
print(str1)
6.关闭连接
client.close()
socket 客户端
1.创建套接字对象
client = socket.socket()
2.连接服务器
client.connect(('10.7.181.85', 8080))
3.接收信息
data = client.recv(1024)
print(data.decode(encoding='utf-8'))
str1 = input()
4.发送数据
client.send(str1.encode(encoding='utf-8'))
http 协议
-
服务器:(python)\java\php
-
HTTP(为了可以让客户端和服务器额能够进行有效的数据交流)
-
python中访问网络中的数据:第三方库request
导入第三方库
from requests import request
# https://www.apiopen.top/satinApi?type=1&page=1
# GET请求:参数以?形式拼接到url地址后面,参数名=值得形式,多个参数用&隔开
1.确定url
url = 'https://www.apiopen.top/satinApi?type=1&page=1'
2.发送请求
-
request(请求方式,地址)
-
返回值:响应
response = request('GET', 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)
作业
client.py
import socket
import os
def main():
ip = '10.7.181.92'
os.chdir('D:/MyCourse/Cultivate/Part2-NetworkProgram/day01-网络编程')
client = socket.socket()
client.connect((ip, 8089))
print('welcome to contact me')
while True:
# 发送信息
reply = input('>>>').encode()
client.send(reply)
# https://blazepress.com/.image/t_share/MTQxMzU1NzI2ODg2Njc2Mjkx/jannik-obenhof-travel-photography-instagram-18jpg.jpg
content = client.recv(1024)
print(content.decode(encoding='utf-8'))
if __name__ == '__main__':
main()
server.py
'''
写一个两个人的聊天系统,可以实现双向聊天功能。
# 如果发送的是普通的文字就直接打印,如果发送的文字是’拜拜’就关闭连接,
# 如果是一个网络地址就获取数据(保存到文本文件中),如果是图片地址就下载图片到本地
'''
import socket
import re
from requests import request
import os
def main():
server = socket.socket()
ip = '10.7.181.92'
server.bind((ip, 8089))
server.listen(10)
reUrl = r'https?://\w+\.\w+(\.\w+)?[\w\-/&%^$@#!.]+'
os.chdir('D:/MyCourse/Cultivate/Part2-NetworkProgram/day01-网络编程')
while True:
serverM, addr = server.accept()
print(addr)
while True:
msg = serverM.recv(1024).decode(encoding='utf-8')
# 接收
if re.fullmatch(reUrl, msg):
if re.findall(r'\.(jpg|jpeg|png|bmp|gif|ico|tif)$', msg):
response = request('GET', msg)
img = response.content
with open('./Case/999.jpg', 'wb') as f:
f.write(img)
serverM.send('收到!!'.encode())
else:
response = request('GET', msg)
json = response.json()
with open('./Case/333.json', 'wb') as f:
f.write(json)
serverM.send('收到!!'.encode())
else:
print(msg)
content = input('>>>').encode()
serverM.send(content)
if __name__ == '__main__':
main()