Software Study/통신

Python 소켓 통신

욜스터 2021. 1. 15. 19:46
728x90

소켓

소켓은 연결된 네트워크의 양 끝단을 추상화 시킨 개념

컴퓨터의 관점에선 네트워크로 통하는 컴퓨터의 외부와 컴퓨터 내부의 프로그램을 이어주는 인터페이스

 

택배를 보낼 때 박스에 물건을 넣고 받는 사람 주소를 쓰는 것과 비슷하게

소켓은 어디로 보내지는 창구라는 것이 명시된 택배 상자 같은 것

 


소켓의 사용방법

1. 서버 소켓

from socket import *
from select import *

HOST =''
PORT = 10000
BUFSIZE = 1024
ADDR = (HOST, PORT)

#소켓 객체 생성
serverSocket = socket(AF_INET, SOCK_STREAM)

#소켓 주소 정보 할당
serverSocket.bind(ADDR)

#연결 수신 대기 상태
serverSocket.listen(100)

#연결 수락
clientSocket, addr_info = serverSocket.accept()
print('connected by', addr)

 

소켓 주소 정보 할당

AF_INET에서 ''는 INADDR_ANY를 의미한다. 즉, 모든 인터페이스와 연결하고 싶다면 빈 문자열을 넣으면 된다.

즉, 10000번 포트에서 모든 인터페이스에게 연결하도록 한다라는 의미

 

연결 수신 대기 상태

listen()안에 인자는 해당 소켓이 총 몇개의 동시접속까지 허용할 것인지 의미한다.

인자를 입력하지 않으면 파이썬이 자의적으로 판단해서 임의의 숫자로 listen한다고 한다.

 

연결 수락

접속을 수락하고 통신을 하기 위해서 accept를 사용한다.

누군가가 접속할 때까지 프로그램은 이 부분에서 멈춰있게 된다.

 

2. 클라이언트 소켓

from socket import *
from select import *
import sys
from time import ctime

HOST = '12.0.0.1'
PORT = 10000
BUFSIZE = 1024
ADDR = (HOST, PORT)

#서버에 접속하기 위한 소켓 생성
clientSocket = socket(AF_INET, SOCK_STREAM)

#서버 접속 시도
clientSocket.connect(ADDR)

bind, listen, accept이 없고 connect가 있다.

클라이언트에서 서버에 접속하기 위해서 connect()을 실행해주면 된다.

127.0.0.1은 자기 자신을 의미한다. 

즉, 자기 자신에게 10000번 포트로 연결하라는 의미

 

3. 송수신 

-클라이언트

msg = 'Hello!'

#서버에 메시지 전달
clientSocket.send(msg.encode())

encode()는 문자열을 byte로 변환해주는 메소드이다.

 

-서버

data = clientSocket.recv(65535)
print('recieve data : ', data.decode())

recv() 인자는 수신할 바이트의 크기로, 65535바이트 만큼 가져오겠다는 뜻이다.

send()를 실행 할때 인코딩해서 보냈으니 문자열로 보기 위해서는 디코딩을 해야한다.

 

예제 코드

-Server.py

from socket import *

HOST = '127.0.0.1'
PORT = 9999
ADDR = (HOST, PORT)

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

serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

serverSocket.bind(ADDR)
serverSocket.listen()

clientSocket, addr = serverSocket.accept()
print('connected by', addr)

copy = '0'

while True:
   f = open('test.txt', 'r')
   s = f.read()
   f.close()

   if copy == s:
      continue
   else:
      print('메모장의 내용', s)
      copy = s
      clientSocket.sendall(s.encode())

clientSocket.close()
serverSocket.close()

 

-Client.py

from socket import *

HOST = '127.0.0.1'
PORT = 9999
ADDR = (HOST, PORT)

clientSocket = socket(AF_INET, SOCK_STREAM)

clientSocket.connect(ADDR)

copy = '0'

while True:
   data = clientSocket.recv(1024)

   if copy == data:
      continue
   else:
      print('서버로부터 받은 메모장의 내용', repr(data.decode()))

      copy = data

      f=open('testclient.txt', 'w')
      f.write(data.decode())
      f.close()

clientSocket.close()

 

실행결과

 

 

 

 

참고 블로그: seopseop911.tistory.com/26, seolin.tistory.com/97

728x90
반응형

'Software Study > 통신' 카테고리의 다른 글

Jinja2 사용하기  (0) 2021.01.15
파이썬으로 웹서버 구축하기 (Flask )  (0) 2021.01.13