파이썬 socket docs
python.org -> docs -> Library Reference -> socket 검색
https://docs.python.org/3/library/socket.html?highlight=socket#module-socket
IP(internet protocol)
인터넷이 연결되어있는 장치를 식별하기 위한 고유주소이다.
패킷(packet)
컴퓨터 네트워크가 전달하는 데이터의 형식화된 블록이다.(제어 정보와 사용자 데이터로 이루어진다)
UDP와 TCP
| 구분 | UDP | TCP |
| 신뢰성 | 높음 | 낮음 |
| 연결성 | 연결 지향성 | 비 연결성 |
| 재전송 | 오류 및 패킷 손실 감지시 재전송 요청 | 재전송 없음 |
| 속도 | 비교적 느린 편 | 비교적 빠른 편 |
| 용도 | 신뢰성이 필요한 통신 | 총 패킷수가 적은 통신, 고속 데이터 전송, 실시간 전송, 동영상 및 음성 등 멀티미디어 통신 |
UDP(User Datagram Protocol)
비연결형 프로토콜로써 인터넷 상에서 서로 정보를 주고 받을 때 정보를 보낸다는 신호나 받겠다는 신호 절차를 거치지 않고 전송하는 쪽에서 일방적으로 데이터를 전달하는 통신 프로토콜이다. 재전송이 없고 신뢰성을 보장하지 않지만 속도가 빠르다.
TCP(Transmission Control Protocol)
연결 지향 성격을 가진 프로토콜로써 데이터가 정상적으로 도착했는지에 대한 규약, 안정적인 데이터 전송을 제공한다. 오류 및 패킷 손실을 감지하면 재전송을 요청하고 신뢰성이 높지만 속도는 다소 느리다.
Port Number
포트번호란 호스트에서 프로그램을 실행할 떄 이 프로그램들을 구별하기 위한 16비트로 되어있는 논리적 할당이다.
포트번호는 0 ~ 65535의 범위를 가진다.
Socket
네트워크 소켓(network socket)은 컴퓨터 네트워크를 경유하는 프로세스 간 통신의 종착점이다. 이 소켓을 통해서 서로 데이터를 교환한다.
TCP/IP SOCKET 함수
socket() : 소켓생성
bind(): 소켓 특성을 정의
listen() : 수신 대기열 생성
발신자 - connect() : 연결 시도
수신자 - accept() : 연결 수락
read(), write() : 데이터 통신
close() : 연결 종료
net1
socket.getservbyname()
사용 소켓 확인하기
getaddrinfo()
주소 확인하기
확인한 주소로 접속할 url을 만들어 이동할 수 있다.
예시로 확인한 네이버 주소는 http://223.130.195.95:80/index.html 이다.
# 네트워킹 프로그래밍
# TCP protocol 기반의 socket(네트워크를 위한 통신채널 지원 클래스 또는 함수)
import socket
print(socket.getservbyname('http', 'tcp'))
print(socket.getservbyname('telnet', 'tcp'))
print(socket.getservbyname('ftp', 'tcp'))
print(socket.getservbyname('SMTP', 'tcp'))
print(socket.getservbyname('pop3', 'tcp'))
print(socket.getaddrinfo('www.naver.com', 80, proto=socket.SOL_TCP))
# '223.130.200.104' '223.130.195.95'
80
23
21
25
110
[(<AddressFamily.AF_INET: 2>, 0, 6, '', ('223.130.195.200', 80)), (<AddressFamily.AF_INET: 2>, 0, 6, '', ('223.130.195.95', 80))]
net1_server
conn.recv(1024).decode()
recv()를 실행하면 소켓에 메시지가 실제로 수신될 때까지 파이썬 코드는 대기하게 된다. 마치 accept() 처럼 . 인자로는 수신할 바이트의 크기를 지정할 수 있습니다. recv(1024)는 소켓에서 1024byte 만큼 가져온다.
recv()를 할 때는 데이터를 바이트로 수신하므로, 문자열로서 활용하기 위해선 디코딩을 해야한다. 이를 decode()를 이용하여 적절하게 문자열로 디코딩한다.
socket 기본 서버 설정
가장 흔히 쓰이는 socket.AF_INET, socket.SOCK_STREAM 조합은 사실 socket.socket()의 인자 중에서 family=, type=에 대한 기본 인자값이다. 따라서 이 타입의 소켓을 생성하고자 하는 경우에는 많은 파이썬 소켓 관련 튜토리얼과 달리, 인자를 생략하고 socket.socket()만 써도 무방하다.
# client / server(echo) 프로그래밍
# server
from socket import *
# socket으로 서버 구성
serversock = socket(AF_INET, SOCK_STREAM) # socket(소켓종류, 소켓유형)
serversock.bind(('127.0.0.1', 8888)) # ip,포트 바인딩
serversock.listen(1) # 동시 접속 최대 수 설정 (1 ~ 5)
print('server start...')
conn, addr = serversock.accept() # 연결 대기
print('addr : ', addr)
print('conn : ', conn)
print('from client message : ', conn.recv(1024).decode())
conn.close()
serversock.close()
net1_client
socket 기본 클라이언트 설정
# 단순 클라이언트
from socket import *
clientsock = socket(AF_INET, SOCK_STREAM)
clientsock.connect(('127.0.0.1', 8888)) #능동적으로 server에 접속
clientsock.send('안녕 반가워'.encode(encoding='utf_8', errors='strict'))
clientsock.close()
Anaconda Prompt 를 두개 연다
base를 이동한다.
cd C:\work\psou\pro1\pack4
디렉토리 확인
dir
각각 파일 접속 (서버와 클라이언트)
python net1_server.py
python net1_client.py
ip확인
ipconfig
server <- client 접속
ping + ip주소
'python' 카테고리의 다른 글
| thread - process, thread, multi thread 개요 (0) | 2022.10.12 |
|---|---|
| socket - 기본구조, 메시지 송수신 (0) | 2022.10.12 |
| DB 연결 - 기본 db, sql문 예시 (0) | 2022.10.12 |
| DB 연결 - select, insert, update, delete 기본 (0) | 2022.10.12 |
| DB - sqlite (0) | 2022.10.11 |