TCP통신 파이썬 소켓 프로그래밍

2017. 6. 12. 19:03NetworkHacking/Network




[ TCP통신 주요 메서드 개념정리 ]

[Server]

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

1> socket.bind( addr )               // 서버의 아이피와 포트번호를 고정

2> socket.listen(0)                    // 클라이언트의 연결을 받을 수 있는 상태

3> socket.accept()                    // 클라이언트로부터 소켓과 클라이언트의 주소를 반환

4> socket.recv( byte수 )             // 연결되어진 클라이언트로부터 데이터를 받는다 


[Client]

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

1> socket.connect( 서버addr )     // 서버에게 연결을 시도한다

2> socket.send( data )               // 연결된 서버에게 데이터를 보낸다




[1] TCP통신 서버와 클라이언트의 동기화

[ 서버 / 클라이언트 ]


 import socket

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

 server_socket.bind( ('192.168.2.179', 8585) )    //서버의 아이피와 포트번호 지정

 server_socket.listen(0)  // 클라이언트의 연결요청을 기다리는 상태

 client_socket , addr = server_socket.accept()  // 연결요청을 받음

 data = client_socket.recv( 65535 ) // 클라이언트의 데이터를 가져옴

 print ( "recieve Data : " , data.decode() )


 import socket

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

 sock.connect( ('192.168.2.179',8585) ) // 서버와의 연결시도

 sock.send( "hello".encode() ) // 서버에게 데이터를 전송












[실행결과]

[ 그림1 ]


서버에서 클라이언트로부터 받은 데이터를 출력해주는 결과를 확인할 수 있습니다

이제 받은 데이터를 클라이언트에게 돌려주는 에코서버를 만들어보겠습니다



[2] TCP통신 에코서버

[ 에코서버 / 클라이언트 ]


 import socket

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

 server_socket.bind( ('192.168.2.179', 8585) )

 server_socket.listen(0)

 client_socket , addr = server_socket.accept() 

 data = client_socket.recv( 65535 )

 client.socket.send( data )                          // 받은 데이터를 돌려주는 지점

 print ( "Recieved Data : " , data.decode() )


 import socket

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

 sock.connect( ('192.168.2.179',8585) )

 sock.send( "hello".encode() )

 data= sock.recv( 65535 )              // 데이터를 돌려받는 지점

 print( "데이터를 돌려받았다 : ", data )














[실행결과]

[ 그림2 ]


이를 응용해서 하나 더 만들어보겠습니다. 조건은 다음과 같이 지정하겠습니다

1> 하나의 서버에 여러개의 클라이언트가 접속할 수 있다      ㅡ> Thread 이용

2> 연결된 클라이언트와 서버는 무한히 데이터를 주고받는다 ㅡ> 반복문 이용



[3] 심화과정

[ 그림3 ]


왼쪽이 서버측 코드이고 오른쪽이 클라이언트의 코드입니다

스레드를 사용해서 클라이언트의 연결요청을 여러개 받을 수 있도록 설계하였습니다


[ 그림4 ]


먼저 우측상단의 클라이언트에서 서버에 연결한 후 데이터를 보냈고, 다음 클라이언트를 실행시켜서 데이터를 보내보았습니다

이상으로 TCP통신의 동기화 과정 블로깅을 마치겠습니다