Hướng dẫn how do you send a file to a socket in python? - làm thế nào để bạn gửi một tệp đến một ổ cắm trong python?

& nbsp; · 8 phút Đọc · Cập nhật tháng 6 năm 2022 · Thư viện tiêu chuẩn Python · 8 min read · Updated jun 2022 · Python Standard Library

Tiết lộ: Bài đăng này có thể chứa các liên kết liên kết, có nghĩa là khi bạn nhấp vào liên kết và mua hàng, chúng tôi nhận được hoa hồng.: This post may contain affiliate links, meaning when you click the links and make a purchase, we receive a commission.

Truyền tệp là quá trình sao chép hoặc di chuyển tệp từ máy tính này sang máy tính khác qua mạng hoặc kết nối Internet. Trong hướng dẫn này, chúng tôi sẽ từng bước về cách bạn có thể viết các tập lệnh Python máy khách/máy chủ xử lý điều đó.

Ý tưởng cơ bản là tạo một máy chủ lắng nghe trên một cổng cụ thể; Máy chủ này sẽ chịu trách nhiệm nhận các tệp (bạn cũng có thể tạo máy chủ gửi tệp). Mặt khác, máy khách sẽ cố gắng kết nối với máy chủ và gửi một tệp thuộc bất kỳ loại nào.

Chúng tôi sẽ sử dụng mô-đun

import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
8, được tích hợp sẵn với Python và cung cấp cho chúng tôi các hoạt động ổ cắm được sử dụng rộng rãi trên internet, vì chúng đứng sau bất kỳ kết nối nào với bất kỳ mạng nào.

Xin lưu ý rằng có nhiều cách đáng tin cậy hơn để chuyển các tệp với các công cụ như

import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
9 hoặc SCP. Tuy nhiên, mục tiêu của hướng dẫn này là chuyển các tệp bằng ngôn ngữ lập trình Python và không có bất kỳ công cụ của bên thứ ba nào.scp. However, the goal of this tutorial is to transfer files with Python programming language and without any third-party tool.

Liên quan: Cách sắp xếp các tệp bằng cách mở rộng trong Python. How to Organize Files by Extension in Python.

Đầu tiên, chúng tôi sẽ cần cài đặt thư viện

# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)
0, cho phép chúng tôi in các thanh tiến trình ưa thích:

pip3 install tqdm

Mã khách hàng

Hãy bắt đầu với máy khách, người gửi:

import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step

Chúng tôi cần chỉ định địa chỉ IP, cổng của máy chủ chúng tôi muốn kết nối và tên của tệp chúng tôi muốn gửi.

# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)

# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)
1 cần tồn tại trong thư mục hiện tại hoặc bạn có thể sử dụng một đường dẫn tuyệt đối đến tệp đó ở đâu đó trên máy tính của bạn. Đây là tệp bạn muốn gửi.

# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)
2 có được kích thước của tệp đó trong byte; Điều đó thật tuyệt, vì chúng tôi cần nó để hiển thị các thanh tiến trình trong máy khách và máy chủ.

Hãy tạo ổ cắm TCP:

# create the client socket
s = socket.socket()

Kết nối với máy chủ:

print(f"[+] Connecting to {host}:{port}")
s.connect((host, port))
print("[+] Connected.")

Phương pháp

# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)
3 hy vọng một địa chỉ của cặp
# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)
4 sẽ kết nối ổ cắm với địa chỉ từ xa đó. Khi kết nối được thiết lập, chúng tôi gửi tên và kích thước của tệp:Once the connection is established, we send the name and size of the file:

# send the filename and filesize
s.send(f"{filename}{SEPARATOR}{filesize}".encode())

Tôi đã sử dụng

# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)
5 ở đây để tách các trường dữ liệu; Nó chỉ là một tin nhắn rác, chúng ta chỉ có thể sử dụng
# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)
6 hai lần, nhưng dù sao chúng ta cũng có thể không muốn làm điều đó. Hàm
# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)
7 mã hóa chuỗi mà chúng tôi đã chuyển sang mã hóa 'UTF-8' (cần thiết).'utf-8' encoding (that's necessary).

Bây giờ chúng tôi cần gửi tệp và khi chúng tôi đang gửi tệp, chúng tôi sẽ in các thanh tiến trình đẹp bằng thư viện

# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)
0:

# start sending the file
progress = tqdm.tqdm(range(filesize), f"Sending {filename}", unit="B", unit_scale=True, unit_divisor=1024)
with open(filename, "rb") as f:
    while True:
        # read the bytes from the file
        bytes_read = f.read(BUFFER_SIZE)
        if not bytes_read:
            # file transmitting is done
            break
        # we use sendall to assure transimission in 
        # busy networks
        s.sendall(bytes_read)
        # update the progress bar
        progress.update(len(bytes_read))
# close the socket
s.close()

Về cơ bản, những gì chúng tôi đang làm ở đây là mở tệp như được đọc bằng nhị phân (

# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)
9), đọc các đoạn từ tệp (trong trường hợp này là 4096 byte hoặc 4kb) và gửi chúng đến ổ cắm bằng hàm
# create the client socket
s = socket.socket()
0, sau đó chúng tôi cập nhật Thanh tiến độ mỗi lần, sau khi kết thúc, chúng tôi đóng ổ cắm đó.4096 bytes or 4KB) and sending them to the socket using the
# create the client socket
s = socket.socket()
0 function, and then we update the progress bar each time, once that's finished, we close that socket.

Liên quan: Cách tạo ứng dụng trò chuyện trong Python. How to Make a Chat Application in Python.

Mã máy chủ

Được rồi, vì vậy chúng tôi đã hoàn thành với khách hàng. Hãy đi sâu vào máy chủ, vì vậy hãy mở một tệp Python trống mới và:Let's dive into the server, so open up a new empty Python file and:

import socket
import tqdm
import os
# device's IP address
SERVER_HOST = "0.0.0.0"
SERVER_PORT = 5001
# receive 4096 bytes each time
BUFFER_SIZE = 4096
SEPARATOR = ""

Tôi đã khởi tạo một số tham số chúng tôi sẽ sử dụng. Lưu ý rằng tôi đã sử dụng "0.0.0.0" làm địa chỉ IP máy chủ. Điều này có nghĩa là tất cả các địa chỉ IPv4 trên máy cục bộ. Bạn có thể tự hỏi tại sao chúng ta không chỉ sử dụng địa chỉ IP cục bộ hoặc "localhost" hoặc "127.0.0.1"? Chà, nếu máy chủ có hai địa chỉ IP, hãy nói "192.168.1.101" trên mạng và "10.0.1.1" trên một mạng khác và máy chủ lắng nghe trên "0.0.0.0", nó sẽ có thể truy cập được ở cả hai IP đó."0.0.0.0" as the server IP address. This means all IPv4 addresses that are on the local machine. You may wonder why we don't just use our local IP address or "localhost" or "127.0.0.1"? Well, if the server has two IP addresses, let's say "192.168.1.101" on a network and "10.0.1.1" on another, and the server listens on "0.0.0.0", it will be reachable at both of those IPs.

Ngoài ra, bạn có thể sử dụng địa chỉ IP công khai hoặc riêng tư của mình, tùy thuộc vào khách hàng của bạn. Nếu các máy khách được kết nối có trong mạng cục bộ của bạn, bạn nên sử dụng IP riêng của mình (bạn có thể kiểm tra nó bằng lệnh

# create the client socket
s = socket.socket()
1 trong lệnh Windows hoặc
# create the client socket
s = socket.socket()
2 trong Mac OS/Linux), nhưng nếu bạn đang mong đợi máy khách từ Internet, bạn chắc chắn nên Sử dụng địa chỉ công cộng của bạn.

