Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python의 저수준 네트워킹 인터페이스(소켓)

<시간/>

Python 표준 라이브러리의 '소켓' 모듈은 서버와 클라이언트 시스템이 운영 체제 상단의 소켓 끝점을 사용하여 통신하는 방법을 정의합니다. '소켓' API에는 연결 지향 및 비연결 네트워크 프로토콜에 대한 기능이 모두 포함되어 있습니다.

소켓은 양방향 통신 링크의 끝점입니다. IP 주소와 포트 번호가 특징입니다. 연결을 시작하려면 양쪽 끝에 소켓을 적절하게 구성해야 합니다. 이렇게 하면 들어오는 메시지를 듣고 클라이언트-서버 환경에서 응답을 보낼 수 있습니다.

'socket' 모듈의 socket() 함수는 소켓 개체를 설정합니다.

import socket
obj = socket.socket(family, type, protocol)

'패밀리' 인수는 기본적으로 AF_INET입니다. 허용되는 다른 값은 AF_INET6, AF_UNIX, AF_CAN 또는 AF_RDS입니다. 'type' 인수의 값은 기본적으로 TCP(연결 지향 프로토콜)를 나타내는 'SOCK_STREAM'입니다. 연결 없는 프로토콜(UDP)의 경우 'SOCK_DGRAM'으로 설정합니다. 'protocol' 인수는 일반적으로 기본적으로 0으로 설정됩니다.

서버와 클라이언트의 소켓 개체를 각각 서버 소켓 및 클라이언트 소켓이라고 합니다. 소켓 개체는 다음 메서드를 구현합니다.

바인드()
이 메소드는 소켓을 지정된 IP 주소 및 포트 번호에 바인딩합니다.
듣기()
이 메소드는 서버를 시작하고 클라이언트로부터 연결 요청을 찾는 청취 루프로 실행됩니다.
수락()
서버가 연결 요청을 가로채면 이 메서드는 이를 수락하고 해당 주소로 클라이언트 소켓을 식별합니다.

일반적인 서버 측 코드는 다음과 같습니다.

import socket
ss = socket.socket()
ss.bind(('localhost',12345))
ss.listen()
client, addr = ss.accept()
print ("connection request from: " + str(addr))

로컬 시스템을 서버로 사용하여 클라이언트와 동일한 시스템에서 들어오는 메시지를 수신하는 경우 해당 IP 주소는 루프백 주소라고도 하는 '127.0.0.1'입니다. 'localhost'의 호스트 이름으로 식별됩니다. 소켓은 임의의 빈 포트 번호에서 수신 대기하도록 만들어집니다. 네트워크에 있는 멀리 있는 기계들 간의 통신을 위해서는 실제 IP 주소를 사용해야 합니다.

클라이언트 소켓은 IP 주소와 포트 번호를 수신 대기 중인 서버 소켓에 연결 요청을 보냅니다.

연결()

obj = socket.socket()
obj.connect((host,port))

클라이언트의 연결 요청이 서버에 의해 수락되면 두 소켓 개체는 이제 TCP 프로토콜을 사용하여 연결되고 데이터를 보내거나 받을 수 있습니다.

보내기()

서버는 가로챈 주소를 사용하여 클라이언트에 데이터를 보냅니다.

client.send(bytes)

클라이언트 소켓은 연결된 소켓으로 데이터를 보냅니다.

obj.send(bytes)

sendall()

send()와 유사합니다. 이 방법은 모든 데이터가 전송될 때까지 계속 데이터를 전송합니다.

보내기()

이 방법은 UDP 프로토콜의 경우에만 사용됩니다.

수신()

이 메소드는 클라이언트로 전송된 데이터를 검색하는 데 사용됩니다. 서버의 경우 요청이 수락된 원격 소켓을 사용합니다.

client.recv(bytes)

클라이언트의 경우

obj.recv(bytes)

recvfrom()

이 방법은 UDP 프로토콜의 경우에 사용됩니다.

서버 코드

import socket
host = "127.0.0.1"
port = 12345
ss = socket.socket()
ss.bind((host,port))
ss.listen()
cs, addr = server.accept()
print ("Connection from: " + str(addr))
while True:
   data = cs.recv(1024).decode()
   if not data:
      break
   print ("from connected user: " + str(data))
   print ("Received from User: " + str(data))
   data = input("type message: ")
   conn.send(data.encode())
cs.close()

클라이언트 코드

import socket
host = '127.0.0.1'
port = 12345
obj = socket.socket()
obj.connect((host,port))
message = input("type message: ")
while message != 'q':
   obj.send(message.encode())
   data = obj.recv(1024).decode()
   print ('Received from server: ' + data)
   message = input("type message: ")
obj.close()

두 개의 명령 프롬프트 창을 엽니다. 한 번에 서버 코드를 먼저 실행합니다. 다른 실행 클라이언트 코드에서.

Python의 저수준 네트워킹 인터페이스(소켓)