我是靠谱客的博主 英俊帆布鞋,最近开发中收集的这篇文章主要介绍python实现socket互传json文件,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

项目需要,在借鉴他人已有代码的基础上实现了用python和socket互传json文件,注意是轮流发送文件。特点是两端均既为服务端也为客户端,建立了两个信道,均可执行向对方发送指令。

好处是两者平权,己方文件生成后进行发送,主动给出发送命令。

主要借鉴的代码如下,如有任何问题,请与我联系。
链接: https://www.cnblogs.com/LyShark/p/11317152.html

先发送的一方:

import socket
import os
import json
import time
def main():
bool = 0
# bool值用来定义处于发送状态还是接收状态,这里是先发送
count = 0
# 用于计数命名文件
while True:
if bool == 0:
# 客户端
print('waiting for file...')
ip_addr = ("192.168.1.114", 9990)
# 客户端绑定另一个电脑的ipv4地址,端口可换1024到50000以内的值
client = socket.socket()
client.connect(ip_addr)
def file_put(filedir):
if os.path.isfile(filedir):
file_name = filedir
# 指定文件名称
file_size = os.stat(file_name).st_size
# 计算文件大小
file_msg = {"action": "put", "name": file_name, "size": file_size}
# 构建一个json文件
client.send(bytes(json.dumps(file_msg), encoding="utf-8"))
# 发送传输需要的数据
print("文件名: %s --> 文件大小: %s " % (file_name, file_size))
with open(file_name, "rb") as f:
for line in f:
client.send(line)
print("文件已发送: %s" % len(line))
print("文件发送完成...")
if os.path.exists('state%s.json' % count):
# 检测当前文件夹下是否存在该文件
file_put('state%s.json' % count)
# 调用函数,传输文件
count += 1
bool = 1
else:
time.sleep(1)
# 如果文件不存在,等1s进行下次检测
elif bool == 1:
# 服务端
print('listening...')
ip_addr = ("192.168.1.165", 8888)
# 绑定本地ipv4地址
server = socket.socket()
server.bind(ip_addr)
server.listen(5)
# 连接队列长度,不用管
while True:
# 尝试接收,如果失败则重试
try:
conn, addr = server.accept()
file_msg = conn.recv(20480)
# 这个长度可以改为1024,和下面同时改
msg_data = json.loads(file_msg.decode('utf-8'))
# 注意编解码方式相同
if msg_data.get("action") == "put":
# 是PUT则执行上传
file_name = msg_data.get("name")
file_size = msg_data.get("size")
recv_size = 0
with open(file_name, "wb") as f:
while recv_size != file_size:
data = conn.recv(20480)
f.write(data)
recv_size += len(data)
print("文件大小: %s 传输大小: %s" % (file_size, recv_size))
print("文件 %s 传输成功..." % file_size)
bool = 0
break
except:
pass
if __name__ == '__main__':
main()

先接收的一方

import socket
import os
import json
import time
def main():
bool = 1
# bool值用来翻转客户端和服务端
count = 0
while True:
if bool == 0:
# 客户端
print('waiting...')
ip_addr = ("192.168.1.165", 8888)
# 两台电脑互换地址
client = socket.socket()
client.connect(ip_addr)
def file_put(filedir):
if os.path.isfile(filedir):
file_name = filedir
# 指定文件名称
file_size = os.stat(file_name).st_size
# 计算文件大小
file_msg = {"action": "put", "name": file_name, "size": file_size}
# 构建一个json文件
client.send(bytes(json.dumps(file_msg), encoding="utf-8"))
# 发送传输需要的数据
print("文件名: %s --> 文件大小: %s " % (file_name, file_size))
with open(file_name, "rb") as f:
for line in f:
client.send(line)
print("文件已发送: %s" % len(line))
print("文件发送完成...")
if os.path.exists('action%s.json' % count):
file_put('action%s.json' % count)
# 调用函数,传输文件
count += 1
bool = 1
else:
time.sleep(1)
elif bool == 1:
# 服务端
print('began listening...')
ip_addr = ("192.168.1.114", 9990)
server = socket.socket()
server.bind(ip_addr)
server.listen(5)
while True:
try:
conn, addr = server.accept()
file_msg = conn.recv(1024)
msg_data = json.loads(file_msg.decode('utf-8'))
if msg_data.get("action") == "put":
# 是PUT则执行上传
file_name = msg_data.get("name")
file_size = msg_data.get("size")
recv_size = 0
with open(file_name, "wb") as f:
while recv_size != file_size:
data = conn.recv(1024)
f.write(data)
recv_size += len(data)
print("文件大小: %s 传输大小: %s" % (file_size, recv_size))
print("文件 %s 传输成功..." % file_size)
bool = 0
break
except:
pass
if __name__ == '__main__':
main()

这是我第一篇技术博客啦,好开心好开心,继续加油~~~!

最后

以上就是英俊帆布鞋为你收集整理的python实现socket互传json文件的全部内容,希望文章能够帮你解决python实现socket互传json文件所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部