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
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 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
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
- 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 . 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
- 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ủ
Ảnh chụp màn hình Ubuntu Phía máy khách
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
- 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
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
- 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
- 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
s. kết nối[[ ServerIp , PORT]]
ổ cắm . lỗi . [ Không có - 2] Name or service not known
- 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
s. kết nối[[ ServerIp , PORT]]
Lỗi tràn . getockaddrarg. cổng phải là 0 - 65535 .
- 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
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