Python 소켓 파일 전송 보내기

Python Socket File Transfer Send



이 글의 목적은 배우는 것이다 파이썬 프로그램을 통해 네트워크를 통해 텍스트 파일을 전송하는 방법 . 이 파일 전송은 python3+에서 소켓 프로그래밍을 사용하는 서버 클라이언트 모델을 기반으로 합니다.

다음은 이 프로그램을 실행하기 위한 기본 설정 다이어그램입니다.









간단하게 기사 전체에서 시스템 A를 A_client로, 시스템 B를 B_server로 부를 것입니다.



파일 요구 사항:

우리는 필요 서버.py 이 파일은 서버 시스템에 있어야 합니다. 우리의 경우 server.py는 B_server 시스템에 있어야 합니다.





다른 두 파일 client.py 그리고 샘플.txt 클라이언트 시스템에 있어야 합니다. 우리의 경우 이 두 파일이 A_client 시스템에 있어야 합니다.

가정:

다음은 가정입니다.



  • 터미널 액세스가 가능한 두 개의 Linux 시스템이 있어야 합니다.
  • 선호하는 Linux 풍미는 우분투 .
  • Python3가 설치되어 있어야 합니다.
  • 두 Linux 시스템은 서로 ping할 수 있어야 합니다. 사용하다 ping을 확인하는 명령어
  • 한 시스템은 서버 역할을 하고 다른 시스템은 특정 시간에 클라이언트 역할을 해야 합니다.

제한 사항:

계속 진행하기 전에 이 프로그램에는 몇 가지 제한 사항이 있음을 알아야 합니다.

  • 이 프로그램을 실행하려면 Python3+가 설치되어 있어야 합니다. python 이전 버전에서 실행하면 오류 또는 다른 동작을 관찰할 수 있습니다.
  • 현재 이 프로그램을 통해 텍스트 파일만 전송할 수 있습니다. 텍스트가 포함되지 않은 다른 형식 파일은 실패할 수 있습니다.
  • 기본 프로그래밍 예외는 프로그램에서 처리되었습니다.
  • 프로그램은 Ubuntu 이외의 다른 OS에서 실행되거나 실행되지 않을 수 있습니다.
  • 1024바이트의 버퍼 크기가 사용되었으므로 텍스트 파일은 클라이언트 측에서 짧아야 합니다.

설정 요구 사항:

  • 이 프로그램을 사용하려면 적어도 하나의 Linux 시스템이 필요합니다. 그러나 권장 사항은 네트워크를 통해 연결된 두 개의 서로 다른 Linux 시스템을 사용하는 것입니다.
  • 두 시스템은 이더넷이나 Wi-Fi 또는 기타 연결을 통해 연결해야 합니다.

서버 소스 코드:

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

클라이언트 소스 코드:

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

프로그램 실행 방법 및 예상 출력:

다음은 프로그램을 실행하는 단계입니다.

1단계: B_server 시스템으로 이동하여 터미널을 엽니다. 터미널을 여는 단축키는 Alt+Ctrl+t.

2단계: 이제 server.py가 있는 경로로 이동합니다.

3단계: 이제 아래와 같이 server.py를 실행합니다.

파이썬3 서버.파이

오류가 없어야 하며 아래 인쇄가 표시되어야 합니다.

서버가 포트에 나열됩니다: 9898

복사된 파일 이름은 서버 측에서 recv.txt가 됩니다.

4단계: 이제 A_client 시스템에서 터미널을 엽니다.

5단계: client.py 및 sample.txt가 있는 경로로 이동합니다.

6단계: 이제 아래와 같이 client.py를 실행합니다.

파이썬3 클라이언트.파이 <B_서버 시스템 IP>

우리는 서버의 IP 주소를 알아야 한다는 것을 관찰했습니다. 아래 명령어를 실행하여 B_server 시스템의 IP 주소를 알 수 있습니다.

ifconfig

이제 A_client 시스템의 출력은 다음과 같아야 합니다.

################### 서버에서 아래 메시지가 수신되었습니다. ##################
| ---------------------------------- |
안녕하세요 클라이언트[IP 주소: 192.168.1.102],
**서버에 오신 것을 환영합니다**
-섬기는 사람
| ---------------------------------- |

7단계: 이제 B_server로 이동하여 아래 출력을 찾습니다.

파일이 성공적으로 복사되었습니다
서버가 연결을 닫았습니다

8단계: 서버 폴더에 하나의 파일 이름 recv.txt가 있어야 합니다. 이 recv.txt의 내용은 같은 sample.txt여야 합니다.

