Python 3-네트워크 프로그래밍

Python은 네트워크 서비스에 대한 두 가지 수준의 액세스를 제공합니다. 낮은 수준에서 기본 운영 체제의 기본 소켓 지원에 액세스 할 수 있으므로 연결 지향 및 비 연결 프로토콜 모두에 대해 클라이언트와 서버를 구현할 수 있습니다.

Python에는 FTP, HTTP 등과 같은 특정 애플리케이션 수준 네트워크 프로토콜에 대한 상위 수준 액세스를 제공하는 라이브러리도 있습니다.

이 장은 네트워킹-소켓 프로그래밍에서 가장 유명한 개념에 대한 이해를 제공합니다.

소켓이란?

소켓은 양방향 통신 채널의 끝점입니다. 소켓은 프로세스 내에서, 동일한 시스템의 프로세스간에 또는 다른 대륙의 프로세스간에 통신 할 수 있습니다.

소켓은 Unix 도메인 소켓, TCP, UDP 등 다양한 채널 유형을 통해 구현 될 수 있습니다. 소켓 라이브러리는 일반적인 전송뿐만 아니라 나머지를 처리하기위한 일반적인 인터페이스를 처리하기위한 특정 클래스를 제공합니다.

소켓에는 자체 어휘가 있습니다.

Sr. 아니. 용어 및 설명
1

domain

전송 메커니즘으로 사용되는 프로토콜 제품군입니다. 이러한 값은 AF_INET, PF_INET, PF_UNIX, PF_X25 등과 같은 상수입니다.

2

type

두 엔드 포인트 간의 통신 유형으로, 일반적으로 연결 지향 프로토콜의 경우 SOCK_STREAM, 비 연결 프로토콜의 경우 SOCK_DGRAM입니다.

protocol

일반적으로 0이며 도메인 및 유형 내에서 프로토콜의 변형을 식별하는 데 사용할 수 있습니다.

4

hostname

네트워크 인터페이스의 식별자-

  • 호스트 이름, 점으로 구분 된 쿼드 주소 또는 콜론 (및 가능하면 점) 표기법의 IPV6 주소 일 수있는 문자열

  • INADDR_BROADCAST 주소를 지정하는 문자열 "<broadcast>".

  • INADDR_ANY를 지정하는 길이가 0 인 문자열 또는

  • 호스트 바이트 순서의 이진 주소로 해석되는 정수입니다.

5

port

각 서버는 하나 이상의 포트에서 호출하는 클라이언트를 수신합니다. 포트는 Fixnum 포트 번호, 포트 번호가 포함 된 문자열 또는 서비스 이름 일 수 있습니다.

소켓 모듈

소켓을 생성하려면 소켓 모듈에서 사용할 수 있는 socket.socket () 함수를 사용해야합니다.

s = socket.socket (socket_family, socket_type, protocol = 0)

다음은 매개 변수에 대한 설명입니다.

  • socket_family − 이것은 앞에서 설명한 것처럼 AF_UNIX 또는 AF_INET입니다.

  • socket_type − SOCK_STREAM 또는 SOCK_DGRAM입니다.

  • protocol − 일반적으로 생략되며 기본값은 0입니다.

소켓 객체 가 있으면 필요한 기능을 사용하여 클라이언트 또는 서버 프로그램을 만들 수 있습니다. 다음은 필요한 기능 목록입니다-

서버 소켓 방법

Sr. 아니. 방법 및 설명
1

s.bind()

이 메서드는 주소 (호스트 이름, 포트 번호 쌍)를 소켓에 바인딩합니다.

2

s.listen()

이 방법은 TCP 리스너를 설정하고 시작합니다.

s.accept()

이것은 수동적으로 TCP 클라이언트 연결을 수락하고 연결이 도착할 때까지 대기합니다 (차단).

클라이언트 소켓 방법

Sr. 아니. 방법 및 설명
1

s.connect()

이 방법은 TCP 서버 연결을 적극적으로 시작합니다.

일반 소켓 방법

Sr. 아니. 방법 및 설명
1

s.recv()

이 방법은 TCP 메시지를받습니다.

2

s.send()

이 방법은 TCP 메시지를 전송합니다.

s.recvfrom()

