Python의 소켓 프로그래밍이란 무엇이며 어떻게 마스터합니까?



피클 및 소켓을 사용하여 Python 객체를 전송하는 것과 함께 클라이언트-서버 통신과 함께 Python의 소켓 프로그래밍이 무엇인지 알아보세요.

인터넷은 부인할 수없이 '존재의 영혼'이되었으며 그 활동은 '연결'또는 '네트워크'가 특징입니다. 이러한 네트워크는 가장 중요한 기본 요소 중 하나를 사용하여 가능합니다. 소켓. 이 기사는 Python에서 소켓 프로그래밍을 다루는 모든 영역을 다룹니다. 소켓은 이러한 연결을 만드는 데 도움이되지만 , 의심 할 여지없이 쉽게 만들 수 있습니다.

이 문서에서 다루는 모든 주제를 간략히 살펴 보겠습니다.





왜 소켓을 사용합니까?
파이썬에서 소켓이란 무엇입니까?
Python에서 소켓 프로그래밍을 달성하는 방법
서버 란?
클라이언트 란 무엇입니까?
에코 클라이언트-서버
다중 통신
Python 객체 전송



왜 소켓을 사용합니까?

소켓은 네트워킹의 중추입니다. 두 개의 서로 다른 프로그램 또는 장치간에 정보를 전송할 수 있습니다. 예를 들어, 브라우저를 열면 클라이언트로서 정보 전송을 위해 서버에 연결하는 것입니다.

이 커뮤니케이션에 대해 더 깊이 들어가기 전에 먼저이 소켓이 정확히 무엇인지 알아 봅시다.

소켓이란?

일반적으로 소켓은 데이터 송수신을 위해 구축 된 내부 엔드 포인트입니다. 단일 네트워크에는 각 통신 장치 또는 프로그램에 대해 하나씩 두 개의 소켓이 있습니다. 이 소켓은 IP 주소와 포트의 조합입니다. 단일 장치는 사용중인 포트 번호에 따라 소켓의 'n'수를 가질 수 있습니다. 프로토콜 유형에 따라 다른 포트를 사용할 수 있습니다. 일반적인 포트 번호 및 관련 프로토콜에 대한 자세한 내용은 다음 이미지를 참조하십시오.




공통 포트 -SocketProgramminginPython-Edureka

이제 소켓의 개념을 이해 했으므로 이제 Python의 소켓 모듈을 살펴 보겠습니다.

Python에서 소켓 프로그래밍을 달성하는 방법 :

Python에서 소켓 프로그래밍을 수행하려면 소켓 모듈 또는 . 이 모듈은 소켓을 만들고 서로 연결하는 데 필요한 내장 메서드로 구성됩니다.

몇 가지 중요한 방법은 다음과 같습니다.

자바에서 숫자의 자릿수 합계
행동 양식기술

socket.socket ()

소켓을 만드는 데 사용됨 (소켓을 만들려면 클라이언트 끝과 서버 모두에 필요)

socket.accept ()

연결을 수락하는 데 사용됩니다. conn은 데이터를 송수신하기위한 새 소켓 객체이고 address는 연결의 다른 쪽 끝에있는 소켓의 주소 인 값 쌍 (conn, address)을 반환합니다.

socket.bind ()

매개 변수로 지정된 주소에 바인딩하는 데 사용됩니다.

socket.close ()

소켓을 닫힘으로 표시하는 데 사용

socket.connect ()

매개 변수로 지정된 원격 주소에 연결하는 데 사용됩니다.

socket.listen ()

서버가 연결을 허용하도록합니다.

소켓 모듈의 중요성을 이해 했으므로 이제 소켓 프로그래밍을위한 서버 및 클라이언트를 생성하는 데 사용할 수있는 방법을 살펴 보겠습니다. .

서버 란?

서버는 네트워크 리소스 관리에 전념하는 프로그램, 컴퓨터 또는 장치입니다. 서버는 동일한 장치 또는 컴퓨터에 있거나 다른 장치 및 컴퓨터에 로컬로 연결되거나 원격으로 연결될 수 있습니다. 데이터베이스 서버, 네트워크 서버, 인쇄 서버 등과 같은 다양한 유형의 서버가 있습니다.

서버는 일반적으로 socket.socket (), socket.bind (), socket.listen () 등과 같은 메소드를 사용하여 연결을 설정하고 클라이언트에 바인드합니다. 이제 서버를 만드는 프로그램을 작성해 보겠습니다. 다음 예를 고려하십시오.

예:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) # 포트 번호는 0-65535 사이의 값이 될 수 있습니다 (일반적으로 비 권한 포트를 지정합니다. > 1023) s.listen (5) while True : clt, adr = s.accept () print (f'Connection to {adr} established ') #f 문자열은 # 중괄호 안에 파이썬 표현식을 포함하는 f 접두어가 붙은 리터럴 문자열입니다 clt .send (bytes ( 'Socket Programming in Python', 'utf-8')) # clientsocket에 정보 보내기