그래서 우리는 파이썬 프로그램을 통해 네트워크를 통해 클라이언트에서 서버로 파일을 성공적으로 복사했습니다.

코드 설명:

두 개의 파이썬 파일이 있습니다 서버.py 그리고 client.py .

server.py와 client.py 내부에 동일한 코드가 있으면 한 번 설명하겠습니다.

  1. 서버.py:
#!/usr/bin/env python3

이것은 기본적으로 이 server.py가 python3을 사용해야 함을 의미하는 shebang 라인입니다. 이 라인의 장점을 한 가지 보겠습니다.

다음과 같이 server.py 또는 client.py를 실행했습니다. 파이썬3 . 이제 python3을 사용하지 않고 python 파일을 실행할 수 있습니다. 아래 명령을 따르십시오

슈퍼 유저 모드로 이동:

그것의

.py 파일에 대한 모든 권한 부여:

chmod777섬기는 사람.파이

server.py 실행:

./섬기는 사람.파이 수입 소켓
가져오기소켓라이브러리를 파이썬 프로그램으로같이우리는 간다
사용소켓 ~을위한연결.

NS = 소켓.소켓()

우리는 객체를 만들고 있습니다 NS 소켓의 모든 메서드에 액세스합니다. 이것은 OOP 개념입니다.

포트= 9898

이제 서버가 수신할 포트를 하나 선택합니다. 이 대신 예약되지 않은 포트를 사용할 수 있습니다.

NS.묶다(('',포트))

bind 메소드를 사용하여 서버 IP 주소를 해당 포트 [9898]에 바인딩합니다. 한 가지 관찰은 bind 메소드의 첫 번째 인수 대신 서버의 정확한 IP 주소를 사용할 수 있었지만 제대로 작동하므로 공백으로 두기로 선택했다는 것입니다.

NS.묶다((IP 주소,포트))
파일 = 열려있는('recv.txt', 'ㅁ')

쓰기 모드를 위해 서버에서 하나의 파일 이름 recv.txt를 열고 파일 포인터를 얻었습니다. 이것은 클라이언트에서 하나의 텍스트 파일을 복사해야 하기 때문에 필요합니다.

동안 진실:

서버의 작업은 클라이언트가 해당 9898 포트에서 서버와 통신할 때까지 기다리는 것이므로 하나의 무한 while 루프를 시작하겠습니다. 따라서 이 while 루프가 필요합니다.

,주소=NS.동의하기()

이 코드는 클라이언트에서 들어오는 모든 연결 요청을 수락하는 것입니다. 콘은 사용할 것입니다 클라이언트와 소통하고 주소 포트 9898에서 이 서버에 동요 요청을 보낸 클라이언트의 IP 주소입니다.

메시지= 'NN| ---------------------------------- |N안녕하세요 클라이언트[IP 주소:
'
+ 주소[0]+'],N**서버에 오신 것을 환영합니다**N-섬기는 사람N
| ---------------------------------- |N NN'

이 코드는 클라이언트에게 보낼 메시지를 작성하는 것입니다. 이 메시지는 클라이언트 터미널에 인쇄되어야 합니다. 이것은 클라이언트가 서버와 통신할 수 있음을 확인합니다.

연결보내다(메시지인코딩())

이제 메시지가 준비되었으며 이를 사용하여 클라이언트에 보냅니다. 연결 이 코드는 실제로 클라이언트에 메시지를 보냅니다.

수신 데이터=연결수신(1024)

이 코드는 클라이언트 측에서 보낸 모든 데이터를 수신합니다. 우리의 경우 sample.txt의 내용을 예상합니다. 수신 데이터 .

동안수신 데이터:

RecvData 조건이 있는 while 루프가 하나 더 비어 있지 않습니다. 우리의 경우 비어 있지 않습니다.

파일.쓰다(수신 데이터)

안에 내용물이 있으면 수신 데이터 그런 다음 우리는 그 파일에 씁니다. recv.txt 파일 포인터 사용 파일.

수신 데이터=연결수신(1024)

클라이언트로부터 데이터가 있으면 다시 수신을 시도합니다. 한 번 수신 데이터 데이터가 없으면 코드가 while 루프를 깰 것입니다.

파일.닫다()

이것은 우리가 파일 쓰기를 마친 것처럼 파일 포인터를 닫을 것입니다.

연결닫다()

이렇게 하면 클라이언트와의 연결이 닫힙니다.

부서지다

이것은 B_server의 무한 while 루프에서 나오는 것입니다.

  1. 클라이언트.py:
수입 시스템

파이썬에서 인수 기능을 사용하고 싶을 때 sys 라이브러리를 가져옵니다.

