소켓으로 대화하기
다른 프로그램과 글을 주고받는 [소켓] 모듈을 알아봐요.
[소켓] 모듈은 네트워크로 다른 프로그램과 글을 주고받아요. [파일]처럼 브라우저에서는 쓸 수 없고, Hana 런타임으로 실행할 때만 써요. 이 문서의 실행 버튼에서 가져오면 “‘소켓’ 모듈은 브라우저에서 사용할 수 없어요.“라는 에러가 나는 게 정상이에요. 아래 예제는 내 컴퓨터의 Hana 런타임으로 .hr 파일을 만들어 돌려 보세요.
소켓은 번호로 다뤄요. 연결하거나 듣기 시작하면 소켓 번호(숫자)를 돌려주고, 그다음부터는 그 번호를 도구에 넘겨요.
| 도구 | 하는 일 |
|---|---|
<연결하기>(주소, 포트) |
다른 프로그램에 연결하고 소켓 번호를 돌려줘요 (세 번째 값으로 기다릴 최대 시간(초)을 줄 수 있어요) |
<듣기>(포트) |
연결을 기다리기 시작하고 소켓 번호를 돌려줘요 (내 컴퓨터에서만 들어올 수 있어요. 두 번째 값으로 "0.0.0.0"을 주면 다른 컴퓨터에서도 들어와요. 포트 0은 알아서 빈 포트를 골라요) |
<받아들이기>(듣는 소켓) |
손님이 올 때까지 기다렸다가 그 손님과의 소켓 번호를 돌려줘요 |
<보내기>(소켓, 글) |
글을 보내요 |
<받기>(소켓, 최대 글자 수) |
도착한 글을 최대 그만큼 돌려줘요. 아무것도 없으면 올 때까지 기다리고, 상대가 연결을 끊었으면 빈 글이에요 |
<줄받기>(소켓) |
한 줄을 (줄바꿈은 빼고) 돌려줘요. 상대가 연결을 끊고 남은 게 없으면 비어있음이에요 |
<시간제한>(소켓, 초) |
이 소켓의 기다리는 일(받기, 받아들이기, 보내기)이 최대 몇 초까지 기다릴지 정해요 (0이면 끝까지 기다려요) |
<주소>(소켓) |
듣는 소켓이면 내 주소, 연결된 소켓이면 상대 주소를 주소:포트 꼴로 알려줘요 |
<닫기>(소켓) |
소켓을 닫아요 |
글은 UTF-8이에요. <받기>는 글자가 반쪽으로 잘리지 않게 글자 단위로 돌려줘요.
서버에 연결해서 말 걸기
[소켓]에서 <연결하기>와 <보내기>와 <줄받기>와 <닫기>를 가져오자
'통로'를 [숫자]인 <연결하기>("127.0.0.1", 9000)로 정하자
<보내기>('통로', "안녕하세요\n")를 실행하자
<줄받기>('통로')를 출력하자
<닫기>('통로')를 실행하자
손님을 받는 서버 만들기
[소켓]에서 <듣기>와 <받아들이기>와 <줄받기>와 <보내기>와 <닫기>를 가져오자
'서버'를 [숫자]인 <듣기>(9000)으로 정하자
"손님을 기다려요..."를 출력하자
'손님'을 [숫자]인 <받아들이기>('서버')로 정하자
'받은글'을 [문자열]인 <줄받기>('손님')로 정하자
<보내기>('손님', 틀"메아리: {'받은글'}\n")를 실행하자
<닫기>('손님')를 실행하자
<닫기>('서버')를 실행하자
<받아들이기>는 손님이 올 때까지 멈춰서 기다려요. 손님을 여러 명 받으려면 반복하자 안에서 <받아들이기>를 부르고, 한 손님과의 대화가 끝나면 <닫기>로 그 소켓을 닫아요.
기다리는 시간 정하기
상대가 아무 말이 없으면 <줄받기>나 <받기>는 끝없이 기다려요. <시간제한>을 주면 그 시간이 지났을 때 에러가 나요. 일단 해보자로 감싸서 시간이 지났을 때를 처리할 수 있어요.
[소켓]에서 <연결하기>와 <시간제한>과 <줄받기>를 가져오자
'통로'를 [숫자]인 <연결하기>("127.0.0.1", 9000)로 정하자
<시간제한>('통로', 3)을 실행하자
일단 해보자:
<줄받기>('통로')를 출력하자
오류가 발생했다면:
"3초 안에 답이 없어요."를 출력하자
네트워크 접근 막기
Hana 런타임은 기본으로 네트워크 접근을 허용해요. 믿을 수 없는 스크립트를 돌릴 때는 --allow-net=false 옵션을 붙여 막을 수 있어요. 막으면 [소켓]과 [HTTP]가 “이 실행에서는 네트워크 접근이 꺼져 있어요.“라는 에러를 내요.