Gửi chuyển tệp qua cổng Python

Python Socket File Transfer Send



Mục đích của bài viết này là để tìm hiểu cách chuyển một tệp văn bản qua mạng thông qua chương trình python . Việc truyền tệp này dựa trên mô hình máy khách máy chủ để sử dụng lập trình ổ cắm trong python3 +.

Đây là sơ đồ thiết lập cơ bản để chạy chương trình này.









Để đơn giản, chúng ta sẽ gọi Hệ thống A là A_client và Hệ thống B là B_server trong suốt bài viết.



Yêu cầu về tệp:

Chúng tôi cần server.py và tập tin này phải có tại hệ thống máy chủ. Trong trường hợp của chúng tôi, server.py phải ở hệ thống B_server.





Hai tệp khác client.pysample.txt nên có mặt tại hệ thống khách hàng. Trong trường hợp của chúng tôi, hai tệp đó phải có trong hệ thống A_client.

Các giả định:

Dưới đây là các giả định:



  • Chúng ta nên có hai hệ thống Linux có quyền truy cập đầu cuối.
  • Hương vị Linux ưa thích là Ubuntu .
  • Python3 nên được cài đặt.
  • Cả hai hệ thống Linux đều có thể ping lẫn nhau. Sử dụng ping lệnh để kiểm tra ping.
  • Một hệ thống sẽ hoạt động như một Máy chủ và một hệ thống khác sẽ hoạt động như một máy khách tại một thời điểm cụ thể.

Hạn chế:

Trước khi tiếp tục, chúng ta nên biết rằng có một số hạn chế của chương trình này.

  • Python3 + nên được cài đặt để chạy chương trình này. Bạn có thể thấy lỗi hoặc hành vi khác nếu chạy trên phiên bản cũ hơn của python.
  • Tính đến thời điểm hiện tại, chỉ có thể chuyển tệp văn bản thông qua chương trình này. Bất kỳ tệp định dạng nào khác không chứa văn bản đều có thể bị lỗi.
  • Các ngoại lệ lập trình cơ bản đã được xử lý trong chương trình.
  • Chương trình có thể chạy hoặc không trên hệ điều hành khác ngoài Ubuntu.
  • Tệp văn bản phải ngắn ở phía máy khách vì kích thước bộ đệm 1024 byte đã được sử dụng.

Yêu cầu thiết lập:

  • Chúng tôi cần ít nhất một hệ thống Linux để dùng thử chương trình này. Nhưng khuyến nghị là sử dụng hai hệ thống Linux khác nhau được kết nối qua mạng.
  • Hai hệ thống phải được kết nối thông qua Ethernet hoặc Wi-Fi hoặc bất kỳ kết nối nào khác.

Mã nguồn máy chủ:

https://github.com/linuxhintcode/websamples/blob/master/python_send_file/server.py

Mã nguồn khách hàng:

https://github.com/linuxhintcode/websamples/blob/master/python_send_file/client.py

Cách chạy chương trình và đầu ra mong đợi:

Dưới đây là các bước để thực thi chương trình.

Bước 1: Vào hệ thống B_server và mở một thiết bị đầu cuối. Đường tắt để mở một thiết bị đầu cuối là Alt + Ctrl + t.

Bước 2: Bây giờ đi đến đường dẫn nơi server.py hiện diện.

Bước3: Bây giờ chạy server.py như bên dưới

máy chủ python3.py

Không được có bất kỳ lỗi nào và bạn sẽ thấy các bản in bên dưới

Máy chủ được liệt kê trên cổng: 9898

Tên tệp đã sao chép sẽ là recv.txt ở phía máy chủ

Bước 4: Bây giờ mở thiết bị đầu cuối tại hệ thống A_client.

Bước 5: Đi tới đường dẫn có client.py và sample.txt.

Bước6: Bây giờ chạy client.py như bên dưới

ứng dụng khách python3.py <B_server hệ thống IP>

Chúng tôi nhận thấy rằng chúng tôi cần biết địa chỉ IP của máy chủ. Chúng ta có thể thực hiện lệnh dưới đây để biết địa chỉ IP của hệ thống B_server.

ifconfig

Bây giờ đầu ra của hệ thống A_client sẽ như thế này

################### Thông báo dưới đây được nhận từ máy chủ ###################
| --------------------------------- |
Chào khách hàng[Địa chỉ IP: 192.168.1.102],
** Chào mừng đến với Máy chủ **
-Người phục vụ
| --------------------------------- |

Bước 7: Bây giờ đi tới B_server và tìm đầu ra bên dưới

Tệp đã được sao chép thành công
Máy chủ đã đóng kết nối

Bước 8: Nên có một tên tệp recv.txt tại thư mục máy chủ. Nội dung của recv.txt này phải giống như sample.txt.

