소켓과 그 방법

소켓은 양방향 통신 채널의 끝점입니다. 프로세스 내에서, 동일한 시스템의 프로세스간에 또는 다른 시스템의 프로세스간에 통신 할 수 있습니다. 유사한 메모에서 네트워크 소켓은 인터넷과 같은 컴퓨터 네트워크를 통해 실행되는 두 프로그램 간의 통신 흐름에서 하나의 끝점입니다. 순전히 가상의 것이며 하드웨어를 의미하지는 않습니다. 네트워크 소켓은 IP 주소와 포트 번호의 고유 한 조합으로 식별 할 수 있습니다. 네트워크 소켓은 TCP, UDP 등과 같은 다양한 채널 유형을 통해 구현 될 수 있습니다.

네트워크 프로그래밍에 사용되는 소켓과 관련된 다른 용어는 다음과 같습니다.

도메인

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

유형

유형은 두 끝점 간의 통신 종류를 의미합니다. 일반적으로 연결 지향 프로토콜의 경우 SOCK_STREAM, 연결없는 프로토콜의 경우 SOCK_DGRAM입니다.

실험 계획안

이것은 도메인 및 유형 내에서 프로토콜의 변형을 식별하는 데 사용할 수 있습니다. 기본값은 0입니다. 일반적으로 생략됩니다.

호스트 이름

이것은 네트워크 인터페이스의 식별자로 작동합니다. 호스트 이름은 문자열, 점으로 구분 된 쿼드 주소 또는 콜론 (및 가능하면 점) 표기법의 IPV6 주소가 될 수 없습니다.

포트

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

소켓 프로그래밍을위한 Python의 소켓 모듈

파이썬에서 소켓 프로그래밍을 구현하려면 소켓 모듈을 사용해야합니다. 다음은 소켓을 만드는 간단한 구문입니다-

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

여기에서 소켓 라이브러리를 가져온 다음 간단한 소켓을 만들어야합니다. 다음은 소켓을 만드는 동안 사용되는 다른 매개 변수입니다.

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

  • socket_type − SOCK_STREAM 또는 SOCK_DGRAM입니다.

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

소켓 방법

이 섹션에서는 다양한 소켓 메서드에 대해 알아 봅니다. 세 가지 다른 소켓 메소드 세트가 아래에 설명되어 있습니다.

  • 서버 소켓 방법
  • 클라이언트 소켓 방법
  • 일반 소켓 방법

서버 소켓 방법

클라이언트-서버 아키텍처에는 서비스를 제공하는 하나의 중앙 집중식 서버가 있으며 많은 클라이언트가 해당 중앙 집중식 서버에서 서비스를받습니다. 클라이언트는 서버에 대한 요청도 수행합니다. 이 아키텍처에서 몇 가지 중요한 서버 소켓 방법은 다음과 같습니다.

  • socket.bind() −이 방법은 주소 (호스트 이름, 포트 번호)를 소켓에 바인딩합니다.

  • socket.listen()−이 방법은 기본적으로 소켓에 대한 연결을 수신합니다. TCP 리스너를 시작합니다. 백로 그는 대기중인 최대 연결 수를 지정하는이 메서드의 인수입니다. 최소값은 0이고 최대 값은 5입니다.

  • socket.accept()− 이것은 TCP 클라이언트 연결을 허용합니다. 쌍 (conn, address)은이 메서드의 반환 값 쌍입니다. 여기서 conn은 연결에서 데이터를 보내고받는 데 사용되는 새 소켓 개체이고 address는 소켓에 바인딩 된 주소입니다. 이 메서드를 사용하기 전에 socket.bind () 및 socket.listen () 메서드를 사용해야합니다.

클라이언트 소켓 방법

클라이언트-서버 아키텍처의 클라이언트는 서버를 요청하고 서버에서 서비스를받습니다. 이를 위해 클라이언트 전용 방법은 하나뿐입니다.

  • socket.connect(address)−이 방법은 적극적으로 친밀한 서버 연결 또는 간단히 말해서이 방법은 클라이언트를 서버에 연결합니다. 인수 주소는 서버의 주소를 나타냅니다.

일반 소켓 방법

