成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

python實現(xiàn)客戶端和服務器端傳輸圖片

Reducto / 3015人閱讀

摘要:剛開始在參考網(wǎng)上的代碼時出現(xiàn)了各種錯誤,其中在調試時一直出現(xiàn)接收到的圖片數(shù)據(jù)丟失,打不開圖片,弄懂的壓縮格式之后,發(fā)現(xiàn)是因為參數(shù)設置的問題,原來是,其中是長整型,超出范圍的話接收到的圖片數(shù)據(jù)就丟失,故改為之后范圍變大,能夠正常接收圖片。

問題:以windows作為客戶端,linux作為服務器端,進行傳輸圖片


程序:
"""
Fuction:客戶端發(fā)送圖片和數(shù)據(jù)
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))  #服務器和客戶端在不同的系統(tǒng)或不同的主機下時使用的ip和端口,首先要查看服務器所在的系統(tǒng)網(wǎng)卡的ip
            # s.connect(("127.0.0.1", 6666))  #服務器和客戶端都在一個系統(tǒng)下時使用的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")  #打開要傳輸?shù)膱D片
        while True:
            data = fp.read(1024) #讀入圖片數(shù)據(jù)
            if not data:
                print("{0} send over...".format(filepath))
                break
            s.send(data)  #以二進制格式發(fā)送圖片數(shù)據(jù)
        s.close()
        # break    #循環(huán)發(fā)送
   
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))  #查看發(fā)送端的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)  #在服務器端新建圖片名(可以不用新建的,直接用原來的也行,只要客戶端和服務器不是同一個系統(tǒng)或接收到的圖片和原圖片不在一個文件夾下)

            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)  #寫入圖片數(shù)據(jù)
            fp.close()
        sock.close()
        break
        
if __name__ == "__main__":
    socket_service_image()

運行結果:
服務器端:

客戶端:

補充說明:
1.首先在linux系統(tǒng)下運行server.py(python server.py),然后在windows python 終端下運行client.py,在終端輸入當前目錄下要傳輸?shù)膱D片名,即heat.jpg,可以看到在服務器的路徑下出現(xiàn)了new_heat.jpg圖片文件,證明文件傳輸成功。
2.剛開始在參考網(wǎng)上的代碼時出現(xiàn)了各種錯誤,其中在調試時一直出現(xiàn)接收到的圖片數(shù)據(jù)丟失,打不開圖片,弄懂struct.pack的壓縮格式之后,發(fā)現(xiàn)是因為參數(shù)設置的問題,原來是128sl,其中l(wèi)是長整型,超出范圍的話接收到的圖片數(shù)據(jù)就丟失,故改為q之后范圍變大,能夠正常接收圖片。下圖是struct.pack的壓縮格式和數(shù)據(jù)范圍對應表:


聲明:該圖表來自https://blog.csdn.net/u011006...

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/42402.html

相關文章

發(fā)表評論

0條評論

閱讀需要支付1元查看
<