day26-29

ソケットソケット

サーバ

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()

クライアント

import socket

client = socket.socket()

client.connent(('IP',port))

client.send(b'hello'.encode('utf8'))

data = client.recv(1024)

print(data)

client.close()

ソケットサイクル

サーバ

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()

クライアント

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()
    

クライアント

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)

サブプロセスサプリメント

'''
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()

構造体

将一个很长的数据长度,压缩成固定的长度的一个标记
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 方法:用来告诉操作系统,让子进程结束后,父进程再结束。

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()
    

おすすめ

転載: www.cnblogs.com/kaizi111/p/11762157.html