Ngoài ra, hãy đảm bảo bạn sử dụng cùng một cổng trong máy chủ như trong máy khách.

Hãy tạo ổ cắm TCP của chúng tôi:

# create the server socket
# TCP socket
s = socket.socket()

Bây giờ, điều này khác với khách hàng; Chúng ta cần liên kết ổ cắm mà chúng ta vừa tạo với

# create the client socket
s = socket.socket()
3 và
# create the client socket
s = socket.socket()
4:

# bind the socket to our local address
s.bind((SERVER_HOST, SERVER_PORT))

Sau đó, chúng tôi sẽ lắng nghe các kết nối:

import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
0

Khi máy khách kết nối với máy chủ của chúng tôi, chúng tôi cần chấp nhận kết nối đó:

import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
1

Hãy nhớ rằng khi máy khách được kết nối, nó sẽ gửi tên và kích thước của tệp. Hãy nhận chúng:

import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
2

Như đã đề cập trước đó, dữ liệu nhận được được kết hợp với

# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)
1 và
# create the client socket
s = socket.socket()
6 và chúng ta có thể dễ dàng trích xuất chúng bằng cách chia chúng theo chuỗi
# the ip address or hostname of the server, the receiver
host = "192.168.1.101"
# the port, let's use 5001
port = 5001
# the name of file we want to send, make sure it exists
filename = "data.csv"
# get the file size
filesize = os.path.getsize(filename)
5.

Sau đó, chúng ta cần xóa đường dẫn tuyệt đối của tệp vì người gửi đã gửi tệp bằng đường dẫn tệp của riêng mình, có thể khác với chức năng

# create the client socket
s = socket.socket()
8 trả về thành phần cuối cùng của tên đường dẫn.

Bây giờ chúng ta cần nhận tệp:

import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
3

Không hoàn toàn khác với mã máy khách. Tuy nhiên, chúng tôi đang mở tệp dưới dạng ghi nhị phân (

# create the client socket
s = socket.socket()
9) tại đây và sử dụng phương thức
print(f"[+] Connecting to {host}:{port}")
s.connect((host, port))
print("[+] Connected.")
0 để nhận byte
print(f"[+] Connecting to {host}:{port}")
s.connect((host, port))
print("[+] Connected.")
1 từ ổ cắm máy khách và ghi nó vào tệp. Sau khi kết thúc, chúng tôi đóng cả ổ cắm máy khách và máy chủ.

Tìm hiểu thêm: Cách liệt kê tất cả các tệp và thư mục trong máy chủ FTP bằng Python How to List all Files and Directories in FTP Server using Python

Được rồi, hãy để tôi thử nó trên mạng riêng của mình:

import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
4

Tôi cần vào hộp Linux của mình và gửi một tệp ví dụ:

import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
5

Hãy xem máy chủ ngay bây giờ:

import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
6

Sự kết luận

Tuyệt vời, chúng tôi đã hoàn thành! Nó đang hoạt động!

Nếu bạn muốn chạy mã máy chủ trên máy từ xa chứ không phải trên mạng cục bộ, thì hãy đảm bảo bạn cho phép cổng trên tường lửa. Nếu đó là VM trong đám mây, thì hãy đảm bảo bạn cho phép nó thông qua

print(f"[+] Connecting to {host}:{port}")
s.connect((host, port))
print("[+] Connected.")
2:

import socket
import tqdm
import os

SEPARATOR = ""
BUFFER_SIZE = 4096 # send 4096 bytes each time step
7

Điều này sẽ cho tường lửa cho phép cổng đó để liên lạc từ xa. Nếu máy chủ ở trong nhà của bạn, thì bạn cần bật cổng trên cài đặt bộ định tuyến của bạn.

