最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實現(xiàn)同一局域網(wǎng)下傳輸圖片

 更新時間:2020年03月20日 15:52:38   作者:肥宅_Sean  
這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)同一局域網(wǎng)下傳輸圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

簡述

Python可以通過網(wǎng)絡(luò)套接字來進(jìn)行傳輸圖片
這點還是比較有意思的。

下面用TCP來進(jìn)行實現(xiàn),適用于Python3

代碼功能簡述

下面代碼

  • 實現(xiàn)了在一個電腦上發(fā)送圖片(Sender)
  • 實現(xiàn)了在另外一個電腦(也可以是同一個電腦上的不同端口)接受圖片(Reciever)
  • 只發(fā)一次,然后只收一次
  • 新圖片會在舊圖片上多一個 “new_”前綴
  • 必須要先開接受者代碼才行,之后再啟動發(fā)送者代碼(不然發(fā)送者代碼會直接被拒絕)
  • 下面是固定了在一個電腦上(看ip地址,下面寫的是127.0.0.1,如果是其他電腦就寫其他電腦上的ip地址)
  • 另外本程序只能在同一個局域網(wǎng)下使用(就算是廣域網(wǎng)上,那就必須要使用廣域網(wǎng)的ip地址)

代碼

【后附解析】

Sender.py (發(fā)送者)

import socket
import os
import sys
import struct


def sock_client():
  try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('127.0.0.1', 6666))
  except socket.error as msg:
    print(msg)
    print(sys.exit(1))

  while True:
    filepath = input('input the file: ')
    # filepath = 'test.png'
    fhead = struct.pack(b'128sl', bytes(os.path.basename(filepath), encoding='utf-8'), os.stat(filepath).st_size)
    s.send(fhead)
    print('client filepath: {0}'.format(filepath))

    fp = open(filepath, 'rb')
    while 1:
      data = fp.read(1024)
      if not data:
        print('{0} file send over...'.format(filepath))
        break
      s.send(data)
    s.close()
    break


if __name__ == '__main__':
  sock_client()

Reciever.py (接受者)

import socket
import os
import sys
import struct


def socket_service():
  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.listen(10)
  except socket.error as msg:
    print(msg)
    sys.exit(1)

  print("Wait")

  while True:
    sock, addr = s.accept()
    deal_data(sock, addr)
    break
  s.close()


def deal_data(sock, addr):
  print("Accept connection from {0}".format(addr))

  while True:
    fileinfo_size = struct.calcsize('128sl')
    buf = sock.recv(fileinfo_size)
    if buf:
      filename, filesize = struct.unpack('128sl', 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()

解析:

發(fā)送者代碼:

還是先創(chuàng)建TCP套接字,并發(fā)起連接:

具體代碼如下:

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('127.0.0.1', 6666))
  except socket.error as msg:
    print(msg)
    print(sys.exit(1))

接下來的While循環(huán)中,就開始進(jìn)行圖片發(fā)送

  • 通過struct庫進(jìn)行打包,然后再用套接字來發(fā)送
  • 注意:網(wǎng)絡(luò)上的有些代碼是不能直接用的,比如在這里,就需要把str變成bytes
  • 通過os庫來獲取文件的基本名(這個是為了避免有些文件中包含具體路徑)
  • 通過os庫來獲取文件的大?。ㄍㄟ^文件狀態(tài)中關(guān)于大小的描述中獲取到)
fhead = struct.pack(b'128sl', bytes(os.path.basename(filepath), encoding='utf-8'), os.stat(filepath).st_size)
s.send(fhead)

之后再通過二進(jìn)制方式來獲取文件。
然后再發(fā)送出去,每次發(fā)送固定長度的數(shù)據(jù)。先讀,再判斷是否為空,再發(fā)送。

接受端:

還是一樣,先創(chuàng)建套接字(不過這個需要綁定對應(yīng)的ip以及端口)
具體代碼如下:(這里寫的是監(jiān)聽10個套接字對象,但是在我們代碼中并沒喲用到)

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.listen(10)
  except socket.error as msg:
    print(msg)
    sys.exit(1)

之后就進(jìn)入到循環(huán),來判斷,是否獲取到sock對象,這里是會進(jìn)入阻塞狀態(tài)的。

deal_data中就開始通過連接的對象來獲取數(shù)據(jù)。

一樣,還是一個無限循環(huán),但其實本質(zhì)上還是空的。。。沒什么特別的。

