해결법을 알고나니 정말 아.. 소리밖에 안나왔던 문제

삽질 정말 많이 함

 

교안에 있던 소켓을 이용한 간단한 웹 서버 예제

(사실 이 코드 복붙해서 돌리면 돌아가는데.. 문제 발생하는 분들은 아래로)

import socket
def main():
  # 연결은 TCP로!
  listen_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  listen_sock.bind(('', 8080)) # 8080 포트에 바인딩
  listen_sock.listen(1) # 기다리기 시작
  while 1:
    conn, addr = listen_sock.accept() # 커넥션을 기다림
    data = conn.recv(1024)
    conn.sendall("""HTTP/1.1 200 OK 
    
    <html><body>Hello, world!</body></html>""".encode('utf-8')) # HTTP 규격에 맞게 메시지를 전송
    conn.close()
main()

아래와 같이 포트 번호 맞추고 브라우저를 열면 결과가 나와야 함

나는 포트번호 8888로 변경하고 돌렸음

왼쪽처럼 떠야하는데.. 아무것도 안 뜸

그대로 코드 따라쳐서 vscode로 돌렸는데 브라우저에 아무것도 안뜸

우분투에서도 돌려보고 VM virtual box도 삭제했다가 다시 깔아보고.. python idle에서도 돌려보고..

인터넷에 검색해서 예제 코드와 정말 비슷한 코드도 찾아서 그대로 복붙해서 돌렸는데 여전히 안됨..

이렇게 엄청 삽질하다가 친구한테도 물어봤는데 친구도 나처럼 브라우저에 아무것도 안뜬다고 해서 아 나만 있는 문제가 아니구나! 하고 안심했는데 나중에 해결 방법 알고나니 걍 우리 둘만 있던 문제임

 

친구야 그렇게 됐다..

 

아무튼 문제는 HTTP 메시지에 있었음

 

결론적으로 말하면 HTTP 메시지 구조에 대한 이해가 부족해서 해결법도 빨리 못찾고 삽질했던 게 아닌가..

HTTP 메시지는 헤더와 바디 사이에 공백 라인이 필수로 있어야 함

 

내가 손으로 따라치다가 놓친 건지.. 저 두 줄 사이에 공백을 넣었어야 했는데 그걸 넣지 않았고...

며칠 동안 삽질하다가 알아낸 해결법..

# (1)
conn.sendall("""HTTP/1.1 200 OK 
    
    <html><body>Hello, world!</body></html>""".encode('utf-8'))
    
# (2)
msg = "HTTP/1.1 200 OK\n\n<html><body>This time is {}</body></html>".format(time.ctime())
print("This time is {}".format(time.ctime()))
conn.sendall(msg.encode("UTF-8"))

(1)처럼 그냥 엔터 두 번 쳐주던가 (2)처럼 OS에 맞게 개행 문자 2개 넣어 주던가...

 

나중에 다른 블로그에 있던 예제는 그럼 왜 안돌아갔나 싶어서 다시 가서 확인해보니 그 블로그 예제도 공백라인이 없더라.. 이런 문제를 볼 사람들이 얼마나 되겠나 싶지만.. 그래도 나처럼 있다면.. 고통받지 말라고.. 올려봄

복사했습니다!