상세 컨텐츠

본문 제목

노드js_그누보드와 연동_02

PHP(Class)

by 김일국 2017. 7. 18. 15:58

본문

오늘은 그누보드와 연동하기 전에 노드JS와 일반 호스팅의 홈페이지와 데이터 전송에 대해서 기본기술을 공부해 보기로 한다.

예제는 LED전구를 켜고 끄는 자바스크립트를 기준으로 하였다.

- 순수 자바스크립트로 구현된 파일 -> 노드js를 이용해서 실시간 현황파악이 가능하게 구현된 파일

장점은 시설 관리자입장에서 사용자가 전구를 켜거나, 끈 사항을 관리자 웹화면에서 화면 재로딩 없이 확인 가능한 현황판 역할을 할 수 있다.

http://timespace7.dothome.co.kr/index.html      ->      http://timespace7.dothome.co.kr/nodejs.html

지난 포스트( http://blog.daum.net/web_design/476 )에서 노드js서버를 goorm.io의 무료 계정을 사용한다고 공지하였다.

(*주) 무료계정은 작업할때만, 노드js서버가 살아 있고, 로그아웃하면, 노드서버가 중지된다.

어찌되었든, 여기서는 노드js와 호스팅의홈페이지사이의 소켓통신 방법을 정리하는 시간을 가져보겠습니다.

-노드서버의 app.js 전문(주석을 참조하면서 보세요)

------------------------------------------------

var port = 9001;
var app = require('express')();//express 웹프레임웍의 일반적인 사용과정.
var http = require('http').Server(app);//http서버 객체생성 시 app(express) 프레임웍을 전달.
var io = require('socket.io')(http);//socket.io 소켓통신 객체생성 시 http서버 객체를 전달.
var msg = {//전역변수로 설정. 이유는,신규사용자가 페이지로딩시 현재상태를 가져갈수 있도록 처리
   msg: '' //초기에는 실행상태를 갖지 않게 한다.
  };
//.listen은 클라이언트에서 서버로 접속을 받기위해 대기하는 명령.
http.listen(port, function(){//노드js서버 실행여부 확인, 정상실행되었다면, 익명콜백함수 실행.
    console.log('Socket IO server listening on port : ' + port);//서버콘솔에 listening on...이 출력.
});

//.on은 클라이언트에서 서버로 소켓통신(명령또는 데이터를 주고받기)위해 대기하는 명령
io.on('connection', function(socket){//클라이언트에서 connect 소켓연결이 발생하면 callback(socket)함수를 실행.
 console.log('a user connected');//서버콘솔에 a user connected를 출력.
 // 접속된 모든 클라이언트에게 메시지를 전송한다
    io.emit('onOff', msg);//아무버튼액션이 없을때인 초기접속시 전역변수에 저장된 현재 상태값을 클라이언트에 전송한다.
 socket.on('disconnect', function(){//클라이언트에서 disconnect 소켓연결끊김이 발생하면, 익명콜백함수 실행.
  console.log('user disconnect');//서버콘솔에 user disconnect 출력.
 });
 
 //클라이언트에서 메세지가 수신되면
 socket.on('onOff', function(data){
  console.log('누르신 버튼은 %s', data.msg);
  msg = {
   msg: data.msg //전송할 데이터가 1개 이기 때문에 꼭 이럴 필요는 없다. 그래도 Json튜플형식으로 보내는 방식을 설명하기 위해...
  };
  // 메시지를 전송한 클라이언트를 제외한 모든 클라이언트에게 메시지를 전송한다
     //socket.broadcast.emit('onOff', msg);
  // 접속된 모든 클라이언트에게 메시지를 전송한다
     io.emit('onOff', msg);//여기에서 범위를 유추해 볼 수 있다. io > socket
 });
});


------------------------------------------------------------------------------------------------------------------------

-클라인트(웹호스팅용) 홈페이지인 nodejs.html 전문

-----------------------------------------------

<?php
$remot_file_name = "http://gnujs.run.goorm.io/socket.io/socket.io.js";
 
function remoteFileExist($filepath) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$filepath);
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    if(curl_exec($ch)!==false) {
        return true;
    } else {
        return false;
    }
}
?>
<? if(remoteFileExist($remot_file_name) == 1) { ?>
    원격지에 파일이 존재합니다.(노드js서버 실행여부확인)
<? } else { ?>
    원격지에 파일이 존재 하지 않습니다.
<? } ?>

<!doctype html>
<html>
<head>
    <title> NodeJs GPIO INPUT/OUTPUT DEMO </title>
    <meta charset="UTF-8">
 <style>
 body {
    background-color: black;
    text-align: center;
 }
 p {
  font-size: 50px;
  color : yellow;
 }
 #state {
    font-size: 80px;
    color : red;
    text-decoration: none;
 }
 </style>
    <script src='http://gnujs.run.goorm.io/socket.io/socket.io.js'></script>
    <!-- 실제 위 서버경로에 socket.io.js를 사용자가 생성하지 않아도, 노드서버가 실행되어 있다면, 자동으로 생성됨.
 즉, 위 경로를 URL로 접근시 파일을 다운로드 할 수 있다면, 노드서버가 실행중이라고 판단하면 됨 -->
    <script>
    var serverUrl = 'http://gnujs.run.goorm.io';
    var socket = io.connect(serverUrl);
    </script>
</head>

<body>
    <p>노드Js 사용</p>
    <input type="button" value="켜기" style="WIDTH:200pt; HEIGHT:80pt; font-size:50pt" id=on">
           
    <input type="button" value="끄기" style="WIDTH:200pt; HEIGHT:80pt; font-size:50pt" id="off">

  <br/>
  <p> LED is now <span id="state"> </span> state. </p>
 <script type="text/javascript">
    var state = "off";
 document.getElementById("state").innerHTML = state;
    //클라이언트에서 -> 노드서버로 메세지전송.
 document.getElementById(on").onclick = function(){
        <? if(remoteFileExist($remot_file_name) == 1) { ?>
        var $msgOnOff = this.id;
        socket.emit(onOff", {msg:$msgOnOff} );//노드서버로 메세지를 전송(on).
        <? }else{ ?>
          alert('노드js서버가 실행중이 아닙니다.\n따라서 실시간으로 onOff가 보이진 않게됩니다.');
            document.getElementById("state").innerHTML = this.id; //디버그  
        <? } ?>
 }
    document.getElementById("off").onclick = function(){
        <? if(remoteFileExist($remot_file_name) == 1) { ?>
            var $msgOnOff = this.id;
            socket.emit(onOff", {msg:$msgOnOff} );//노드서버로 메세지를 전송(off).
  <? }else{ ?>
            alert('노드js서버가 실행중이 아닙니다.\n따라서 실시간으로 onOff가 보이진 않게됩니다.');
            document.getElementById("state").innerHTML = this.id; //디버그
        <? } ?>
 }
    //노드서버에서 -> 클라이언트로 메세지 수신.
    socket.on(onOff", function(data){
     document.getElementById("state").innerHTML = data.msg;
    });
 </script>
</body>
</html>

----------------------------------------------------------------------------


위 2개의 파일 app.js(노드js서버), nodejs.html(호스팅용홈페이지) 2개로 실시간 데이터변환(소켓통신)을 구현할 수 있음을 확인 할 수 있다. 

그리고, 관련 기술은 주석으로 파악하실 수 있습니다.

다음 포스트에서는 이제 본격적으로 첫번째 포스트인 노드js_그누보드와 연동_01 내용을 분석해 보도록 합니다.

관련글 더보기

댓글 영역