만약 ((시스템.argv) > 1):
서버아이피= 시스템.argv[1]
또 다른:
인쇄('NN처럼 달리다Npython3 클라이언트.pyNN')
출구(1)

실행 중 client.py 파일 이름 뒤에 B_server의 IP 주소를 전달하므로 클라이언트 내부에서 해당 서버 IP 주소를 잡아야 합니다.

.....if (len(sys.argv) > 1): => 사용자가 하나 이상의 인수를 IP 주소로 전달하고 해당 IP 주소를 포착하도록 하려면 insdie 서버IP.

사용자가 하나 이상의 인수를 전달하지 않으면 코드가 도움말을 표시하고 코드에서 나옵니다.

포트= 9898

이것은 B_server 측에서 언급한 것과 동일한 포트여야 합니다.

NS.연결하다((서버아이피,포트))

이 코드는 해당 포트로 서버 IP에 TCP 연결을 수행합니다. 이 지점에서 잘못된 것은 연결 실패로 이어집니다.

파일 = 열려있는('샘플.txt', 'rb')

내용만 읽기 위해 sample.txt를 읽기 모드로 엽니다.

데이터 보내기= 파일.읽다(1024)

파일의 내용을 읽고 내부에 넣기 데이터 보내기 변하기 쉬운.

동안데이터 보내기:

우리는 하나의 while 루프를 시작합니다. 데이터 보내기 데이터가 있습니다. 우리의 경우 sample.txt가 비어 있지 않으면 데이터가 있어야 합니다.

NS.보내다(데이터 보내기)

이제 다음 내용을 보낼 수 있습니다. 샘플.txt 소켓 객체를 사용하여 서버에 NS.

데이터 보내기= 파일.읽다(1024)

남아있는 것이 있으면 다시 읽으십시오. 따라서 파일에서 읽을 것이 없습니다. 데이터 보내기 비어 있고 while 루프에서 나옵니다.

NS.닫다()

이것은 클라이언트 측에서 연결을 닫는 것이 아닙니다.

Ubuntu 스크린샷 서버 측

Ubuntu 스크린샷 클라이언트 측

테스트된 조합:

  • Linux를 서버로, Linux를 클라이언트로: PASS
  • 클라이언트로서의 Linux 및 서버로서의 Linux: PASS
  • 서버로서의 Linux 및 클라이언트로서의 Windows10: PASS
  • 클라이언트로서의 Linux 및 서버로서의 Windows10: PASS

서버와 클라이언트에 두 개의 Linux 시스템을 사용하는 것이 좋습니다.

예상 오류:

  1. 서버가 9898 포트에서 실행되고 있지 않으면 아래 오류를 볼 수 있습니다.

역추적(가장 최근 호출 마지막):

파일'클라이언트.py',22, ~에 <기준 치수>
NS.연결하다((서버아이피,포트))
연결 거부 오류:[에르노111]연결 거부됨
  1. 클라이언트 측에서 IP 주소가 전달되지 않으면 아래 오류가 표시됩니다.

처럼 달리다

파이썬3 클라이언트.파이 <서버아이피 주소>
  1. 1인 경우 아래 오류가 표시됩니다.클라이언트 측의 인수가 IP 주소가 아닙니다.

역추적(가장 최근 호출 마지막):

파일'클라이언트.py',22, ~에 <기준 치수>
NS.연결하다((서버아이피,포트))
소켓.가이에러:[에르노 -2]이름또는서비스~ 아니다모두 다 아는
  1. 포트가 98980과 같이 사용되는 경우 아래 오류가 표시됩니다.

역추적(가장 최근 호출 마지막):

파일'클라이언트.py',22, ~에 <기준 치수>
NS.연결하다((서버아이피,포트))
오버플로 오류: getsockaddrarg: 포트는 반드시0-65535.
  1. 클라이언트 측에 sample.txt가 없으면 아래 오류가 표시됩니다.

역추적(가장 최근 호출 마지막):

파일'클라이언트.py',25, ~에 <기준 치수>
파일 = 열려있는('샘플.txt', 'rb')
FileNotFound오류:[에르노2]그런 없음파일 또는예배 규칙서:'샘플.txt'

결론:

이 프로그램을 사용하면 파이썬 프로그램을 사용하여 네트워크를 통해 한 시스템에서 다른 시스템으로 간단한 텍스트 파일을 보낼 수 있습니다. 이것은 네트워크를 통해 데이터를 보내기 위한 파이썬 및 소켓 프로그래밍에 대한 기본 학습을 제공합니다.