网络编程
1.socket
socket又叫套接字,指的是网络通信的两端,分别是服务器和客户端
socket编程指的就是通过代码实现客户端和服务器之间的通信
2.服务器的实现
2.1创建套接字对象
server = socket.socket()
参数说明:
family:ip类型,AF_INET -> IPv4,AF_INET6 -> IPv6
type:传输协议类型,SOCK_STREAM ->TCP,SOCK_DGRAM ->UDP
2.2绑定IP地址和端口
bind((ip地址,端口号))
ip用来区分互联网上设备
端口是用来区分一台计算机上的不同服务(应用),端口范围是0-65535,其中0-1024是著名端口,选择端口时用其他端口
server.bind(('10.7.190.164',8080))
2.3启动服务器(监听请求)
listen(数量) --数量指的是一次性能够处理的最大请求数
server.listen(255)
2.4让服务器一直处于运行状态
while True:
print('开始监听...')
connect,addr = server.accept() #等待客户端的请求,程序运行到这里会停下(类似input),等到有客户端来连接服务器,才会接着往后执行
print(connect,addr)
#send(数据) --发送数据,数据是二进制数据
message = input('>>>')
connect.send(message.encode(encoding='utf-8'))
#recv(字节数) --接收数据,并且指定一次性接收的数据的大小的最大值;返回接收到的二进制数据,程序运行到这里也会停下,直到客户端给服务器发送消息后才会接着往后执行。
data = connect.recv(1024)
print('<<<')
print(data.decode(encoding='utf-8'))
connect.close()
3.客户端的实现
3.1创建套接字对象
client = socket.socket()
3.2连接服务器
connect((ip地址,端口))
client.connect(('10.7.190.164',8080)) #要连接的服务器ip和端口,客户端发送消息端口是随机的,但可以指定。
3.3接收消息
data = client.recv(1024)
print('<<<<')
print(data.decode(encoding='utf-8'))
3.4发送消息
message = input('>>>')
client.send(message.encode(encoding='utf-8'))
client.close()
4.网络请求
根据网络接口请求数据:通过第三方库requests提供的方法
import requests
response = requests.get('网络地址')
response.text #获取字符串形式的数据结果
response.content #获取二进制数据
response.json() #函数,获取json数据并转换为对应的python数据类型
多线程
1.什么是进程
一个正在运行的应用程序就是一个进程,系统会给每个进程分配一个独立的内存区域,用来保存程序运行过程中产生的数据,当进程结束的时候,这个内存区域会自动销毁。
2.什么是线程
进程想要执行任务就必须要有线程。每个进程都默认有一个线程,这个线程叫主线程,其他的线程叫子线程。程序任务都是默认在主线程中执行的。
一个线程中执行多个任务,任务是串行执行的(一个一个按顺序执行)
一个进程中如果有多个线程,多线程执行不同任务的时候是并行(同时执行,实质是假象,是cpu在不同线程间来回调度)
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('+++++++++++')
3.1直接创建线程类对象
语法:
import threading
线程对象 = threading.Thread(target=函数,args=参数) -创建一个线程对象,并返回
说明:
函数 -function类型的变量,这个函数的函数体就会在子线程中执行
参数 -元祖,参数会传给target对应的函数
让线程开始执行任务:
线程对象.start() --开始执行子线程中的任务
当某个线程出现异常,是线程直接结束,进程不一定结束,只有所有的线程都结束,进程才结束
threading.current_thread()
3.2创建线程子类
- 声明一个类继承threading模块的Thread类
- 重写run()方法,这个方法中的任务就是需要在子线程中执行的任务
- 创建当前类的对象,就是线程对象
- 启动线程(还是通过start()调用)
from threading import Thread,current_thread
class DownLoadThread(Thread):
def __init__(self,film):
super().__init__()
self.film = film
def run(self):
print('下载电影:%s %s',% (self.film,current_thread()))
t1 = DownLoadThread()
t1.start() #线程对象调用start会自动在子线程中去调用run方法
#t1.run() 这个也可以,但是是在主线程中执行因此没有意义
3.3 join的用法
线程对象.join() --程序执行到这个地方会停下来(线程阻塞),直到线程对象中的任务执行完成后才继续执行后面的语句