Truyền tệp bằng lập trình ổ cắm trong python

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

Hai tệp khách hàng khác. py và mẫu. txt phải có mặt tại hệ thống máy khách. Trong trường hợp của chúng tôi, hai tệp đó phải có mặt tại hệ thống A_client

giả định

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

  • Chúng ta nên có hai hệ thống Linux với quyền truy cập đầu cuối
  • Hương vị Linux thích hợp hơn là Ubuntu
  • Python3 nên được cài đặt
  • Both Linux systems should able to ping each other. Use ping command to check ping.
  • Một hệ thống sẽ đóng vai trò là Máy chủ và hệ thống khác sẽ đóng vai trò là 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 các phiên bản cũ hơn của python
  • Hiện tại chỉ có thể chuyển tệp văn bản 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ể hoặc không thể chạy 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

Thiết lập yêu cầu

  • 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

Truyền tệp bằng lập trình ổ cắm trong python

Truyền tệp bằng lập trình ổ cắm trong python

Mã nguồn khách hàng

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

Truyền tệp bằng lập trình ổ cắm trong python

Cách chạy chương trình và đầu ra dự kiến

Sau đây là các bước thực hiện chương trình

Bước 1. Chuyển đến hệ thống B_server và mở một thiết bị đầu cuối. Phím tắt để mở terminal là Alt+Ctrl+t

Bước 2. Bây giờ hãy đi đến con đường nơi máy chủ. py có mặt

Bước 3. Bây giờ hãy chạy máy chủ. py như dưới đây

máy chủ python3. py

Không nên 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ủ đang lắng nghe 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ờ hãy mở terminal tại hệ thống A_client

Bước5. Đi đến đường dẫn mà khách hàng. py và mẫu. txt có mặt

Bước 6. Bây giờ hãy chạy ứng dụng khách. py như dưới đây

máy khách python3. py < IP hệ thống B_server >

Chúng tôi đã quan sát 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

################## Đã nhận được thông báo bên dưới từ máy chủ ##################
---------------------------------
Xin 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ước7. Bây giờ, hãy truy cập 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ước8. Cần có một tên tệp recv. txt tại thư mục máy chủ. Nội dung của recv này. txt phải giống mẫu. txt

Như vậy là chúng ta đã copy thành công một file từ client đến server qua mạng thông qua chương trình python

giải thích mã

Có hai máy chủ tệp python. py và khách hàng. py

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

  1. người phục vụ. py

#. /usr/bin/env python3

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

We have executed the server.py or client.py like python3 <.py file name>. Now without using python3 we can execute the python file. Follow below commands

Chuyển đến chế độ siêu người dùng

su

Cho phép tất cả. tập tin py

 chmod 777 . py

Chạy máy chủ. py

./server.py

nhập ổ cắm
Đang nhập thư viện socket vào chương trình python như chúng ta
để sử dụng ổ cắm cho kết nối.

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

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

PORT = 9898

Bây giờ chúng tôi chọn một cổng nơi 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

s. ràng buộc(('', PORT))

Chúng tôi sử dụng phương thức liên kết để 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

