套接字socket
server
import socket
server = socket.socket()
server.bind(('IP',port))
server.listen(5)
conn , addr = server.accept()
print(addr)
data = conn.recv(1024).decode('utf8')
print(data)
conn.send(b'hello')
conn.close()
server.close()
client
import socket
client = socket.socket()
client.connent(('IP',port))
client.send(b'hello'.encode('utf8'))
data = client.recv(1024)
print(data)
client.close()
循环套接字
server
import socket
server = socket.socket()
server.bind(('ip',port))
server.listen(5)
while True:
conn , addr = server.accept()
print(addr)
while True:
data =conn.recv(1024).decode('utf8')
print(data)
if data == 'q':
break
if len(data) == 0:
break
conn.send(data.encode('utf8'))
conn.close()
client
import socket
client = socket.socket()
client.connect(('IP',port))
while True:
send_msg = input('client--->server')
client.send(send_msg.encode('utf8'))
if send_msg == 'q':
break
data = client.recv(1024).decode('utf8')
print(data)
client.close()
粘包问题
import json
import struct
import socket
server = socket.socket()
server.bind(('ip',port))
server.listen(5)
while True:
conn , addr = server.accept()
print(addr)
while True:
try:
head = conn.recv(4).decode('utf8')
head_len = struct.unpack('i',head)[0]
data = recv(head_len).decode('utf8')
dic = json.loads(data)
print(dic)
except Exception as e:
print(e)
break
conn.close()
client
import socket
import struct
import json
client = socket.socket()
client.connect(('Ip',port))
while True :
send_dict = {
'zheshji':'wo de mingzi '
}
json_data = json.dumps(send_dict)
bytes_data = json_data.encode('utf8')
head = struct.pack('i',len(bytes_data))
client.send(head)
client.send(bytes_data)
client.close()
#客户端主要
while True:
head = struct.pack('i'len(data))
client.send(head)
#服务端主要
while True:
head = conn.recv(4).decode('utf8')
head_len = struct.unpack('i'head)[0]
data = conn.recv(head_len)
上传大文件
import socket
import json
import struct
server.bind(('ip',port))
server.listen(5)
while True:
conn ,addr = server.accept()
print(addr)
while True:
try:
head = conn.recv(4).decode('utf8')
head_len = struct.unpack('i',head)[0]
data = recv(head_len).decode('utf8')
dic_data = json.loads(data)
file_name = dic_data.get('file_name')
file_size = dic_data.get('file_size')
init_data = 0
with open(file_name,'wb') as f:
while init_data < file_size:
data = conn.recv(1024)
f.write(data)
init_data += len(data)
print(f'{file_name}接收完毕!')
except Exception as e :
print(e)
break
conn.close()
UDP
服务端
import socket
server = socket.socket(type=socket.SOCKET_DGRAM)
server.bind(('IP',port))
msg , addr = server.recvfrom(1024)
print(msg,addr)
import socket
clinet = socket.socket(type=socket.SOCK_DGRAM)
server_ip_port = ('IP',port)
client.sendto(b'hello', server_ip_port )
多人聊天室
服务端
import socket
server = socket.socket(socket.SOCK_DGRAM)
server.bind('ip',port)
while True:
msg1, addr1 = server.recvfrom(1024)
msg2, addr2 = server.recvfrom(1024)
msg3, addr3 = server.recvfrom(1024)
send_msg = input('服务发送消息').encode('utf8')
server.sendto(send_msg, addr1)
server.sendto(send_msg, addr2)
server.sendto(send_msg, addr3)
客户端
import socket
client = socket.socket(socket.SOCK_DGRAM)
while True:
send_msg = input('客户端').encode('utf8')
client.sendto(send_msg,('ip',port))
client.sendto(send_msg,('ip',port))
msg = client.recv(1024)
subprocess补充
'''
1.可以通过代码执行操作系统的终端命令
2.并返回终端执行命令的结果
'''
import subprocess
cmd = input('>>>>')
obj = subprocess.Popen(
cmd,
shell = True,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE,
)
result = obj.stderr.read() + obj.stdout.read()
struct
将一个很长的数据长度,压缩成固定的长度的一个标记
import struct
str = 'ssssssss'
headers = struct.pack('i',len(str))
print(headers)
print(len(headers)) # 4
data_len = struct.unpack('i',headers)[0]
socketserver *************
import socketserver
class MyTcpServer(socketserver.BaseRequestHandler):
def handler(self):
print(self.client_address)
while True:
try:
data = self.request.recv(1024).decode('utf8')
send_msg = data.upper()
self.request.send(send_msg.encode('utf8'))
except Exception as e:
print(e)
break
if __name__ == '__main__':
server = socketserver.TCPServer(
('127.0.0.1',8888),MyTcpServer
)# 一个技师服务
# 并发模式
server = socketserver.ThreadingTCPServer(
('127.0.0.1',8888),myTcpServer
)
server.server_forever()
进程
from multiprocessing import Process
import time
def task(name):
print(f'{name}的任务开始执行')
time.sleep(1)
print(f'{name}的任务已经结束')
p = Process(target=task, args = ('jason',))
if __name__ == '__main__':
p = Process(target= task,args = ('json',))
p.start()
join方法
# join 方法:用来告诉操作系统,让子进程结束后,父进程再结束。
from multiprocessing import Process
import time
def task(name):
print (f'{name}start...')
time.sleep(2)
print(f'{name}over...')
if __name__ == '__main__':
p = Prcess(target=task,args=('jason',))
p.start()
p.join()
print('主进程')
from multiprocessing import Process
import time
def task(name,n):
print(f'{name}start....')
time.sleep(n)
print(f'{name}over...')
if __name__ == '__main__':
p1 = Process(target=task,args=('kai',1))
p2 = Process(target=task,args=('feng',2))
p3 = Process(target=task,args=('liu',3))
p1.start()
p2.start()
p3.start()
p1.join()
p2.join()
p3.join()
print('主进程')
进程间数据隔离
'''
进程间数据相互隔离:
主进程与子进程会产生各自得名称空间。
'''
from mutiprocessing import Process
x = 100
def func():
print('执行函数。。。。')
global x
x = 200
if __name__ =='__main__':
p = Process(target=func)
p.start()
print(x)
print('主')
进程对象得属性
'''
current_process().pid 获取子进程ID
os.getpid() 获取主进程pid号
cmd 中查看进程号 tasklist | findstr 进程号
进程号回收得两种条件:
1.join可以回收子进程与主进程
2.主进程正常结束,子进程与主进程也会被回收。
'''
from multiprocessing import Process
from multiprocessing import current_process
import os
import time
def task(name):
print(f'{name}start....',current_process().pid)
time.sleep(4)
print(f'{name}end.....'current_process().pid)
if __name__ == '__name__':
p = Process(target=task,args=('json',))
#判断进程是否存活
print(p.is_alive())
# 告诉系统等子进程结束后,父进程再结束。
p.join()
print('主进程',os.getpid())
print('主主进程',os.getppid())
time.sleep(100)
守护进程
"""
主进程结束后,该主进程产生得所有子进程跟着结束,并回收。
主进程结束,所有子进程必须结束。
"""
from multiprocessing import current_process
from multiprocessing import Process
import time
def task(name):
print(f'{name}start....'current_process().pid)
time.sleep(5)
print(f'{name}over...',current_process().pid)
if __name__ == '__main__':
p1 = Process(target=task,args=('kai',))
p1.daemon = True
p1.start()
print('')
进程互斥锁
'''
模拟抢票软件需求
并发查票与抢票
1.查看余票
2.开始抢票
进程互斥锁:
让并发变串行,牺牲了执行效率,保证了数据安全。
在程序并发执行时,需要修改数据时使用。
'''
import json
import time
from multiprocessing import Process
from multiprocessing import Lock
def search(user):
with open('data.txt','r',encoding='utf8') as f:
dic = json.load(f)
print(f'用户{user}查看余票,还剩{dic.get('ticket_num')}...')
def buy(user):
with open('data.txt','r',encoding='utf8') as f:
dic = json.load(f)
time.sleep(1)
if dic.get('ticket_num') > 0:
dic['ticket_num'] -= 1
with open('data.txt','w',encoding='utf8') as f:
json.dump(dic,f)
print(f'用户{user}抢票成功')
else:
print(f'用户:{user}抢票失败')
def run(user,mutex):
#并发:异步执行
search(user)
mutex.acquire()
buy(user)
mutex.release()
if __name__=='__name__':
mutex = Lock()
for i in range(10):
p = Process(target=run, args= (f'用户{i}',mutex))
p.start()