侵权投诉
订阅
纠错
加入自媒体

python修炼day29!

2019-02-19 09:47
QYFabc
关注

本文阅读时长大约为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立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

电子工程 猎头职位 更多
扫码关注公众号
OFweek电子工程网
获取更多精彩内容
文章纠错
x
*文字标题:
*纠错内容:
联系邮箱:
*验 证 码:

粤公网安备 44030502002758号