티스토리 뷰

본 자료는 숭실대학교 정보통신전자공학부 소속 소모임 BlindC에서 3학년을 대상으로 하는 자료입니다.

개인의 소중한 창작물이기 때문에 자료의 열람은 자유이고, 소스코드를 긁어갈 수 있도록 우클릭제한이나 기타 제한은 걸어놓지 않았으나, 외부 공개나, 2차 수정등은 자제해주시길 부탁드립니다.


최근에 파이썬을 건드릴일이 없었는데, 데이터통신과목 과제로 파이썬을 이용한 소켓 프로그램을 만들라고 나온 모양이다. 후배들이 많이 물어봐서 따로 포스팅하여 정리하는 파이썬 소켓 프로그래밍 기본, 클라이언트에서 소문자를 서버로 전송하여 서버에서 대문자로 바꿔서 다시 클라이언트로 전송, 출력하는 문제이다.


버전은 python 3.5, pycharm 2016 community 버전을 사용하였음.

독자들이 python은 처음, C/C++은 어느정도 했을것이라 가정하고 설명 할게요.


<server.py>


1
2
3
4
5
6
7
8
9
10
11
12
13
from socket import *
serverPort = 12000
serverSocket = socket(AF_INET,SOCK_STREAM)
serverSocket.bind(('192.168.200.200',serverPort))
serverSocket.listen(1)
print('The server is ready to receive')
 
while 1:
    connectionSocket, addr = serverSocket.accept()
    sentence = connectionSocket.recv(1024)
    capitalizedSentence = sentence.upper()
    connectionSocket.send(capitalizedSentence)
    connectionSocket.close()
cs


서버파일은 위와 같이 작성하였습니다. 한줄씩 진행해보도록 합시다. from 은 C언어에서의 #include와 비슷하다고 생각하면 쉽습니다. import는 무엇을 가져올 것인가. 와일드카드 '*'을 사용했기 때문에, socket 내부에 있는 모든것을 가져온다고 생각하면 됩니다. C언어는 #include를 통하여 전처리 단계에서 헤더파일이나 인라인함수를 통해 구현하게 되는데 파이썬도 이 from/import를 사용하여 비슷한 동작을 한다고 생각하면 이해가 쉽습니다.


line 2, 서버로 사용하는 포트의 번호가 12000이라는 것. 주의할점은 여기서 사용하는 포트번호와 클라이언트에서 사용하는 포트번호가 일치해야 함.

line 3, 파이썬은 문법 구조상 선언이라는 개념도 없고 자료형이라는 개념도 없습니다, 해당 라인 같은 경우는 serverSocket이라는 이름으로 socket 클래스를 만드는것.

line 4, IP주소와 포트주소를 이용하여 만들어놓은 소켓을 바인드 합니다. 


본인 IP주소를 모르는 사람들을 위해서 IP 주소 얻는법.



윈도우 로고키 + R 키를 이용하여 실행창을 켤 수 있습니다. cmd라고 입력해서 윈도우 프롬프트창을 실행.



ipconfig 라는 명령어를 입력해서 위와같이 IP 구성을 볼 수 있습니다. 저는 지금 유선으로 인터넷을 연결했기 때문에 와이파이 및 무선 인터넷이 전부 연결이 안된 상태인데, WIFI, 공유기 환경에서는 무선 LAN 어댑터 WIFI에 뜨는 IP주소를 사용하면 됨.



유선랜 사용자의 경우 스크롤을 아래로 내려보면 이더넷 어댑터 이더넷이라고 있습니다. 여기에서 IPv4에 뜨는 IP를 사용하면 됩니다. 와이파이도 마찬가지로 저것과 같은 양식으로 뜨는데 IPv4 사용하면 됨.


다시 코드로 돌아가서, 해당 아이피 주소의, 포트번호로 바인드를 합니다. 바인드는 간단하게 설명하자면, 주소와 포트번호를 결합하여 소켓을 만드는 것 입니다.


line 5, 서버 소켓은 listen을 합니다. listen은 간단히 말하자면, 연결 요청을 받을 준비 입니다. 

지금 이 페이지에서 bind 나, listen에 대한 이론을 설명하기는 글이 길어지고 복잡해요. 데이터통신 교수님 수업 통해서 배워보도록 해요.ㅎㅎ


line 8, while 1: 이라는 명령어는 C언어에서 while(true) 라고 입력하여 무한루프를 실행하는 것과 같습니다. 아래 내용을 무한루프로 돌리는 이유는, 서버는 한개의 클라이언트와 일대일로 연결하면 역할이 끝나는 것이 아니라, 여러 클라이언트가 접속을 해도 계속적으로 연결을 받아줘야 되기 때문입니다. 다시말해 하나의 클라이언트를 위해 만들지 않기때문. (이번 과제는 아니지만 보통 이부분이 쓰레드로 돌아요 동시접속을 받으려고)


line 9, accept 함수를 통하여 클라이언트로부터 접속을 받습니다. 클라이언트가 접속하지 않는다면 여기서 더 실행되지 않고 멈춰있게 됩니다.

line 10, 방금 만들어놓은 소켓을 통해 클라이언트로부터 recv(리시브 라고 읽음) 받습니다. 옆에 숫자 1024는 최대 1024바이트 까지만 전달 받겠다는 뜻입니다.

line 11, 방금 받은 문자를 upper함수를 이용하여 대문자로 만들어서 변수에 저장합니다.

line 12, 클라이언트로 다시 데이터를 send 합니다.

line 13, 연결을 종료합니다.


1
2
3
4
5
6
7
8
9
10
from socket import *
serverName = '192.168.200.200'
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName,serverPort))
sentence = input('Input lowercase sentence: ')
clientSocket.send(sentence.encode())
modifiedSentence = clientSocket.recv(1024)
print('From Server : ',modifiedSentence.decode())
clientSocket.close()
cs

서버와 마찬가지로 socket을 import 합니다.
serverName에 아까 본 IP주소를 적어주시구요, 포트번호 마찬가지입니다.

서버와 진행이 거의 같죠. socket 함수를 이용하여 클라이언트 소켓을 만들어 줍니다. 파이썬에서 클래스라는 개념이 약간 모호하지만 생성자와 비슷한 맥락으로 해당 함수를 보시면 될 것 같습니다.


line 5, 여기서 서버로 connect를 하는데요. 이때 서버는 listen을 마치고 accept를 실행시켜야 합니다. (간단히 말해서 서버를 먼저 run 하라는 뜻)

line 6, input함수는 C언어에서 scanf와 사용이 동일합니다. 오히려 더 쉽지요 괄호 안의 문장을 띄워주고 사용자로부터 입력을 받아서 리턴하게 됨. 파이썬 2.4버전의 경우 raw_input 이라고 써야 합니다.

line 7, 입력받은 문자를 소켓을 통해 서버로 보냅니다. 여기에서 에러가 발생하는데 교재에는 sentence만 보내라고 되어있음, 근데 전송이 잘 안되서 encode 함수를 이용하여 인코딩해서 보냅니다. 이렇게 보내면 되요.

line 8, 보낸 문자를 서버에서 대문자로 바꾸어 다시 send 했습니다. 그것을 recv 함수를 통하여 받습니다. 마찬가지로 인코딩해서 보낸 문자이고, 디코딩이 안되었기 때문에 decode 함수를 통해서 디코딩 해서 출력해줍니다.

line 10, 연결을 종료합니다.


실제 실행 사진)



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함