说明
本程序的设计是为了实现客户端发图片,服务器进行图片接收,然后调用程序进行处理,并返回的功能,但在做的过程中,涉及的线程和socket库方面,了解的并不是很透彻,所以在进行程序编写的时候,免不了会有一些比较粗浅多余的地方。
客户端
import socket
import os
client = socket.socket() # 声明socket类型,同时生成socket连接对象
client.connect(('127.0.0.1', 666)) # 链接服务器的ip + 端口
while True:
bpath = 'C:/Users/Desktop/中心点检测'
files = os.listdir(bpath)
for i in files:
img_path = os.path.join(bpath, i)
pic_size = os.stat(img_path).st_size
pic_name = i
file_info = '%s|%s' % (pic_name, pic_size)
print(file_info)
client.send(file_info.encode("utf-8"))
f = open(img_path, 'rb')
has_send = 0
while has_send != pic_size:
file = f.read(1024)
client.sendall(file)
has_send += len(file)
f.close()
data = client.recv(1024)
print(data) # 接收服务端返回的内容
filename, filesize = str(data, 'utf8').split('|') # 获得指定图像的名称,图像大小
path = os.path.join('C:/Users/Desktop/333/', filename) # 指定图像的保存路径
filesize = int(filesize) # 图像大小转换成整形
c = open(path, 'ab') # 以二进制格式打开一个文件用于追加。如果该文件不存在,创建新文件进行写入。
has_receive = 0 # 统计接收到的字节数
while has_receive != filesize:
data1 = client.recv(1024) # 一次从服务端接收1024字节的数据
c.write(data1) # 写入
has_receive += len(data1)
c.close() # 关闭文件
client.close()
服务端
import socket
import os
import threading
import time
from threading import Timer
def DUQU(dir):
file_lists = os.listdir(dir)
file_lists.sort(key=lambda fn: os.path.getmtime(dir + "\\" + fn))
return file_lists[-1]
def JIESHOU():
while True:
data = conn.recv(1024)
print(data)
filename,filesize = str(data, 'utf8').split('|')
path=os.path.join('C:/Users/Desktop/444',filename) #baocunlujing
filesize=int(filesize)
f = open (path,'ab')
has_receive=0
while has_receive != filesize:
data1 = conn.recv(1024)
f.write(data1)
has_receive += len(data1)
f.close()
#none
def FASONG(a,dir):
while True:
file_lists = os.listdir(dir)
num = len(file_lists)
if num != a:
time.sleep(1)
name=DUQU(dir)
print("cc")
img_path=os.path.join(dir,name)
pic_size=os.stat(img_path).st_size
file_info = '%s|%s' % (name, pic_size)
print(file_info)
conn.send(file_info.encode("utf-8"))
f = open(img_path,'rb')
has_send=0
while has_send != pic_size:
file = f.read(1024)
conn.sendall(file)
has_send += len(file)
f.close()
a=a+1
if __name__ == '__main__':
server = socket.socket()
server.bind(('127.0.0.1', 666))
server.listen(5)
print("sf")
conn, addr = server.accept()
dir='C:/Users/Desktop/444' #chulilujing
print("sf")
t1 = threading.Thread(target = JIESHOU, args=())
t = threading.Thread(target = FASONG,args=(0,dir))
t1.start()
t.start()
t1.join()
t.join()
在进行程序设计的时候采用的是多线程设计,对本程序再进行增添一个处理进程,然后填入一个time.sleep()即可