socket(套接字)
1.什么是socket:
socket又叫套接字, 指的是网络通信的两端,分别是服务器和客户端
socket编程指的就是通过代码实现客户端和服务器之间的通信
2.服务器的实现
1.创建套接字对象
"""
family: ip类型, AF_INET -> ipv4, AF_INET6 -> ipv6
type: 传输协议的类型, SOCK_STREAM -> TCP, SOCK_DGRAM -> UDP
"""
import socket
server = socket.socket()
2.绑定IP地址和端口
"""
ip用来区分互联网上设备
端口是用来区分一台计算上的不同的服务(应用),值是0-65535,其中0-1024是著名端口。其他的随便选
bind((ip地址,端口号))
"""
server.bind(('10.7.190.127', 8081))
3.启动服务器(监听请求)
"""
listen(数量) - 这儿的数量指的是一次性能够处理的最大请求数
"""
server.listen(255)
4.让服务器一直处于运行状态
while True:
print('开始监听....')
# 5.等待客户端的请求
# 程序运行到这个地方,会停下来,等到有客户端来连接服务器,才会接着往后执行
connect, addr = server.accept()
print(connect, addr)
# 6.发送消息
"""
send(数据) - 发送数据,数据是二进制数据
"""
message = input('>>>')
connect.send(message.encode(encoding='utf-8'))
# 7.接收消息
"""
recv(字节数) - 接收数据,并且指定一次性接收的数据的大小的最大值;返回接收到的二进制数据
"""
# 程序运行到这个地方会停下来,直到客户端给服务器发送消息,才会接着执行
data = connect.recv(1024)
print('<<<:')
print(data.decode(encoding='utf-8'))
# 8.关闭连接
connect.close()
3.客户端的实现
创建客户端套接字:
# 1.创建套接字对象
client = socket.socket()
# 2.连接服务器
"""
套接字对象.connect((ip地址, 端口))
"""
client.connect(('10.7.190.127', 8080))
# 3.接收消息
data = client.recv(1024)
print('<<<:')
print(data.decode(encoding='utf-8'))
# 4.发送消息
message = input('>>>:')
client.send(message.encode(encoding='utf-8'))
# 5.关闭连接
client.close()
requests库
import requests
# 根据网络接口请求数据: 通过第三方库requests提供的方法
# 1.获取网络数据
response = requests.get('http://wimg.spriteapp.cn/profile/large/2017/10/05/59d644960c99b_mini.jpg')
print(response)
# 1)获取字符串形式的数据结果
# text = response.text
# print(type(text), text)
# 2)获取二进制数据
data = response.content
print(type(data), data)
with open('img.jpg', 'wb') as f:
f.write(data)
# 3)获取json数据
# message = response.json()(把获取到的json数据转换为python数据)
# print(type(message), message)
# print(message['data'])
多线程
1.什么是进程:
一个正在运行的应用程序就是一个进程。系统会给每个进程分配一个独立的内存区域,用来保存程序运行过程中产生的数据,当进程结束的时候,这个内存区域会自动销毁
2.什么是线程:
- 进程想要执行任务,就必须要有线程。每个进程默认都有一个线程,这个线程叫主线程;其他的线程叫子线程,程序默认都是在主线程中执行的;
- 一个线程中执行多个任务,任务是串行执行的(一个一个的按顺序执行)
- 一个进程中如果有多个线程,多线程执行不同任务的时候是并行(同时执行)
3.python中怎么使用多线程
python通过内置的threading模块来提供多线程相关技术;其中有一个Thread类,这个类的对象就是线程对象
def download(film):
print('开始下载: %s time: %s' % (film, str(datetime.now())))
sleep(15)
print('%s下载完成 time:%s' % (film, str(datetime.now())))
print(threading.current_thread())
# 在主线程中下载两个电影: 一个一个的下载,一个下载完才下载另一个,总耗时两个电影耗时之和
# download('恋恋笔记本')
# download('摔跤吧爸爸')
#=========================
# 1.直接创建线程类的对象
"""
a.语法:
线程对象 = Thread(target=函数, args=参数) - 创建一个线程对象,并且返回。
b.说明
函数 - function类型的变量; 这个函数的函数体就会在子线程中执行
参数 - 元祖; 参数会传给target对应的函数
"""
t1 = threading.Thread(target=download, args=('大国崛起',))
t2 = threading.Thread(target=download, args=('霸王别姬',))
# 2.让线程开始执行任务
"""
线程对象.start() - 开始执行子线程中的任务
"""
t1.start()
t2.start()
download('变形金刚')
print('=======')
# 某个线程出现异常,是线程直接结束;进程不一定结束,所有的线程都结束,进程才会结束
print([1, 2][10])
print('+++++++++++')
创建线程子类(推荐)
"""
1)声明一个类继承自Thread
2)重写run方法,这个方法中的任务就是需要在子线程中执行的任务
3)创建当前类的对象,就是线程对象
4)启动子线程
"""
class DownloadThread(Thread):
def __init__(self, film):
super().__init__()
self.film = film
def run(self):
print('%s开始下载...' % self.film)
time1 = randint(3, 10)
time.sleep(time1)
print('%s下载结束,总耗时%d秒' % (self.film, time1))
# 2.创建线程对象
t1 = DownloadThread('霸王别姬')
t2 = DownloadThread('海贼王')
# 3.启动线程
"""
线程对象调用start会自动在子线程中去调用run方法
直接用线程对象调用run方法,run方法会在主线程中执行
"""
start = time.time()
t1.start()
t2.start()
# 4.join的用法
"""
线程对象.join() -- 程序执行到这个地方会停下来(线程会阻塞),直到线程对象中的任务执行完成后才执行后面的语句
"""
t1.join()
t2.join()
# print('t1结束')
end = time.time()
print('总时间: ', end - start)