Như vậy là chúng ta đã sao chép thành công một tập tin từ máy khách sang máy chủ qua mạng thông qua chương trình python.

Giải thích mã:

Có hai tệp python server.pyclient.py .

Lưu ý rằng chúng tôi sẽ giải thích một lần nếu bất kỳ mã nào giống nhau bên trong server.py và client.py.

  1. server.py:
#! / usr / bin / env python3

Đây là dòng shebang có nghĩa là theo mặc định, server.py phải sử dụng python3. Hãy xem một lợi thế của dòng này.

Chúng tôi đã thực thi server.py hoặc client.py như con trăn3. Bây giờ không cần sử dụng python3, chúng tôi có thể thực thi tệp python. Làm theo các lệnh dưới đây

Chuyển đến chế độ người dùng cấp cao:

nó là

Cấp tất cả quyền cho tệp .py:

chmod777người phục vụ.py

Chạy server.py:

./người phục vụ.py nhập khẩu ổ cắm
Nhập khẩuổ cắmthư viện vào chương trình pythonnhưchúng ta đang đi
sử dụngổ cắm sự liên quan.

NS = ổ cắm.ổ cắm()

Chúng tôi đang tạo một đối tượng NS để truy cập tất cả các phương thức của socket. Đây là một khái niệm OOPs.

HẢI CẢNG= 9898

Bây giờ chúng ta chọn một cổng mà máy chủ sẽ lắng nghe. Chúng tôi có thể sử dụng cổng không dành riêng thay vì cổng này.

NS.trói buộc(('',HẢI CẢNG))

Chúng tôi sử dụng phương thức ràng buộc để liên kết địa chỉ ip của máy chủ với cổng đó [9898]. Một quan sát là chúng tôi có thể đã sử dụng địa chỉ IP chính xác của máy chủ thay cho đối số đầu tiên của phương thức liên kết nhưng chúng tôi chọn để trống vì điều này hoạt động tốt.

NS.trói buộc((địa chỉ IP,HẢI CẢNG))
tập tin = mở ra('recv.txt', 'wb')

Chúng tôi đã mở một tên tệp recv.txt trong máy chủ cho chế độ ghi và có con trỏ tệp. Điều này là bắt buộc vì chúng tôi phải sao chép một tệp văn bản từ máy khách.

trong khi Thật:

Hãy bắt đầu một vòng lặp while vô hạn vì công việc của máy chủ là đợi cho đến khi máy khách giao tiếp với máy chủ trên cổng 9898 đó. Vì vậy, vòng lặp while này là bắt buộc.

conn,addr=NS.Chấp nhận()

Mã này là để chấp nhận bất kỳ yêu cầu kết nối nào từ máy khách. Conn sẽ sử dụng conn giao tiếp với khách hàng và addr là địa chỉ IP của máy khách đã gửi yêu cầu náo động đến máy chủ này trên cổng 9898.

tin nhắn= ' | --------------------------------- | Xin chào khách hàng [Địa chỉ IP:
'
+ addr[0]+'], ** Chào mừng đến với Máy chủ ** -Người phục vụ
| --------------------------------- | '

Mã này là để tạo một tin nhắn để gửi cho khách hàng. Thông báo này sẽ được in trên thiết bị đầu cuối của khách hàng. Điều này xác nhận rằng máy khách có thể giao tiếp với máy chủ.

conn.gửi(tin nhắn.mã hóa())

Bây giờ chúng tôi đã có thông báo sẵn sàng và sau đó gửi nó cho khách hàng bằng cách sử dụng conn. Mã này thực sự gửi tin nhắn cho khách hàng.

RecvData=conn.recv(1024)

Mã này đang nhận bất kỳ dữ liệu nào được gửi từ phía máy khách. Trong trường hợp của chúng tôi, chúng tôi đang mong đợi nội dung của sample.txt trong RecvData .

trong khiRecvData:

Một vòng lặp while nữa với điều kiện RecvData không trống. Trong trường hợp của chúng tôi, nó không trống.

tập tin.viết(RecvData)

Khi chúng tôi có nội dung bên trong RecvData sau đó chúng tôi đang ghi vào tệp đó recv.txt sử dụng con trỏ tệp tập tin.

RecvData=conn.recv(1024)

Một lần nữa cố gắng nhận nếu có bất kỳ dữ liệu nào từ máy khách. Một lần RecvData không có dữ liệu mã sẽ phá vỡ vòng lặp while.

tập tin.gần()

Thao tác này sẽ chỉ đóng con trỏ tệp khi chúng ta hoàn tất quá trình ghi tệp.

conn.gần()

Điều này sẽ đóng kết nối với máy khách.

nghỉ

Điều này xuất hiện từ vòng lặp while vô hạn tại B_server.

  1. client.py:
nhập khẩu sys

Nhập thư viện sys như chúng ta muốn sử dụng cơ sở đối số trong python.

