zoukankan      html  css  js  c++  java
  • python入门第二十八天——文件上传

    服务端:

     1 #!/usr/bin/env python3
     2 #-*- coding:utf-8 -*-
     3 '''
     4 Administrator 
     5 2018/8/1 
     6 '''
     7 import subprocess
     8 import socket,os
     9 
    10 # 创建一个socket:
    11     #family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None
    12     #创建Socket时,AF_INET指定使用IPv4协议,
    13     # 如果要用更先进的IPv6,就指定为AF_INET6
    14     # AF_UNIX Unix不同进程之间的通信
    15     #  SOCK_STREAM指定使用面向流的TCP协议 SOCK_DGRAM UDP协议
    16 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    17 print(s)
    18 address=('127.0.0.1',8000)
    19 #建立连接
    20 s.bind(address)
    21 #监听设置端口等待客户端的请求数量
    22 s.listen(3)
    23 
    24 
    25 print('等待...........')
    26 BASE_DIR=os.path.dirname(os.path.abspath(__file__))
    27 
    28 while True:
    29     # accept 阻塞
    30     conn, addr = s.accept()
    31     print(addr)
    32     while True:
    33         data=conn.recv(1024)
    34         cmd,filename,filesize=str(data,"utf8").split("|")
    35         path=os.path.join(BASE_DIR,"img",filename)
    36         filesize=int(filesize)
    37 
    38         f=open(path,"wb")
    39 
    40         get_sent=0
    41         while get_sent != filesize:
    42             data=conn.recv(1024)
    43             get_sent+=len(data)
    44             f.write(data)
    45         print("接受完毕。")
    46         f.close()
    47 
    48 
    49 s.close()

    客户端:

     1 #!/usr/bin/env python3
     2 # -*- coding:utf-8 -*-
     3 '''
     4 Administrator 
     5 2018/8/1 
     6 '''
     7 import socket,os,sys
     8 
     9 sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    10 print(sck)
    11 address = ('127.0.0.1', 8000) #192.168.0.103
    12 sck.connect(address)
    13 
    14 BASE_DIR=os.path.dirname(os.path.abspath(__file__))
    15 while True:
    16     inp = input(">>>").strip()#post|kanqingzi.jpg
    17 
    18     cmd,path=inp.split("|")
    19     path=os.path.join(BASE_DIR,path)#拼接路径
    20 
    21     filename=os.path.basename(path)#需要文件名字
    22     filesize=os.stat(path).st_size#需要文件大小
    23     #文件打包
    24     file_info="post|%s|%s"%(filename,filesize)#字符串拼接
    25     sck.sendall(bytes(file_info,"utf8"))
    26 
    27     with open(path,"rb") as f:
    28         has_sent=0
    29         while has_sent !=filesize:
    30             data=f.read(1024)
    31             sck.sendall(data)
    32             has_sent+=len(data)
    33     print("上传成功!!!")
    34 
    35 sck.close()


    练习:远程控制对方电脑,并将对方电脑里面的图片发送过来。

     客户端::

     1 #!/usr/bin/env python3
     2 #-*- coding:utf-8 -*-
     3 '''
     4 Administrator 
     5 2018/8/2 
     6 '''
     7 import socket,os,re
     8 
     9 sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    10 print(sck)
    11 address = ('127.0.0.1', 8000) #192.168.0.103
    12 sck.connect(address)
    13 
    14 BASE_DIR=os.path.dirname(os.path.abspath(__file__))
    15 while True:
    16     inp = input(">>>").strip()#post|kanqingzi.jpg    load|jpg
    17     if "|" in inp:
    18         cmd,path=inp.split("|")
    19 
    20         if cmd=="post":  #上传文件post|jgp
    21             path=os.path.join(BASE_DIR,path)#拼接路径
    22 
    23             filename=os.path.basename(path)#需要文件名字
    24             filesize=os.stat(path).st_size#需要文件大小
    25             #文件打包
    26             file_info="post|%s|%s"%(filename,filesize)#字符串拼接
    27             sck.sendall(bytes(file_info,"utf8"))
    28 
    29             with open(path,"rb") as f:
    30                 has_sent=0
    31                 while has_sent !=filesize:
    32                     data=f.read(1024)
    33                     sck.sendall(data)
    34                     has_sent+=len(data)
    35             print("图片%s上传成功!!!"%filename)
    36         elif cmd=="load": #下载文件 #load|././././xx.jpg  要输入图片绝对路径
    37             sck.send(inp.encode('utf-8'))
    38             data=sck.recv(1024)
    39             cmd, filename, filesize = str(data,"utf8").split("|")
    40             if cmd == "load":  # 再次确认是下载命令
    41                 path = os.path.join(BASE_DIR, "img_recv", filename)
    42                 filesize = int(filesize)
    43                 f = open(path, "wb")
    44                 get_sent = 0
    45                 while get_sent != filesize:
    46                     data_s = sck.recv(1024)
    47                     get_sent += len(data_s)
    48                     f.write(data_s)
    49                 print("接受图片%s。" % filename)
    50                 f.close()
    51 
    52 
    53     else:           # 远程操控,给服务端输入命令
    54         sck.send(inp.encode('utf-8'))
    55         result_len = int(str(sck.recv(1024), "utf-8"))  # 先接受二进制的长度
    56         # sck.send("")
    57         print(result_len)
    58 
    59         data = bytes()
    60         while len(data) != result_len:
    61             recv = sck.recv(1024)
    62             data += recv
    63         print(str(data, "gbk", errors="ignore"))
    64 
    65 sck.close()

    服务端:

     1 #!/usr/bin/env python3
     2 #-*- coding:utf-8 -*-
     3 '''
     4 Administrator 
     5 2018/8/2 
     6 '''
     7 import subprocess
     8 import socket,os
     9 
    10 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    11 print(s)
    12 address=('127.0.0.1',8000)
    13 s.bind(address)
    14 s.listen(3)
    15 print('等待...........')
    16 BASE_DIR=os.path.dirname(os.path.abspath(__file__))
    17 
    18 while True:
    19     conn, addr = s.accept()
    20     print(addr)
    21     while True:
    22 ################################接受数据  cd   post|.....  #####################################
    23         try:
    24             data = conn.recv(1024)
    25         except Exception:
    26             break
    27         if not data:
    28             conn.close()
    29             break
    30         data_l=str(data,"utf8")
    31         if "|" in data_l:
    32             if len(data_l.split("|"))==3:#切开后有三个参数
    33                 cmd,filename,filesize=data_l.split("|") #有时候两个参数,有时候三个参数
    34     ################################ 判断是下载 load 还是上传 post                 ###########################################
    35                 if cmd=="post":  #上传
    36                     path=os.path.join(BASE_DIR,"img",filename)
    37                     filesize=int(filesize)
    38                     f=open(path,"wb")
    39                     get_sent=0
    40                     while get_sent != filesize:
    41                         data_s=conn.recv(1024)
    42                         get_sent+=len(data_s)
    43                         f.write(data_s)
    44                     print("接受图片%s。"%filename)
    45                     f.close()
    46             elif len(data_l.split("|"))==2:  #下载
    47                 cmd, path = data_l.split("|")###得到load | 图片绝对路径
    48                 if cmd=="load":
    49                     filename = os.path.basename(path)  # 需要文件名字
    50                     filesize = os.stat(path).st_size  # 需要文件大小
    51                     # 文件打包
    52                     file_info = "load|%s|%s" % (filename, filesize)  # 字符串拼接
    53                     conn.sendall(bytes(file_info, "utf8"))
    54                     with open(path, "rb") as f:
    55                         has_sent = 0
    56                         while has_sent != filesize:
    57                             data = f.read(1024)
    58                             conn.sendall(data)
    59                             has_sent += len(data)
    60                     print("图片%s上传成功!!!" % filename)
    61         else:             #执行cmd命令  远程控制
    62             obj = subprocess.Popen(data_l, shell=True, stdout=subprocess.PIPE)
    63 
    64             info = obj.stdout.read()  # 取到执行后得到的结果二进制
    65             result_len = bytes(str(len(info)), "utf8")
    66             conn.send(result_len)
    67 
    68             conn.sendall(info)
    69 
    70 
    71 
    72 s.close()
  • 相关阅读:
    Lua函数
    Lua 造成的代码冗余太严重了, 这个现状怎么改善?
    Lua 造成的代码冗余太严重了, 这个现状怎么改善?
    Lua 错误处理方法
    Lua 错误处理方法
    C++引用、指针的选择
    C++引用、指针的选择
    Windows 7下VS2008升级补丁
    Windows 7下VS2008升级补丁
    天龙八部服务器端共享内存的设计(3/3)
  • 原文地址:https://www.cnblogs.com/Mengchangxin/p/9406496.html
Copyright © 2011-2022 走看看