>백엔드 개발 >파이썬 튜토리얼 >Python 소켓 프로그래밍 소개

Python 소켓 프로그래밍 소개

高洛峰
高洛峰원래의
2016-10-18 11:14:351069검색

Python으로 서버를 작성하는 단계:

1. 첫 번째 단계는 소켓 개체를 만드는 것입니다. 소켓 생성자를 호출합니다. 예:

socket = 소켓.socket( family, type )

family 매개변수는 AF_INET 또는 AF_UNIX일 수 있는 주소 계열을 나타냅니다. AF_INET 제품군에는 인터넷 주소가 포함되어 있으며 AF_UNIX 제품군은 동일한 시스템에서 프로세스 간 통신에 사용됩니다.

유형 매개변수는 SOCK_STREAM(스트림 소켓) 및 SOCK_DGRAM(데이터그램 소켓)일 수 있는 소켓 유형을 나타냅니다.

2. 두 번째 단계는 소켓을 지정된 주소에 바인딩하는 것입니다. 이는 소켓 객체의 바인드 메소드를 통해 달성됩니다:

socket.bind(address)

AF_INET에 의해 생성된 소켓의 경우 주소 주소는 두 요소로 구성된 튜플이어야 합니다. (호스트, 포트)입니다. 호스트는 호스트를 나타내고 포트는 포트 번호를 나타냅니다. 포트 번호가 사용 중이거나 호스트 이름이 올바르지 않거나 포트가 예약된 경우 바인드 메소드는 소켓.오류 예외를 발생시킵니다.

3. 세 번째 단계는 소켓의 Listen 메서드를 사용하여 연결 요청을 받는 것입니다.

socket.listen( backlog )

backlog는 서버에 연결할 수 있는 최대 클라이언트 수를 지정합니다. 그 값은 1 이상입니다. 연결 요청을 받은 후 해당 요청을 대기열에 추가해야 합니다. 대기열이 가득 차면 요청이 거부됩니다.

4. 네 번째 단계는 서버 소켓이 클라이언트가 소켓의 accept 메서드를 통해 연결을 요청할 때까지 기다리는 것입니다.

connection, address = 소켓.accept()

accept 메서드가 호출되면 소켓은 "대기" 상태로 들어갑니다. 클라이언트가 연결을 요청하면 메서드는 연결을 설정하고 서버로 반환합니다. accept 메소드는 두 요소(연결, 주소)를 포함하는 튜플을 반환합니다. 첫 번째 요소인 연결은 서버가 클라이언트와 통신해야 하는 새 소켓 개체입니다. 두 번째 요소인 주소는 클라이언트의 인터넷 주소입니다.

5. 다섯 번째 단계는 서버와 클라이언트가 send 및 recv 방식으로 통신(데이터 전송)하는 단계입니다. 서버 호출은 문자열 형식으로 클라이언트에 정보를 보내고 보냅니다. send 메소드는 전송된 문자 수를 반환합니다. 서버는 recv 메소드를 사용하여 클라이언트로부터 정보를 받습니다. recv를 호출할 때 서버는 이 메서드 호출로 수신할 수 있는 최대 데이터 양에 해당하는 정수를 지정해야 합니다. recv 메소드는 데이터를 수신할 때 "차단" 상태로 들어가고 마지막으로 수신된 데이터를 나타내는 문자열을 반환합니다. 전송된 데이터의 양이 Recv를 초과하면 데이터가 잘립니다. 초과된 데이터는 수신 측에서 버퍼링됩니다. 이후의 recv 호출에서는 초과 데이터가 버퍼에서 제거됩니다(recv에 대한 마지막 호출 이후 클라이언트가 보낸 다른 데이터와 함께).

6. 전송이 완료되면 서버는 소켓의 close 메소드를 호출하여 연결을 종료합니다.

Python으로 클라이언트 작성 단계:

1. 서버에 연결할 소켓을 생성합니다: 소켓 = 소켓.socket(family, type)

2. 소켓의 연결 메소드 서버에 연결합니다. AF_INET 계열의 경우 연결 형식은 다음과 같습니다.

socket.connect( (host,port) )

host는 서버 호스트 이름 또는 IP를 나타내고, port는 바인딩된 포트 번호를 나타냅니다. 서버 프로세스에. 연결이 성공하면 클라이언트는 소켓을 통해 서버와 통신할 수 있습니다. 연결이 실패하면 소켓.오류 예외가 발생합니다.

3. 처리 단계에서 클라이언트와 서버는 전송 방법과 수신 방법을 통해 통신합니다.

4. 전송이 완료되면 클라이언트는 소켓의 close 메소드를 호출하여 연결을 종료합니다.

다음은 간단한 예입니다.

server.py

if __name__ == '__main__':
    import socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('localhost', 8001))
    sock.listen(5)
    while True:
        connection,address = sock.accept()
        try:
            connection.settimeout(5)
            buf = connection.recv(1024)
            if buf == '1':
                connection.send('welcome to server!')
            else:
                connection.send('please go out!')
        except socket.timeout:
            print 'time out'
        connection.close()

client.py

if __name__ == '__main__':
    import socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect(('localhost', 8001))
    import time
    time.sleep(2)
    sock.send('1')
    print sock.recv(1024)
    sock.close()

터미널에서 server.py를 실행합니다. 그런 다음 clien.py를 실행하면 "welcome to server!"가 터미널에 인쇄됩니다. client.py의 sock.send('1')을 다른 값으로 변경하면 "Please go out!"이 터미널에 출력됩니다. time.sleep(2)을 5보다 큰 값으로 변경하면 서버는 시간 초과됩니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.