nếu như (len(sys.argv) > 1):
ServerIp= sys.argv[1]
khác:
in(' Chạy như python3 client.py ')
lối ra(1)

Khi chúng tôi chuyển địa chỉ IP của B_server sau tên tệp client.py trong khi chạy, chúng tôi cần bắt địa chỉ IP của máy chủ đó bên trong máy khách.

… ..If (len (sys.argv)> 1): => Để đảm bảo rằng người dùng chuyển ít nhất một đối số làm địa chỉ IP và bắt vào địa chỉ IP đó ServerIP.

Nếu người dùng không vượt qua ít nhất một mã đối số sẽ hiển thị trợ giúp và xuất phát từ mã.

HẢI CẢNG= 9898

Đây phải là cổng giống như đã đề cập ở phía B_server.

NS.liên kết((ServerIp,HẢI CẢNG))

Mã này sẽ thực hiện kết nối TCP tới IP máy chủ bằng cổng đó. Bất cứ điều gì sai ở ponint này đều dẫn đến kết nối thất bại.

tập tin = mở ra('sample.txt', 'rb')

Chúng tôi đang mở sample.txt ở chế độ đọc để chỉ đọc nội dung.

Gửi dữ liệu= tập tin.đọc(1024)

Đọc nội dung của tệp và đưa vào bên trong Gửi dữ liệu Biến đổi.

trong khiGửi dữ liệu:

Chúng tôi đang bắt đầu một vòng lặp while nếu Gửi dữ liệu có dữ liệu. Trong trường hợp của chúng tôi, nếu sample.txt không trống thì nó sẽ có dữ liệu.

NS.gửi(Gửi dữ liệu)

Bây giờ chúng tôi có thể gửi nội dung của sample.txt đến máy chủ bằng cách sử dụng đối tượng socket NS.

Gửi dữ liệu= tập tin.đọc(1024)

Một lần nữa đọc nếu có bất cứ điều gì còn lại. Vì vậy, sẽ không có gì để đọc từ tệp Gửi dữ liệu sẽ trống và nó sẽ đi ra từ vòng lặp while.

NS.gần()

Đây không phải là đóng kết nối từ phía máy khách.

Ảnh chụp màn hình Ubuntu Phía máy chủ

Ảnh chụp màn hình Ubuntu Phía máy khách

Các kết hợp đã thử nghiệm:

  • Linux làm máy chủ và Linux làm máy khách: PASS
  • Linux dưới dạng máy khách và Linux dưới dạng máy chủ: PASS
  • Linux làm máy chủ và Windows10 làm máy khách: PASS
  • Linux làm máy khách và Windows10 làm máy chủ: PASS

Khuyến nghị là sử dụng hai hệ thống Linux cho máy chủ và máy khách.

Lỗi mong đợi:

  1. Bạn có thể thấy lỗi bên dưới nếu máy chủ không chạy trên cổng 9898

Traceback (cuộc gọi gần đây nhất cuối cùng):

Tập tin'client.py',hàng22, trong <mô-đun>
NS.liên kết((ServerIp,HẢI CẢNG))
ConnectionRefusedError:[Errno111]Kết nối bị từ chối
  1. Lỗi dưới đây được nhìn thấy nếu địa chỉ IP không được chuyển ở phía máy khách

Chạy như

ứng dụng khách python3.py <địa chỉ phục vụ>
  1. Dưới đây là lỗi nếu 1NSđối số ở phía máy khách không phải là địa chỉ IP

Traceback (cuộc gọi gần đây nhất cuối cùng):

Tập tin'client.py',hàng22, trong <mô-đun>
NS.liên kết((ServerIp,HẢI CẢNG))
ổ cắm.gaierror:[Errno -2]TênhoặcDịch vụkhông phảiđã biết
  1. Lỗi dưới đây được nhìn thấy nếu cổng được sử dụng như 98980

Traceback (cuộc gọi gần đây nhất cuối cùng):

Tập tin'client.py',hàng22, trong <mô-đun>
NS.liên kết((ServerIp,HẢI CẢNG))
OverflowError: getsockaddrarg: cổng phải là0-65535.
  1. Lỗi dưới đây được nhìn thấy nếu sample.txt không xuất hiện ở phía máy khách.

Traceback (cuộc gọi gần đây nhất cuối cùng):

Tập tin'client.py',hàng25, trong <mô-đun>
tập tin = mở ra('sample.txt', 'rb')
FileNotFoundError:[Errno2]Không có như vậytập tin hoặcdanh mục:'sample.txt'

Phần kết luận:

Sử dụng chương trình này, chúng ta có thể gửi một tệp văn bản đơn giản từ hệ thống này sang hệ thống khác thông qua mạng bằng chương trình python. Điều này cung cấp cho chúng tôi kiến ​​thức cơ bản về lập trình python và socket cũng để gửi dữ liệu qua mạng.