이 방법은 UDP 메시지를 수신합니다.

4

s.sendto()

이 방법은 UDP 메시지를 전송합니다.

5

s.close()

이 메서드는 소켓을 닫습니다.

6

socket.gethostname()

호스트 이름을 반환합니다.

간단한 서버

인터넷 서버를 작성하기 위해 우리는 socket소켓 객체를 생성하기 위해 소켓 모듈에서 사용할 수있는 함수. 그런 다음 소켓 개체를 사용하여 다른 함수를 호출하여 소켓 서버를 설정합니다.

이제 전화 bind(hostname, port)주어진 호스트에서 서비스에 대한 포트 를 지정하는 함수 .

다음으로 반환 된 객체 의 accept 메서드를 호출 합니다. 이 메서드는 클라이언트가 지정한 포트에 연결할 때까지 기다린 다음 해당 클라이언트에 대한 연결을 나타내는 연결 개체 를 반환합니다 .

#!/usr/bin/python3           # This is server.py file
import socket                                         

# create a socket object
serversocket = socket.socket(
	        socket.AF_INET, socket.SOCK_STREAM) 

# get local machine name
host = socket.gethostname()                           

port = 9999                                           

# bind to the port
serversocket.bind((host, port))                                  

# queue up to 5 requests
serversocket.listen(5)                                           

while True:
   # establish a connection
   clientsocket,addr = serversocket.accept()      

   print("Got a connection from %s" % str(addr))
    
   msg = 'Thank you for connecting'+ "\r\n"
   clientsocket.send(msg.encode('ascii'))
   clientsocket.close()

간단한 클라이언트

주어진 포트 12345와 주어진 호스트에 대한 연결을 여는 매우 간단한 클라이언트 프로그램을 작성해 보겠습니다. Python의 소켓 모듈 함수를 사용하여 소켓 클라이언트를 만드는 것은 매우 간단 합니다.

그만큼 socket.connect(hosname, port )포트의 호스트 이름 에 대한 TCP 연결을 엽니 다 . 소켓이 열리면 IO 객체처럼 읽을 수 있습니다. 완료되면 파일을 닫는 것처럼 닫아야합니다.

다음 코드는 주어진 호스트 및 포트에 연결하고 소켓에서 사용 가능한 데이터를 읽은 다음 종료하는 매우 간단한 클라이언트입니다.

#!/usr/bin/python3           # This is client.py file

import socket

# create a socket object
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

# get local machine name
host = socket.gethostname()                           

port = 9999

# connection to hostname on the port.
s.connect((host, port))                               

# Receive no more than 1024 bytes
msg = s.recv(1024)                                     

s.close()
print (msg.decode('ascii'))

이제이 server.py를 백그라운드에서 실행 한 다음 위의 client.py를 실행하여 결과를 확인합니다.

# Following would start a server in background.
$ python server.py & 

# Once server is started run client as follows:
$ python client.py

산출

이것은 다음 결과를 생성합니다-

on server terminal
Got a connection from ('192.168.1.10', 3747)
On client terminal
Thank you for connecting

Python 인터넷 모듈

Python 네트워크 / 인터넷 프로그래밍의 몇 가지 중요한 모듈 목록은 다음과 같습니다.

실험 계획안 공통 기능 포트 번호 Python 모듈
HTTP 웹 페이지 80 httplib, urllib, xmlrpclib
NNTP 유즈넷 뉴스 119 nntplib
FTP 파일 전송 20 ftplib, urllib
SMTP 이메일 보내기 25 smtplib
POP3 이메일을 가져 오는 중 110 poplib
IMAP4 이메일을 가져 오는 중 143 imaplib
Telnet 명령 줄 23 텔넷 립
부지런한 사람 문서 전송 70 gopherlib, urllib

FTP, SMTP, POP 및 IMAP 프로토콜과 함께 작동하려면 위에 언급 된 모든 라이브러리를 확인하십시오.

추가 자료

이것은 소켓 프로그래밍의 빠른 시작이었습니다. 방대한 주제입니다. 자세한 내용은 다음 링크를 통해 확인하는 것이 좋습니다.

  • 유닉스 소켓 프로그래밍 .

  • Python 소켓 라이브러리 및 모듈 .