1.Server服务器
from socket import socket
server = socket()
server.bind(('10.7.184.61', 8081))
server.listen(125)
while True:
print('等待连接.....')
connect, address = server.accept()
# 发图片(1)和发文字 (2), 给别人发消息 (3),IP和端口:
message = '1:发送图片; 2:发送文字'
connect.send(message.encode(encoding='utf-8'))
# 接受客户端的选择
re_message = connect.recv(1024).decode(encoding='utf-8')
if re_message == '1':
with open('files/0.jpg', 'rb') as f:
data = f.read()
print(len(data))
# 发送图片长度
connect.send(str(len(data)).encode('utf-8'))
# 发送图片内容
connect.send(data)
elif re_message == '2':
message = input('>>>')
connect.send(message.encode(encoding='utf-8'))
else:
pass
2.Client客户端
from socket import socket
client = socket()
client.connect(('10.7.184.61', 8081))
# 接受消息
re_message = client.recv(1024).decode(encoding='utf-8')
print(re_message)
# 选择
send_message = input('>>>')
client.send(send_message.encode(encoding='utf-8'))
if send_message == '1':
# 接受图片长度
length = (client.recv(1024)).decode(encoding='utf-8')
# print(length)
# 接收图片
count = 0
while True:
re_data = client.recv(1024)
count += len(re_data)
print(count)
with open('client/re.jpg', 'ab') as f:
f.write(re_data)
if count == int(length):
break
elif send_message == '2':
re_message = client.recv(1024).decode(encoding='utf-8')
print(re_message)
3.多线程
Thread类的对象就是线程对象
主线程:
每一个进程默认都有一个线程,这个线程叫主线程。默认情况下,所有的代码都是在主线程中运行的
主线程以外的线程都叫子线程
from threading import Thread
from datetime import datetime
import time
def download(name):
print(f'《{name}》开始下载:{datetime.now()}')
time.sleep(5)
print(f'《{name}》下载结束:{datetime.now()}')
# 情况一:让三个电影在一个线程中下载
# download('V字仇杀队')
# download('当幸福来敲门')
# download('摔跤吧爸爸')
# 情况二:
# Thread(target=需要在当前创建的线程中执行的功能, args=target对应的函数在调用的时候需要传的参数)
t1 = Thread(target=download, args=('V字仇杀队',))
t2 = Thread(target=download, args=('当幸福来敲门',))
t3 = Thread(target=download, args=('摔跤吧爸爸',))
# 让子线程去执行线程中的任务
t1.start() # download('V字仇杀队')
t2.start()
t3.start()
# download('摔跤吧爸爸')
films = ['电影1', '电影2', '电影3']
ts = []
for f in films:
t = Thread(target=download, args=(f,))
ts.append(t)
# t.start()
for t in ts:
print(t)
4.多线程2
from threading import Thread, current_thread
from datetime import datetime
import time
class DownloadThread(Thread):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print('下载'+self.name)
print(current_thread())
print('run中的代码')
# print(current_thread())
t1 = DownloadThread('电影1')
print('====:', t1.name)
t1.start() # 自动在子线程中执行run方法中的代码
"""
class Thread:
def run(self):
pass
def start(self):
self.run()
5.线程安全
import time
from threading import Thread, Lock
money = 1000
lock = Lock()
def get_money(num):
global money
lock.acquire() # 加锁
m1 = money
# print('取钱余额', m1)
time.sleep(5)
m1 -= num
money = m1
print('取钱剩下:', m1)
lock.release() # 解锁
def set_money(num):
global money
lock.acquire()
m1 = money
# print('存钱余额:', m1)
time.sleep(5)
m1 += num
money = m1
print('存钱剩下:', m1)
lock.release()
t1 = Thread(target=get_money, args=(500,))
t2 = Thread(target=set_money, args=(1000,))
t2.start()
t1.start()