中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python實現同一局域網下傳輸圖片

發布時間:2020-09-15 11:59:19 來源:腳本之家 閱讀:187 作者:肥宅_Sean 欄目:開發技術

簡述

Python可以通過網絡套接字來進行傳輸圖片
這點還是比較有意思的。

下面用TCP來進行實現,適用于Python3

代碼功能簡述

下面代碼

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

代碼

【后附解析】

Sender.py (發送者)

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()

解析:

發送者代碼:

還是先創建TCP套接字,并發起連接:

具體代碼如下:

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循環中,就開始進行圖片發送

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

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

接受端:

還是一樣,先創建套接字(不過這個需要綁定對應的ip以及端口)
具體代碼如下:(這里寫的是監聽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)

之后就進入到循環,來判斷,是否獲取到sock對象,這里是會進入阻塞狀態的。

deal_data中就開始通過連接的對象來獲取數據。

一樣,還是一個無限循環,但其實本質上還是空的。。。沒什么特別的。

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

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

之后的recvd_size,其實就是為了來計數的標簽
之后就不斷地收,邊收邊寫入文件,一直到收完了之后。就關閉掉對應的文件流
最后關閉套接字,退出循環

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

托里县| 六枝特区| 剑川县| 湖南省| 晴隆县| 元谋县| 增城市| 恩平市| 磐安县| 浪卡子县| 富宁县| 安仁县| 维西| 远安县| 尚义县| 浙江省| 万宁市| 会宁县| 五华县| 新野县| 邹平县| 安陆市| 德庆县| 丘北县| 马关县| 溆浦县| 尼玛县| 普格县| 东至县| 当涂县| 印江| 贵港市| 芜湖市| 门源| 当阳市| 保靖县| 肃宁县| 鄂州市| 内丘县| 马鞍山市| 兰州市|