python修炼day29!
本文阅读时长大约为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
图片新闻
技术文库
最新活动更多
-
即日-12.26立即报名>>> 【在线会议】村田用于AR/VR设计开发解决方案
-
1月8日火热报名中>> Allegro助力汽车电气化和底盘解决方案优化在线研讨会
-
1月9日立即预约>>> 【直播】ADI电能计量方案:新一代直流表、EV充电器和S级电能表
-
即日-1.14火热报名中>> OFweek2025中国智造CIO在线峰会
-
即日-1.20限时下载>>> 爱德克(IDEC)设备及工业现场安全解决方案
-
即日-1.24立即参与>>> 【限时免费】安森美:Treo 平台带来出色的精密模拟
推荐专题
发表评论
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论