之后就是對于傳過來的文件名處理一下,這里的這些“128sl”,其實就是一個大小規(guī)模(類似于打包的箱子大小的樣子)。然后就是得到新的文件名了。
對應(yīng)的代碼如下:

filename, filesize = struct.unpack('128sl', buf)
fn = filename.decode().strip('\x00')
new_filename = os.path.join('./', 'new_' + fn)

之后的recvd_size,其實就是為了來計數(shù)的標(biāo)簽
之后就不斷地收,邊收邊寫入文件,一直到收完了之后。就關(guān)閉掉對應(yīng)的文件流
最后關(guān)閉套接字,退出循環(huán)

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python自動化定位的9種函數(shù)方法小結(jié)

    python自動化定位的9種函數(shù)方法小結(jié)

    對于python進(jìn)行自動化定位有9種方法,這篇文章主要來和大家聊聊這9種方法的具體使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2024-11-11
  • python性能測試工具locust的使用

    python性能測試工具locust的使用

    這篇文章主要介紹了python性能測試工具locust的使用,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • Python裝飾器基礎(chǔ)詳解

    Python裝飾器基礎(chǔ)詳解

    裝飾器(decorator)是一種高級Python語法。裝飾器可以對一個函數(shù)、方法或者類進(jìn)行加工。接下來通過本文給大家介紹python裝飾器基礎(chǔ),對python裝飾器相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧
    2016-03-03
  • pyecharts的Tab和Legend布局詳情

    pyecharts的Tab和Legend布局詳情

    這篇文章主要介紹了pyecharts的Tab和Legend布局,pyecharts是百度開源的一款第三方繪圖模塊,結(jié)合的python語言的簡易性和Echarts的強(qiáng)大繪圖特性,可以用python對其調(diào)用,輸出交互性好,精美乖巧且符合審美的圖表,下文我們就來學(xué)習(xí)pyecharts的Tab和Legend煩人布局布局
    2022-03-03
  • python+openCV利用攝像頭實現(xiàn)人員活動檢測

    python+openCV利用攝像頭實現(xiàn)人員活動檢測

    這篇文章主要為大家詳細(xì)介紹了python+openCV利用攝像頭實現(xiàn)人員活動檢測,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • django中cookiecutter的使用教程

    django中cookiecutter的使用教程

    這篇文章主要給大家介紹了關(guān)于django中cookiecutter使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Python Pingouin數(shù)據(jù)統(tǒng)計分析技術(shù)探索

    Python Pingouin數(shù)據(jù)統(tǒng)計分析技術(shù)探索

    Pingouin庫基于pandas、scipy和statsmodels,為用戶提供了執(zhí)行常見統(tǒng)計分析的功能,它支持各種統(tǒng)計方法和假設(shè)檢驗,例如 t-tests、ANOVA、correlation analysis 等,本文通過一些示例代碼,以更全面地了解如何使用Pingouin庫進(jìn)行統(tǒng)計分析,
    2024-01-01
  • python 如何使用find和find_all爬蟲、找文本的實現(xiàn)

    python 如何使用find和find_all爬蟲、找文本的實現(xiàn)

    這篇文章主要介紹了python 如何使用find和find_all,爬蟲、找文本,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Selenium定位元素操作示例

    Selenium定位元素操作示例

    這篇文章主要介紹了Selenium定位元素操作,結(jié)合實例形式總結(jié)分析了Selenium通過ID、name、XPath、標(biāo)簽名稱、類名等進(jìn)行元素定位操作的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2018-08-08
  • python實現(xiàn)二分查找算法

    python實現(xiàn)二分查找算法

    這篇文章主要介紹了python如何實現(xiàn)二分查找算法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下。
    2020-09-09

最新評論

鞍山市| 永年县| 宽城| 若羌县| 铜鼓县| 鄂托克前旗| 西贡区| 抚州市| 东港市| 灵石县| 阿鲁科尔沁旗| 清新县| 衡南县| 梨树县| 台东县| 鄢陵县| 淳安县| 涿鹿县| 雷州市| 安乡县| 平舆县| 蓝山县| 常德市| 麻阳| 林周县| 虹口区| 砚山县| 神农架林区| 武平县| 拉孜县| 柳河县| 永兴县| 师宗县| 柳州市| 巴马| 富裕县| 泸溪县| 广河县| 瑞丽市| 抚顺县| 建德市|