본문 바로가기

python/python 응용

Python 소켓을 이용해 서버와 클라이언트 서로 통신해보기

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
Python 소켓을 이용해 서버와 클라이언트 서로 통신해보기

 

 

 

 

 

 

 

 

 

이글은 제가 공부하고 이해한 것을  정리한 내용이라 틀린 부분이있을수 있습니다.


어제에 이어 오늘도 소켓공부를 해보았다.


공부하면서 느낀건데 파이썬으로 소켓다루기는 매우간단한거같다


서버쪽 코드를 먼저 만들어봤다


일단은 소켓을 생성해준다


1
2
3
4
5
6
7
import socket
 
try:
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    print("소켓 생성완료")
except socket.error as err :
    print("에러 발생 원인 :  %s"%(err))
cs


그다음 서버아이피와 포트를 지정해준후


클라이언트에서 요청이 오기전까지 기다리는 코드를 만들어봤다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import socket
def decoding(a):
    a=a
    b=a.decode()
    print(b)
try:
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    print("소켓 생성완료")
except socket.error as err :
    print("에러 발생 원인 :  %s"%(err))
 
 
HOST='localhost'
port=1234
s.bind((HOST,port))
s.listen(5)
print("%d 포트로 연결을 기다리는중"%(port))
 
cs


그다음 클라이언트에서 서버쪽에서 연결을 요청하고 접속에 성공햇을때


나는 누가 접속한것인지 확인하고  클라이언트에게 간단한 메세지를 보내보았다.


1
2
3
4
5
6
temp="서버에서 클라이언트로 보내는 메세지입니다"
msg=bytearray(temp,'utf-8')
while True:
    c, addr = s.accept()
    print(addr,"사용자가 접속함")
    c.send(msg)
cs


s.accept()을 통해 두개의값을 알수있는데 그중 2번쨰로오는 값은


클라이언트쪽 정보이다.


클라이언트 정보를 addr에 저장하구 출력해보면 클라이언트쪽 주소와 포트를 알수가있다..


그다음은 c.send(msg) 이다.


이부분은 서버에서 클라이언트에게 메세지를 보낼수있는데


2.x 버전에서는 그냥 c.send("메세지입니다") 이런식으로 보낼수있는거같은데


필자는 3.5.1 버전이라 문자열을 bytearray로 인코딩해서 보내야하는거같다.





그다음에는 클라이언트에서 서버쪽으로 메세지를 보낸것을 받을때 코드를 작성해봣다


간단하다 c.recv(1024) 이런식으로 받아주면된다.


여기서 1024는 1024바이트만큼 공간을 확보한것이다


또 중요한것은 클라이언트쪽환경도 3.5.1 버전이라 bytearray로 인코딩해서 보냇기때문에


받은값을 디코딩을해줘야 재대로 읽을수있다.


디코딩 과정을 간단한 함수로 만들어봤다.



1
2
3
4
def decoding(a):
    a=a
    b=a.decode()
    print(b)
cs


필자는 서버쪽 코드를 이렇게 작성해봤다

#server.py

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
import socket
def decoding(a):
    a=a
    b=a.decode()
    print(b)
try:
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    print("소켓 생성완료")
except socket.error as err :
    print("에러 발생 원인 :  %s"%(err))
 
temp="서버에서 클라이언트로 보내는 메세지입니다"
msg=bytearray(temp,'utf-8')
HOST='localhost'
port=1234
s.bind((HOST,port))
s.listen(5)
print("%d 포트로 연결을 기다리는중"%(port))
while True:
    c, addr = s.accept()
    print(addr,"사용자가 접속함")
    c.send(msg)
    decoding(c.recv(1024))
    c.close()
 
cs


통신을 다햇을경우에는 꼭 소켓을 닫아줘야한다.





이번에는 클라이언트쪽 코드다.


#client.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import socket
def decoding(a):
    a=a
    b=a.decode()
    print(b)
 
temp="클라이언트에서 서버로보내는 메세지입니다"
msg=bytearray(temp,'utf-8')
try:
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    print("소켓 생성완료")
except socket.error as err :
    print("에러 발생 원인 :  %s"%(err))
 
port=1234
 
s.connect(('localhost',port))
decoding(s.recv(1024))
s.send(msg)
s.close()
cs


매우간단한거같다.


클라이언트쪽도 할거다하면 소켓을 꼭닫아주자.


영어문서보고 혼자공부한거라 틀린거있으면 지적해주세요.