클라이언트 및 서버 소켓 메서드 외에 소켓 프로그래밍에 매우 유용한 몇 가지 일반적인 소켓 메서드가 있습니다. 일반적인 소켓 방법은 다음과 같습니다.

  • socket.recv(bufsize)− 이름에서 알 수 있듯이이 방법은 소켓에서 TCP 메시지를 수신합니다. bufsize 인수는 버퍼 크기를 나타내며이 메서드가 한 번에받을 수있는 최대 데이터를 정의합니다.

  • socket.send(bytes)−이 방법은 원격 머신에 연결된 소켓으로 데이터를 전송하는 데 사용됩니다. 인수 bytes는 소켓에 전송 된 바이트 수를 제공합니다.

  • socket.recvfrom(data, address)−이 메서드는 소켓에서 데이터를 수신합니다. 이 메서드는 두 쌍 (데이터, 주소) 값을 반환합니다. 데이터는 수신 된 데이터를 정의하고 주소는 데이터를 보내는 소켓의 주소를 지정합니다.

  • socket.sendto(data, address)− 이름에서 알 수 있듯이이 방법은 소켓에서 데이터를 보내는 데 사용됩니다. 이 메서드는 두 쌍 (데이터, 주소) 값을 반환합니다. 데이터는 전송 된 바이트 수를 정의하고 주소는 원격 시스템의 주소를 지정합니다.

  • socket.close() -이 방법은 소켓을 닫습니다.

  • socket.gethostname() −이 메서드는 호스트의 이름을 반환합니다.

  • socket.sendall(data)−이 방법은 모든 데이터를 원격 머신에 연결된 소켓으로 보냅니다. 오류가 발생할 때까지 부주의하게 데이터를 전송하고 발생하면 socket.close () 메서드를 사용하여 소켓을 닫습니다.

서버와 클라이언트 간의 연결을 설정하는 프로그램

서버와 클라이언트 간의 연결을 설정하려면 두 개의 서로 다른 Python 프로그램을 작성해야합니다. 하나는 서버용이고 다른 하나는 클라이언트 용입니다.

서버 측 프로그램

이 서버 측 소켓 프로그램에서 우리는 socket.bind()특정 IP 주소 및 포트에 바인딩하여 해당 IP 및 포트에서 들어오는 요청을 수신 할 수 있도록하는 메서드입니다. 나중에 우리는socket.listen()서버를 청취 모드로 전환하는 방법. 숫자, 예를 들어 4는socket.listen()방법은 서버가 사용 중이면 4 개의 연결이 계속 대기하고 5 번째 소켓이 연결을 시도하면 연결이 거부됨을 의미합니다. 우리는 사용하여 클라이언트에게 메시지를 보낼 것입니다socket.send()방법. 끝으로 우리는socket.accept()socket.close()각각 연결을 시작하고 닫는 방법. 다음은 서버 측 프로그램입니다-

import socket
def Main():
   host = socket.gethostname()
   port = 12345
   serversocket = socket.socket()
   serversocket.bind((host,port))
   serversocket.listen(1)
   print('socket is listening')
   
   while True:
      conn,addr = serversocket.accept()
      print("Got connection from %s" % str(addr))
      msg = 'Connecting Established'+ "\r\n"
      conn.send(msg.encode('ascii'))
      conn.close()
if __name__ == '__main__':
   Main()

클라이언트 측 프로그램

클라이언트 측 소켓 프로그램에서 소켓 객체를 만들어야합니다. 그런 다음 서버가 실행중인 포트 (이 예에서는 12345)에 연결합니다. 그 후 우리는socket.connect()방법. 그런 다음socket.recv()방법을 사용하면 클라이언트는 서버에서 메시지를받습니다. 마침내socket.close() 메서드는 클라이언트를 닫습니다.

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = socket.gethostname()
port = 12345

s.connect((host, port))
msg = s.recv(1024)

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

이제 서버 측 프로그램을 실행하면 터미널에 다음과 같은 출력이 표시됩니다.

socket is listening
Got connection from ('192.168.43.75', 49904)

그리고 클라이언트 측 프로그램을 실행 한 후 다른 터미널에서 다음과 같은 출력을 얻습니다.

Connection Established

네트워크 소켓 예외 처리

즉 두 개의 블록이 있습니다 tryexcept네트워크 소켓 예외를 처리하는 데 사용할 수 있습니다. 다음은 예외 처리를위한 Python 스크립트입니다.

import socket
host = "192.168.43.75"
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

try:
   s.bind((host,port))
   s.settimeout(3)
   data, addr = s.recvfrom(1024)
   print ("recevied from ",addr)
   print ("obtained ", data)
   s.close()
except socket.timeout :
   print ("No connection between client and server")
   s.close()

산출

위의 프로그램은 다음과 같은 출력을 생성합니다-

No connection between client and server

위의 스크립트에서 먼저 소켓 객체를 만들었습니다. 그 다음에는 서버가 실행중인 호스트 IP 주소와 포트 번호 (이 예에서는 12345)를 제공했습니다. 나중에 try 블록이 사용되고 내부에socket.bind()방법으로 IP 주소와 포트를 바인딩하려고합니다. 우리는 사용하고 있습니다socket.settimeout()클라이언트의 대기 시간을 설정하는 방법으로,이 예에서는 3 초를 설정합니다. 서버와 클라이언트간에 연결이 설정되지 않을 경우 메시지를 인쇄하는 except 블록이 사용됩니다.