보시다시피 소켓을 생성하기 위해 가장 먼저 필요한 것은 소켓 모듈을 가져 오는 것입니다. 그 후 socket.socket () 메서드를 사용하여 서버 측 소켓을 만듭니다.

노트:

AF_INET은 인터넷의 주소를 나타내며 호스트가 특정 웹 사이트의 URL이거나 해당 주소가 될 수 있고 포트 번호가 정수인 쌍 (호스트, 포트)이 필요합니다. SOCK_STREAM은 TCP 프로토콜을 만드는 데 사용됩니다.

자바 프로그램의 기본 구조

bind () 메서드는 두 개의 매개 변수를 튜플 (호스트, 포트)로 받아들입니다. 그러나 일반적으로 낮은 숫자가 사용되므로 4 자리 포트 번호를 사용하는 것이 좋습니다. listen () 메서드를 사용하면 서버가 연결을 수락 할 수 있습니다. 여기서 5는 동시에 발생하는 여러 연결에 대한 대기열입니다. 여기에서 지정할 수있는 최소값은 0입니다 (작은 값을 지정하면 0으로 변경됨). 매개 변수가 지정되지 않은 경우 기본적으로 적합한 매개 변수를 사용합니다.

그만큼 영원히 연결을 허용합니다. ‘clt’및‘adr’는 클라이언트 개체 및 주소입니다. print 문은 클라이언트 소켓의 주소와 포트 번호 만 출력합니다. 마지막으로 clt.send는 데이터를 바이트 단위로 보내는 데 사용됩니다.

이제 서버가 모두 설정되었으므로 클라이언트로 이동하겠습니다.

클라이언트 란?

클라이언트는 서버에서 정보 나 서비스를받는 컴퓨터 또는 소프트웨어입니다. 클라이언트-서버 모듈에서 클라이언트는 서버에서 서비스를 요청합니다. 가장 좋은 예는 Google Chrome, Firefox 등과 같은 웹 브라우저입니다. 이러한 웹 브라우저는 사용자의 지시에 따라 필요한 웹 페이지 및 서비스에 대한 웹 서버를 요청합니다. 다른 예로는 온라인 게임, 온라인 채팅 등이 있습니다.

이제 클라이언트 측 프로그램을 코딩하는 방법을 살펴 보겠습니다. :

예:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) msg ​​= s.recv (1024) print (msg.decode ( 'utf-8') )

첫 번째 단계는 소켓 모듈을 가져온 다음 서버를 만드는 동안했던 것처럼 소켓을 만드는 것입니다. 그런 다음 클라이언트-서버 간의 연결을 생성하려면 (호스트, 포트)를 지정하여 connect () 메서드를 사용해야합니다.


노트: gethostname은 클라이언트와 서버가 같은 컴퓨터에있을 때 사용됩니다. (LAN – localip / WAN – publicip)

여기서 클라이언트는 서버로부터 정보를 받기를 원하며이를 위해 recv () 메소드를 사용해야하며 정보는 다른 변수 msg에 저장됩니다. 전달되는 정보는 바이트 단위이며 위 프로그램의 클라이언트에서 단일 전송으로 최대 1024 바이트 (버퍼 크기)를 수신 할 수 있습니다. 전송되는 정보의 양에 따라 원하는 양으로 지정할 수 있습니다.

마지막으로 전송중인 메시지를 디코딩하고 인쇄해야합니다.

이제 클라이언트-서버 프로그램을 만드는 방법을 알았으니 실행 방법을 살펴 보겠습니다.

Echo 클라이언트-서버 :

이러한 프로그램을 실행하려면 명령 프롬프트를 열고 클라이언트 및 서버 프로그램을 만든 폴더로 이동 한 다음 다음을 입력합니다.

py server.py (여기서 server.py는 서버의 파일 이름이며 py -3.7 server.py를 사용할 수도 있습니다)

이 작업이 완료되면 서버가 실행되기 시작합니다. 클라이언트를 실행하려면 다른 cmd 창을 열고 다음을 입력하십시오.

py client.py (여기서 client.py는 클라이언트의 파일 이름)

출력 (서버) :

(고객)

버퍼 크기를 7로 줄여 동일한 프로그램을 시도하고 어떤 결과가 나오는지 살펴 보겠습니다.

산출:

객체를 배열 PHP로 변환

보시다시피 7 바이트를 전송하면 연결이 종료됩니다. 그러나 이것은 완전한 정보를받지 못했고 연결이 끊어 졌기 때문에 문제가됩니다. 이 문제를 해결해 보겠습니다.

다중 통신 :

클라이언트가 완전한 정보를받을 때까지 연결을 계속하려면 while 루프를 사용할 수 있습니다.

예:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) while True : msg = s.recv (7) print (msg.decode ( 'utf- 8 '))

이렇게하면 전체 메시지가 전송 당 7 바이트로 수신됩니다.

