python socket发送图片_python实现客户端和服务器端传输图片

问题:以windows作为客户端,linux作为服务器端,进行传输图片

程序:

'''

Fuction:客户端发送图片和数据

Date:2018.9.8

Author:snowking

'''

###客户端client.py

import socket

import os

import sys

import struct

def sock_client_image():

while True:

try:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect(('服务器的ip', 6666)) #服务器和客户端在不同的系统或不同的主机下时使用的ip和端口,首先要查看服务器所在的系统网卡的ip

# s.connect(('127.0.0.1', 6666)) #服务器和客户端都在一个系统下时使用的ip和端口

except socket.error as msg:

print(msg)

print(sys.exit(1))

filepath = input('input the file: ') #输入当前目录下的图片名 xxx.jpg

fhead = struct.pack(b'128sq', bytes(os.path.basename(filepath), encoding='utf-8'), os.stat(filepath).st_size) #将xxx.jpg以128sq的格式打包

s.send(fhead)

fp = open(filepath, 'rb') #打开要传输的图片

while True:

data = fp.read(1024) #读入图片数据

if not data:

print('{0} send over...'.format(filepath))

break

s.send(data) #以二进制格式发送图片数据

s.close()

# break #循环发送

if __name__ == '__main__':

sock_client_image()

###服务器端server.py

import socket

import os

import sys

import struct

def socket_service_image():

try:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# s.bind(('127.0.0.1', 6666))

s.bind(('服务器的ip', 6666))

s.listen(10)

except socket.error as msg:

print(msg)

sys.exit(1)

print("Wait for Connection.....................")

while True:

sock, addr = s.accept() #addr是一个元组(ip,port)

deal_image(sock, addr)

def deal_image(sock, addr):

print("Accept connection from {0}".format(addr)) #查看发送端的ip和端口

while True:

fileinfo_size = struct.calcsize('128sq')

buf = sock.recv(fileinfo_size) #接收图片名

if buf:

filename, filesize = struct.unpack('128sq', buf)

fn = filename.decode().strip('\x00')

new_filename = os.path.join('./', 'new_' + fn) #在服务器端新建图片名(可以不用新建的,直接用原来的也行,只要客户端和服务器不是同一个系统或接收到的图片和原图片不在一个文件夹下)

recvd_size = 0

fp = open(new_filename, 'wb')

while not recvd_size == filesize:

if filesize - recvd_size > 1024:

data = sock.recv(1024)

recvd_size += len(data)

else:

data = sock.recv(1024)

recvd_size = filesize

fp.write(data) #写入图片数据

fp.close()

sock.close()

break

if __name__ == '__main__':

socket_service_image()

运行结果:

服务器端:

bVbgCDv?w=744&h=212

客户端:

bVbgCCB?w=313&h=91

补充说明:

1.首先在linux系统下运行server.py(python server.py),然后在windows python 终端下运行client.py,在终端输入当前目录下要传输的图片名,即heat.jpg,可以看到在服务器的路径下出现了new_heat.jpg图片文件,证明文件传输成功。

2.刚开始在参考网上的代码时出现了各种错误,其中在调试时一直出现接收到的图片数据丢失,打不开图片,弄懂struct.pack的压缩格式之后,发现是因为参数设置的问题,原来是128sl,其中l是长整型,超出范围的话接收到的图片数据就丢失,故改为q之后范围变大,能够正常接收图片。下图是struct.pack的压缩格式和数据范围对应表:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值