Python3 socket?

Python에서는 2가지 타입의 네트워크 접근방법을 제공한다. 하나는 low level의 소켓이고, 다른 하나는 higher-level의 접근으로 FTP나 HTTP등을 제공한다.

Socket이란?

소켓은 2개의 서로다른 머신에서 (동일머신도 가능) 상호 커뮤니케이션을 위한 채널을 말한다. 소켓은 대표적으로 TCP와 UDP 를 제공한다.

소켓 용어

Term Description
domain 프로토콜 패밀리로 이는 전송 매커니즘으로 사용한다. AF_INET, PF_INET, PF_UNIX, PF_X25등이 있다.
type 두 엔드포인트에서 서로 사용할 커뮤니케이션 타입이다. 연결지향의 SOCK_STREAM, 비연결지향인 SOCK_DGRAM이 있다.
protocol 일반적으로 zeor값이며 이는 도메인과 타입과 함께 다양한 프로토콜을 지정한다.
hostname 호스트네임은 네트워크 인터페이스를 구분짓는 값이다.
port 각 서버는 클라이언트의 요청을 기다리기 위해서 리슽하고 있는 프로그램을 의미한다.

Socket모듈 사용하기.

파이선에서 소켓 모듈을 이용하기 위해서는 다음과 같은 구문을 이용한다.

s = socket.socket(socket_family, socket_type, protocol=0)
파라미터 설명
socket_family AF_UNIX, AF_INET등과 같이 도메인을 나타낸다.
socket_type SOCK_STREAM(TCP), SOCK_DGRAM(UDP)가 올수 있다.
protocol 일반적으로 0을 지정한다.

서버에서 사용하는 소켓 메소드

s.bind() 는 주소를 바인드한다. (hostname, port)쌍으로 바인드된다.

s.listen()는 TCP리스너를 스타트 하는 명령어이다.

s.accept()는 TCP클라이언트가 접속하기를 기다리는 것이다. (blocking된다고한다.)

클라이언트에서 사용하는 소켓 메소드

s.connect()는 TCP서버에 접근을 수행하는 메소드이다.

공용 메소드

s.recv() 는 TCP메시지를 수신받는다.

s.send()는 TCP메시지를 전송한다.

s.recvfrom()는 UDP메시지를 수신받는다.

s.sendto()는 UDP메시지를 전송한다.

s.close()는 소켓을 닫는다.

socket.gethostname() 호스트이름을 반환한다.

서버소켓 프로그램

import socket

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = socket.gethostname()
port = 9999

serversocket.bind((host, port))
serversocket.listen(5)

while True:
    clientsocket, addr = serversocket.accept()
    print("Got a connection from %s" % str(addr))

    msg='Thank you for connection' + "\r\n"
    clientsocket.send(msg.encode('ascii'))
    clientsocket.close()

클라이언트 소켓 프로그램

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()

port = 9999

s.connect((host, port))

msg = s.recv(1024)
s.close()

print(msg.decode('ascii'))

실행하기.

python simpleServer.py &
python simpleClient.py