Head vs breakz

[Code] - Python Socket 본문

Head/Code

[Code] - Python Socket

headbreakz 2020. 2. 11. 17:11

Python Socket 프로그래밍

  • server
import socket

#AF_INET = 주소체계 ,SOCK_STREAM = TCP 설정
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#localhost에는 ip주소값 , 12345는 클라이언트 접속을 대기한느 포트
server_socket.bind(('localhost', 12345))
server_socket.listen(0)

#대기상태 후 clinet가 반응 있으면 실행
client_socket, addr = server_socket.accept()
data = client_socket.recv(65535)

#받은 데이터를 출력
print(data.decode())

client_socket.send(data)
  • client
import socket

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

sock.connect(('localhost', 12345))
sock.send('hello'.encode())

data = sock.recv(65535)

print(data.decode())
  • server - 실습
#simple http server
import socket
from datetime import datetime

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

server_socket.bind(('localhost', 80))
server_socket.listen(0)
print("listening")

if True:

    client_socket, addr = server_socket.accept()
    print("accepting")
    data = client_socket.recv(65535)
    data = data.decode()

    header=data.split('\r\n')
    filename=header[0].split(" ")[1]
    file=open("."+filename,'rt', encoding='utf-8')
    html=file.read()

    header='HTTP/1.0 200 Ok\r\n\r\n'

    client_socket.send(header.encode("utf-8"))
    client_socket.send(html.encode("utf-8"))
    client_socket.close()
  • server - 실습추가
import socket
import threading
from datetime import datetime
import subprocess

def httpprocess(client_socket) :
    data = client_socket.recv(65535)   
    data = data.decode()
    print(data)
    try :    
        headers = data.split("\r\n")
        filename = headers[0].split(" ")[1]

        if '.py' in filename:
            header = 'HTTP/1.0 200 OK\r\n\r\n'   
            html = subprocess.check_output(['python.exe', '.' + filename])
            html = html.decode('cp949')
            client_socket.send(header.encode("utf-8"))    
            client_socket.send(html.encode("utf-8"))            
        elif '.html' in filename:
            file = open("."+ filename, 'rt', encoding='utf-8')
            html = file.read()    
            header = 'HTTP/1.0 200 OK\r\n\r\n'        
            client_socket.send(header.encode("utf-8"))
            client_socket.send(html.encode("utf-8"))
        elif '.jpg' in filename or '.ico' in filename:         
            client_socket.send('HTTP/1.1 200 OK\r\n'.encode())
            client_socket.send("Content-Type: image/jpg\r\n".encode())
            client_socket.send("Accept-Ranges: bytes\r\n\r\n".encode())
            file = open("." + filename, "rb")            
            client_socket.send(file.read())  
            file.close()               
        else :
            header = 'HTTP/1.0 404 File Not Found\r\n\r\n'        
            client_socket.send(header.encode("utf-8"))
    except Exception as e :
        print(e)         
    client_socket.close()


server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 80))
server_socket.listen(0)
print("listening")

while  True :
    client_socket, addr = server_socket.accept()
    client_socket.settimeout(3)
    print("accepting")
    t = threading.Thread(target=httpprocess, args=(client_socket,))
    t.start()
Comments