python的socket网口实现图片主机之间的通信

说明

本程序的设计是为了实现客户端发图片,服务器进行图片接收,然后调用程序进行处理,并返回的功能,但在做的过程中,涉及的线程和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()即可

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值