s. ràng buộc(( địa chỉ IP , PORT))
tệp = mở("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ừ ứng dụng khách

trong khi Đúng .

Hãy bắt đầu một vòng lặp vô hạn trong khi 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 = s. chấp nhận()

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

thông điệp = " \n\n|---------------------------------|\n Xin chào Khách hàng[Địa chỉ IP.
"
+ addr [0] + "], \n **Welcome to Server** \n -Server\n
|---------------------------------|\n \n\n "

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ủ

kết nối. gửi( tin nhắn. mã hóa())

Bây giờ chúng tôi đã có sẵn tin nhắn, 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 = kết nối. 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 mẫu. txt trong “RecvData”

while RecvData.

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

tệp . ghi( RecvData )

Khi chúng tôi có nội dung bên trong “RecvData”, thì chúng tôi sẽ ghi vào tệp đó “recv. txt” sử dụng con trỏ tệp “file”

RecvData = kết nối. 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. Khi “RecvData” không có dữ liệu, mã sẽ phá vỡ vòng lặp while

tệp . đóng()

Điều này sẽ chỉ đóng con trỏ tệp khi chúng ta hoàn thành việc ghi tệp

kết nối. đóng()

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

nghỉ

Điều này xuất phát từ vòng lặp vô hạn tại B_server

  1. khách hàng. py

nhập sys

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

if (len(sys.argv) > 1) . :
  ServerIp = sys . argv[1]
khác .
  in(" \n\n Run like \n python3 client.py < serverip address > \n\n ")
  thoát (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 ta cần nắm bắt địa chỉ IP của máy chủ đó bên trong máy khách

…. nếu (len(sys. argv) > 1). => Để đảm bảo người dùng chuyển ít nhất một đối số là địa chỉ IP và bắt địa chỉ IP đó ngay trong “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à thoát khỏi mã

PORT = 9898

Đây phải là cùng một cổng như đã đề cập ở phía B_server

s. kết nối(( ServerIp , PORT))

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

tệp = mở("sample. txt", "rb")

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

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

Đọc nội dung của tệp và đặt bên trong biến “SendData”

while SendData.

Chúng tôi đang bắt đầu một vòng lặp while nếu “SendData” có dữ liệu. Trong trường hợp của chúng tôi nếu “mẫu. txt” không trống, nó phải có dữ liệu

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

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

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

Đọc lại nếu còn gì. Vì vậy, sẽ không có gì để đọc từ tệp “SendData” sẽ trống và nó sẽ xuất hiện từ vòng lặp while

s. đóng()

Đâ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ủ

Truyền tệp bằng lập trình ổ cắm trong python

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

Truyền tệp bằng lập trình ổ cắm trong python

kết hợp thử nghiệm

  • Linux là máy chủ và Linux là máy khách. ĐI QUA
  • Linux là máy khách và Linux là máy chủ. ĐI QUA
  • Linux là máy chủ và Windows10 là máy khách. ĐI QUA
  • Linux là máy khách và Windows 10 là máy chủ. ĐI QUA

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

lỗi dự kiến

  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 "ứng dụng khách. py", dòng 22, in <module>
s. kết nối(( ServerIp , PORT))
Lỗi kết nối bị từ chối. [ Không có 111] Kết nối

  1. Lỗi bên dưới được nhìn thấy nếu địa chỉ IP không được chuyển ở phía máy khách

Chạy như

máy khách python3. py < địa chỉ máy chủ >

  1. Lỗi bên dưới được nhìn thấy nếu đối số đầu tiên ở 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 "ứng dụng khách. py", dòng 22, in <module>
s. kết nối(( ServerIp , PORT))
ổ cắm . lỗi . [ Không có - 2] Name or service not known

  1. Lỗi bên dưới đượ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 "ứng dụng khách. py", dòng 22, in <module>
s. kết nối(( ServerIp , PORT))
Lỗi tràn . getockaddrarg. cổng phải là 0 - 65535 .

  1. Lỗi bên dưới được nhìn thấy nếu “mẫu. txt” không có ở phía máy khách

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

Tệp "ứng dụng khách. py", dòng 25, in <module>
tệp = mở("sample. txt", "rb")
Lỗi FileNotFound. [ Không có 2] Không . file or directory: 'mẫu. txt'

Phần kết luận

Sử dụng chương trình này, chúng tôi 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 để gửi dữ liệu qua mạng

Làm cách nào để tạo một chương trình truyền tệp đơn giản bằng python?

Phương pháp 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. .
Chỉ định 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 để nhận dữ liệu từ ổ cắm trong python?

Nếu bạn đang viết một chương trình socket bằng python để giao tiếp với một số máy hoặc máy chủ từ xa để nhận dữ liệu, thì bạn phải sử dụng hàm recv() to receive data on a socket. The recv() can receive only a specified number of bytes into a string buffer.

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

CHỨC NĂNG TẠI PHÍA MÁY CHỦ . Tạo một chức năng thu thập tất cả dữ liệu từ máy chủ và gọi một chức năng khác được sử dụng để gửi tệp ở phía máy khách. 2. Sau khi thu thập tất cả dữ liệu, ổ cắm. client_conn. hàm send() sẽ được sử dụng để gửi dữ liệu

Python có tốt cho lập trình socket không?

Python cung cấp hai cấp độ truy cập vào các dịch vụ mạng. Ở mức thấp, bạn có thể truy cập hỗ trợ ổ cắm cơ bản trong hệ điều hành cơ bản , cho phép bạn triển khai máy khách và máy chủ cho cả hướng kết nối và hướng kết nối. .