yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆

Python을 이용한 소켓 프로그래밍 (에코 서버,클라이언트 구현) 본문

개발/Python

Python을 이용한 소켓 프로그래밍 (에코 서버,클라이언트 구현)

yehey 2020. 9. 13. 23:40

Python에서 소켓을 사용하려면 socketimport 해야함

 Client 소켓 구현 

import socket
#1번째 방법
with socket.socket() as s:	 #close를 해주지 않아도 자동으로 닫음
    
    addr=("www.daum.net",80) 	#도메인 주소, 포트, 443web
    
    s.connect(addr)		#통신 시작
    
    s.send("GET \n".encode()) 	#GET 메서드, 네트워크로 데이터를 보내려면 encoding을 해주어야함
    
    data=s.recv(1024)		#데이터 1024byte만큼 받기
    
    print(data.decode())
    
#2번째 방법 s=socket.socket()  s.close를 해주어야함

 

 

실행 결과화면

GET 메서드를 encoding해서 서버에게 리소스를 요청하고

서버로부터 응답을 받아 decoding 후 출력한 결과이다.

 

 Server 소켓 구현 

import socket

with socket.socket() as s:
    addr = ("0.0.0.0",70)#80: port, 0.0.0.0: ip주소, 모든 ip주소를 받음
    s.bind(addr)	#소켓 바인딩
    s.listen()		#client 연결 요청 대기
    print("start server...")#서버 개통 완료시 출력
    
    conn, addr=s.accept()#2개의 결과를 반환, 연결수락
    #conn: s객체 대신 쓰일 객체, 데이터 송수신에 사용, 1:1통신
    #addr: 클라이언트 주소
    
    print("accept {}:{}".format(addr[0],addr[1]))#연결된 clnt주소 출력

  

소켓을 이용해 서버를 개통한 후 "start server..."를 출력한다. 

클라이언트 요청을 대기하다가 클라이언트가 연결되면 연결된 클라이언트의 주소를 출력한다.

 

client 연결 요청

 

server 결과화면

 

 에코 클라이언트, 서버 구현 

: 클라이언트가 입력한 문자열을 서버가 받아 다시 클라이언트에게 전송

=> 즉 내용이 변하지 않고 입력한 문자가 그대로 출력된다.

 

#echo_server.py

import socket
addr=("0.0.0.0",4444) #포트번호 4444
with socket.socket() as s:	#소켓 할당
    
    s.bind(addr)	#소켓 바인딩
    s.listen()		#client의 연결요청 대기
    print("Server is started...")
    
#------------------------------------서버 개통과정--------------

    conn,addr = s.accept()	#client 연경 요청을 수락
    print("accept {}:{}".format(addr[0],addr[1]))	#연결된 client 정보 출력
    while(1):	#무한반복
        data=conn.recv(1024)	#client가 보낸 메시지를 data에 저장
        if(data.decode()=="finished"):	#data decoding 결과가 finished면
            break	#반복문 탈출
        conn.send(data)			#data를 그대로 client에게 전송
        print(data.decode())	#보낸 데이터 읽기
    print("Server finished")	#서버 종료 알리기
#echo_clnt.py

import socket
addr=("127.0.0.1",4444)

with socket.socket() as s:	#소켓 생성
    s.connect(addr)		#소켓 연결 요청
    while(1):		#무한 반복
        str1=input("echo: ")	#사용자에게 입력받음
        if(str1=="finised"):	#finished가 입력되면
            s.send(str1.encode())	#메시지 encoding해서 전송
            s.close()			#소켓 닫음
        s.send(str1.encode())	#메시지 encoding 후 전송
        data=s.recv(1024)		#server로부터 받은 메시지 data에 저장
        print(data.decode())    #data decoding후 출력

    print("program finish")

 

실행화면

왼쪽: server / 오른쪽: client

해결 못한 문제점: 서버의 소켓은 잘 닫히는데, client의 소켓은 닫히지 않는다....

'개발 > Python' 카테고리의 다른 글

윈도우 키로거  (0) 2020.11.15
Unix 패스워드 트래커  (0) 2020.11.15
포트 스캐너 (스레드, Nmap, optparse)  (0) 2020.10.11
python을 이용한 백도어 개발  (0) 2020.09.28
HTTP 요청 메시지, Fuzzing  (0) 2020.09.21
Comments