• 发文
  • 评论
  • 微博
  • 空间
  • 微信

python修炼 - TCP 文件下载、线程

QYFabc 2019-02-19 08:57 发文





本文阅读时长大约为7分钟。


今日内容概述:

TCP 文件下载、线程




今日思维导图





TCP 文件下载代码


tcp客户端


import socket


def main():
   # 创建套接字 
   client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

   # 链接服务器
   client_socket.connect(("192.168.xxx.xxx", 8080))

   # 发送要下载的文件名
   file_name = input("请输入要下载的文件名:")
   client_socket.send(file_name.encode("utf-8"))

   # 接收数据并保存
   recv_data = client_socket.recv(1024 * 1024)

   # 判断是否有数据,如果有就进行保存,没有就就进行提示
   # "wb" 是以字节模式进行写入,软件会对字节进行解码
   if recv_data:
       with open("new_%s" % file_name, "wb") as f:
           f.write(recv_data)
           print("文件下载成功")
   else:
       print("文件下载失败")

   # 关闭套接字
   client_socket.close()


if __name__ == "__main__":
   main()



tcp服务器


import socket


def send_file_content(client_socket, client_addr):
   # 接收服务器发送过来的文件,
   # 进行判断有没有这个文件,如果有就打开文件并读取
   recv_file_name = client_socket.recv(1024).decode("utf-8")

   print("客户端 %s 要下载的文件是 %s" % (client_addr, recv_file_name))
   file_content = None

   # 把文件的内容发送给客户端
   # 进行异常判断,出现异常就进行提示
   try:
       f = open(recv_file_name, "rb")
       file_content = f.read()
       f.close()
   except Exception as result:
       # print(result)
       print("没有要下载的 %s 这个文件" % recv_file_name)

   # 判断是否有数据,如果有数据,就进行发送
   if file_content:
       client_socket.send(file_content)
       print("文件传输成功")


def main():
   # 创建套接字
   server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

   # 绑定本地信息
   server_socket.bind(("", 8080))

   # 监听
   server_socket.listen(128)

   while True:
       # 等待链接
       client_socket, client_addr = server_socket.accept()

       # 调用发送文件数据的函数
       send_file_content(client_socket, client_addr)

       # 关闭两个套接字
       client_socket.close()
       
   server_socket.close()


if __name__ == "__main__":
   main()



执行结果




在这里碰见一个问题:

    Linux 中客户端的代码可以和别人 Windows 中服务器的代码可以链接,但是无法下载, 不知道是因为系统是原因还是什么其他原因。






线程练习代码


简单的多任务线程


import threading
import time


def sing():
   """唱歌"""
   for i in range(5):
       print("---正在唱歌----")
       time.sleep(1)


def dance():
   """跳舞"""
   for i in range(5):
       print("---正在跳舞---")
       time.sleep(1)


def main():
   # 创建对象
   t1 = threading.Thread(target=sing)
   t2 = threading.Thread(target=dance)

   # 启动子线程
   t1.start()
   t2.start()


if __name__ == '__main__':
   main()



多任务——继承



import threading

"""由继承来实现多任务"""


class MyThread(threading.Thread):

   def __init__(self, num):  # 重写父类方法
       super().__init__()
       self.num = num

   def run(self):   # 重写父类方法
       for i in range(self.num):
           print(i)


if __name__ == '__main__':
   t1 = MyThread(10)
   t1.start()  # 调用父类中的start方法会创建一个子线程, 子线程会自动调用子类中的run方法




互斥锁解决资源竞争问题


import threading
import time

# 新建全局变量
gl_nums = 0

# 新建锁
# 使用锁来解决资源竞争问题
mutex = threading.Lock()


def test1(num):
   global gl_nums
   for i in range(num):
       # 上锁
       mutex.acquire()
       gl_nums += 1
       # 解锁
       mutex.release()
   print("----test1  %d----" % gl_nums)


def test2(num):
   global gl_nums
   for i in range(num):
       # 上锁
       mutex.acquire()
       gl_nums += 1
       # 解锁
       mutex.release()
   print("----test2  %d----" % gl_nums)


def main():
   t1 = threading.Thread(target=test1, args=(1000000,))
   t2 = threading.Thread(target=test2, args=(1000000,))

   t1.start()
   t2.start()

   time.sleep(2)
   print("---main  %d----" % gl_nums)


if __name__ == '__main__':
   main()



线程听了个迷迷糊糊,把代码多敲几遍吧。。。





刚才吃完饭回来抽空研究了一下如何翻墙,嗯,折腾了一会,成功翻了出去,一直听说墙外的世界很精彩,终于可以一睹真面目了。。。


对于如何翻墙感兴趣的可以联系我。






最近的进度有点快,有点跟不上,需要加倍努力!



加油!!!



END



         







声明:本文为OFweek维科号作者发布,不代表OFweek维科号立场。如有侵权或其他问题,请及时联系我们举报。
2
评论

评论

    相关阅读

    暂无数据

    QYFabc

    python 学习分享...

    举报文章问题

    ×
    • 营销广告
    • 重复、旧闻
    • 格式问题
    • 低俗
    • 标题夸张
    • 与事实不符
    • 疑似抄袭
    • 我有话要说
    确定 取消

    举报评论问题

    ×
    • 淫秽色情
    • 营销广告
    • 恶意攻击谩骂
    • 我要吐槽
    确定 取消

    用户登录×

    请输入用户名/手机/邮箱

    请输入密码