Bạn có thể mở rộng mã này cho nhu cầu của riêng bạn ngay bây giờ. Dưới đây là một số ví dụ bạn có thể thực hiện:

  • Cho phép máy chủ nhận được nhiều tệp từ nhiều máy khách đồng thời & nbsp; sử dụng các luồng.
  • Nén các tệp & nbsp; trước khi gửi chúng có thể giúp tăng thời gian chuyển. Nếu các tệp đích bạn muốn gửi là hình ảnh, bạn có thể & nbsp; tối ưu hóa hình ảnh bằng cách nén chúng hoặc nếu chúng là tài liệu PDF, bạn cũng có thể & NBSP; nén các tệp PDF.
  • Mã hóa tệp & nbsp; trước khi gửi nó để đảm bảo rằng không ai có thể chặn và đọc tệp đó, điều này & nbsp; Hướng dẫn & nbsp; sẽ giúp đỡ.
  • Đảm bảo tệp được gửi một cách thích hợp bằng cách kiểm tra tổng kiểm tra của cả hai tệp (tệp gốc của người gửi và tệp đã gửi trong máy thu). Trong trường hợp này, bạn cần & nbsp; Thuật toán băm an toàn & nbsp; để làm điều đó.
  • Thêm một phòng trò chuyện & nbsp; để bạn có thể trò chuyện và chuyển tệp.

Cuối cùng, nếu bạn là người mới bắt đầu và muốn học Python, tôi khuyên bạn nên tham gia khóa học Python cho mọi người Coursera, trong đó bạn sẽ học được rất nhiều về Python, chúc may mắn!

Đọc thêm: & nbsp; Cách thao tác địa chỉ IP trong Python. How to Manipulate IP Addresses in Python.

Happy Coding ♥

Xem đầy đủ mã


Cũng đọc


Hướng dẫn how do you send a file to a socket in python? - làm thế nào để bạn gửi một tệp đến một ổ cắm trong python?

Hướng dẫn how do you send a file to a socket in python? - làm thế nào để bạn gửi một tệp đến một ổ cắm trong python?


Bảng bình luận

Làm cách nào để gửi tệp qua ổ cắm?

Server..
Bắt đầu chương trình ..
Tuyên bố các biến và cấu trúc cần thiết ..
Ổ cắm được tạo bằng hàm ổ cắm ..
Ổ cắm được đặt vào cổng cụ thể ..
Bắt đầu lắng nghe các kết nối ..
Chấp nhận kết nối từ máy khách ..
Tạo một tệp mới ..
Nhận dữ liệu từ máy khách ..

Làm thế nào để bạn gửi các tệp trong Python?

Cách tiếp cận từng bước:..
Cài đặt các phụ thuộc bằng cách sử dụng Cài đặt PIP tại dòng lệnh ..
Nhập các mô -đun cần thiết: HTTP.Máy chủ và Socketserver: Để lưu trữ trong trình duyệt.....
Gán cổng và tên của người dùng ..
Tìm địa chỉ IP của PC và chuyển đổi nó thành mã QR ..
Tạo yêu cầu HTTP ..
Hiển thị mã QR trong trình duyệt ..

Làm cách nào để gửi các tệp từ máy chủ đến máy khách trong Python?

Hàm gửi () sẽ được sử dụng để gửi dữ liệu.3: Sau khi máy chủ gửi dữ liệu, bây giờ chúng tôi tạo một chức năng ở phía máy khách chấp nhận dữ liệu và sẽ tải dữ liệu đó vào thư mục cụ thể của máy khách.

Làm cách nào để gửi tệp từ máy chủ đến máy khách?

Dữ liệu tệp cần lưu trữ trong mảng với định dạng byte thô để gửi chúng cho máy khách.Với chuỗi tên tệp dữ liệu Chuỗi kích thước tại ban đầu của dữ liệu tệp.Điều này được xác định trước giữa máy khách và máy chủ và nó cần làm, nếu không, máy khách sẽ không nhận được tên tệp đang gửi bởi máy chủ.. With data file name size string at initial of file data. This is predefined between client and server and it needs to do, otherwise client will not get file name which is sending by server.