一、scoketServer(创建服务器)
1.创建服务器scoket编程对象
server = socket.socket(family=socket.AF_INET, type=socket.SCOK_STREAM)
family:确定服务类型
AF_INET--->ipv4
AF_INET6--->ipv6
ipv4和ipv6的区别在于容纳的数量不一样,显然ipv6多
type:确定传输类型
SOCK_STREAM-->TCP协议
SOCK_DGRAM-->UDP协议
2.绑定ip地址和端口
地址格式:(ip地址字符串,端口号)
端口号:用来区分一个计算机中不同的服务,范围是0-65535
注意:1.其中0-1024是'著名端口',用来绑定一些特殊服务的,一般不使用。
2.同一时间一个端口只能绑定一个服务
3.监听请求
参数:用来限制一次性能够接收的客户端请求的数量(最大的服务量)
4.接收客户端的请求
accept()会阻塞线程,到有客户端给这个服务器发送请求,才会开始执行
5.给客户端发送消息
send(数据):数据必须是二进制数据(bytes)类型
字符串转二进制:
bytes(字符串,encoding=编码方式)
字符串.encode(encoding=编码方式)
接收从客户端发来的消息
6.关闭链接
import socket #导入socket
server = socket.socket() #建立一个服务器
server.bind(('10.7.181.112', 10000)) #绑定一个地址,设置一个端口
server.listen(50) #监听请求,括号里面参数表示允许最大的等候请求的数量
while True: #让我们建立的服务器一直处于运行状态
client, addr = server.accept() #accept()函数会返回一个会话和一个地址,acept会阻塞线程,直到接收到请求为止
client.send('How do you do?'.encode(encoding='utf-8')) #发送内容给客户端,要将字符串转成二进制编码
data = client.recv(1024) #接收从客户端发来的信息,保存到函数data里面,接收到的数据也是二进制,括号里面可以设置最大的字节数
print(data.decode(encoding='utf-8')) #将接收到的二进制数据转化成字符
client.close()
"""
注意:不管是发送还是接收都是通过会话来完成的。而且都是以二进制的形式
字符串转二进制:(给客户端发送的时候用)
1. bytes(字符串,编码方式)
2. 字符串.encode(encoding=编码方式)
二进制转字符串:(接收客户端的信息时候用)
1.str(二进制数据,encoding='utf-8')
2.二进制数据.decode(encoding='utf-8')
"""
二、socketClient
1.创建套接字对象
2.连接服务器
3.接收信息
4.发送信息
import socket #导入socket模块
while True: #让我们的程序一直运行
client = socket.socket() #创建套接字对象
client.connect(('10.7.181.112', 10000)) #连接服务器
data = client.recv(1024) #接收从服务器发来的数据
print(data.decode(encoding='utf-8')) #将二进制转化成字符
client.send('How do you do?'.encode(encoding='utf-8')) #给客户端发送信息,要将字符串转化成二进制
三、http
1.确定url
url:网址
get请求,参数以问号(?)的形式拼接到url后面,参数名=值的形式,多个参数用&隔开
2.发送请求
a.以字符串的形式获取响应体(服务器返回的数据)
b.以json的形式获取响应体
c.以二进制的形式获取响应体
from requests import request #导入request
url = 'https://www.apiopen.top/satinApi?type=1&page=1' #确定网址,注意后面是个字符串
response = request('GET', url) #发送请求,以GET的方式获取数据,两个参数,一个是获取数据的方式,一个是网址
text = response.text #以字符串的形式获取内容,text(文本),就是字符串
print(text, type(text))
json = response.json #以json的形式获取内容
print(json, type(json))
content = response.content #以二进制的形式获取内容
print(content, type(content))
作业
写一个两个人的聊天系统,可以实现双向聊天功能。
如果发送的是普通的文字就直接打印,如果发送的文字是’拜拜’就关闭连接,
如果是一个网络地址就获取数据(保存到文本文件中),如果是图片地址就下载图片到本地
服务器
import socket #导入socket
import re
str1 = '拜拜'
server = socket.socket() #建立一个套接字
server.bind(('10.7.181.112', 10000)) #绑定一个地址
server.listen(10) #监听请求
while True: #让监听一直处于运行状态
client, addr = server.accept() #接收会话和地址
while True:
data = client.recv(1024*1024)
content = data.decode(encoding='utf-8')
if str1 in content:
print(content)
client.close()
break
else:
print(content)
message = input('请输入你想发送的内容:')
client.send(message.encode(encoding='utf-8'))
客户端
import socket
import re
from requests import request
str2 = '拜拜'
while True:
client = socket.socket()
client.connect(('10.7.181.112', 10000))
content = input('请输入你想说的话:')
client.send(content.encode(encoding='utf-8'))
data = client.recv(1024)
try:
content = data.decode(encoding='utf-8')
re_str = r'^http'
value = re.search(re_str, content)
if not value:
print(content)
else:
response = request('GET', content)
text = response.text
with open('./文本文件.txt', 'w', encoding='utf-8') as f:
f.write(text)
except:
with open('./图片.jpg', 'w') as f:
f.write(data)







网友评论