하지만 이번에는 보시다시피 연결이 종료되지 않으며 언제 발생할지 알 수 없습니다. 여기에 덧붙여서 클라이언트가 서버로부터받을 메시지 나 정보의 크기를 실제로 알지 못한다면 어떻게해야할까요? 이러한 경우 실제로 클라이언트 측에서 다음 코드를 사용할 수 있습니다.

예:

complete_info = ''while True : msg = s.recv (7) if len (msg)<=0: break complete_info += msg.decode('utf-8') print(complete_info) 

서버 측에서는 다음과 같이 close () 메서드를 사용합니다.

clt.close ()

이것의 출력은 아래 이미지와 같습니다.

산출:



위의 코드 블록이 수행하는 모든 작업은 정보의 크기를 확인하고 한 번에 2 바이트의 버퍼에 인쇄하고 완료된 후 연결을 닫는 것입니다.

Python 객체 전송 :

여기까지 문자열을 전송하는 요령을 얻었습니다. 그러나 소켓 프로그래밍 파이썬 또한 Python 객체를 전송할 수도 있습니다. 이러한 객체는 세트, 튜플, 사전 등과 같은 것이 될 수 있습니다.이를 위해서는 Python의 pickle 모듈을 가져와야합니다.

Python pickle 모듈 :

파이썬 피클 모듈은 실제로 파이썬에서 객체를 직렬화하거나 직렬화 해제 할 때 그림에 나타납니다. 작은 예를 살펴 보겠습니다.

예:

import pickle mylist = [1,2, 'abc'] mymsg = pickle.dumps (mylist) print (mymsg)

산출: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e.’

보시다시피 위의 프로그램에서 'mylist'는 pickle 모듈의 dumps () 함수를 사용하여 직렬화됩니다. 또한 출력이 'b'로 시작한다는 점에 유의하십시오. 즉, 바이트로 변환됩니다. 소켓 프로그래밍에서이 모듈을 구현하여 전송할 수 있습니다. 파이썬 객체 클라이언트와 서버 사이.

pickle 모듈을 사용하여 파이썬 객체 구조를 전송하는 방법은 무엇입니까?

소켓과 함께 피클을 사용하면 네트워크를 통해 모든 것을 절대적으로 전송할 수 있습니다. 서버에서 클라이언트로 목록을 전송하기 위해 서버 측 및 클라이언트 측 대응을 기록해 보겠습니다.

서버 측:

import socket import pickle a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 2133)) #binding tuple s.listen (5) while True : clt, adr = s.accept () print (f'Connection to {adr} established ') m = {1 :'Client ', 2 :'Server '} mymsg = pickle.dumps (m) # 나중에 인쇄 할 메시지 mymsg = {len (mymsg) : {a}} 'utf-8') + mymsg clt.send (mymsg)

여기서 m은 기본적으로 서버에서 클라이언트로 보내야합니다. 이것은 먼저 dumps ()를 사용하여 객체를 직렬화 한 다음이를 바이트로 변환함으로써 수행됩니다.
이제 클라이언트 측 대응을 적어 보겠습니다.

고객 입장에서:

import socket import pickle a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2133)) while True : complete_info = b ''rec_msg = True while True : mymsg = s.recv (10) if rec_msg : print (f '메시지 길이 = {mymsg [: a]}') x = int (mymsg [: a]) rec_msg = False complete_info + = mymsg if len (complete_info) -a == x : print ( '전체 정보를 받았습니다') print (complete_info [a :]) m = pickle.loads (complete_info [a :]) print (m) rec_msg = True complete_info = b ''print (complete_info )

첫 번째 while 루프는 버퍼를 사용하여 수신되는 메시지 (rec_msg)뿐만 아니라 전체 메시지 (complete_info)를 추적하는 데 도움이됩니다. rec_를 설정하여 메시지
그런 다음 메시지가 수신되는 동안 내가하는 일은 각 비트를 인쇄하여 크기 10의 버퍼에 수신하는 것입니다.이 크기는 개인 선택에 따라 무엇이든 될 수 있습니다.

그런 다음 수신 된 메시지가 전체 메시지와 같으면 메시지를 수신 된 전체 정보로 인쇄하고 loads ()를 사용하여 메시지를 역 직렬화했습니다.

위 프로그램의 출력은 다음과 같습니다.

이것으로 Python의 소켓 프로그래밍에 대한이 기사의 끝으로 이동합니다. 모든 개념을 명확하게 이해 하셨기를 바랍니다.

가능한 한 많이 연습하고 경험을 되 돌리십시오.

질문이 있으십니까? 이 'Python의 소켓 프로그래밍'블로그의 댓글 섹션에 언급 해 주시면 가능한 한 빨리 답변을 드리겠습니다.

다양한 응용 프로그램과 함께 Python에 대한 심층적 인 지식을 얻으려면 라이브에 등록 할 수 있습니다. 연중 무휴 지원 및 평생 액세스.