본문 바로가기

블록체인 기반 핀테크 및 응용 SW개발자 양성과정 일기

[120일차] 블록체인 ws WebSocket

반응형

 

 

 

 

 

 

 

 

서로의 정보를 공유할 수 있도록 만들기 

 

지난 주 금요일 수업 이어서

 

1. src2 삭제 

 

2. network.js

// 20210906 수업
const MessageAction = {
    // 블록의 마지막 내용
    QUERY_LAST:0, // 0 or "0" string도 상관없다!
    // 모든 블록의 노드 
    QUERY_ALL:1,
    // 실질적으로 추가할지 말지 결정하는 msg
    RESPONSE_BLOCK:2,
}

// type에 따라 처리 (reducer와 비슷)
function initMessageHandler(ws){
    ws.on("message",data =>{
        const message = JSON.parse(data)
        switch(data.type){
            case MessageAction.QUERY_LAST:
                break;
            case MessageAction.QUERY_ALL:
                break;
            case MessageAction.RESPONSE_BLOCK:
                break;
        }
    })
}


.
.
.

function init(ws){
    sockets.push(ws)
    initMessageHandler(ws)
}

데이터 통신은 무조건 String으로 주고 받음 !!!! 그런데 socket.io / express같은 경우 : string으로 결과값을 받지만 이 아이들이 알아서 우리가 사용할 수 있게끔 처리를 해준 상태! 

=> ws 는 바꿔주는 기능이 없어서 JSON.parse(data) 로 string => 객체, json으로 변환해 주어야한다 ! 

 

 

 

3. network.js handler 추가 

소켓 에러 or 소켓 종료 시 sockets 배열에서 제외시키기 

function initErrorHandler(ws){
    ws.on('close',()=>{ closeConnection(ws) })
    ws.on('error',()=>{ closeConnection(ws) })
}

function closeConnection(ws){
    console.log(`Connection close ${ws.url}`)
    sockets.splice(sockets.indexOf(ws),1)
}



function init(ws){
    sockets.push(ws)
    initMessageHandler(ws)
    initErrorHandler(ws)
    write(ws,queryBlockMsg())
}

 

 

 

 

 

 

4. 두 server의 index 비교위한 마지막 블록 가져오기 

 

network.js

// type에 따라 처리 (reducer와 비슷)
function initMessageHandler(ws){
    ws.on("message",data =>{
        const message = JSON.parse(data)
        switch(data.type){
            case MessageAction.QUERY_LAST:
                // write(ws,{type:RESPONSE_BLOCK, data})
                write(ws, responseLastMsg())
                break;
            case MessageAction.QUERY_ALL:
                break;
            case MessageAction.RESPONSE_BLOCK:
                break;
        }
    })
}

case QUERY_LAST (마지막 블록 가져오는 경우) 처리하기 

전에 만든 write() 함수 사용, 두 번째 인자값 : data 만드는 함수 생성

// write() 두 번째 인자 data 만드는 함수 
function responseLastMsg(){
    return{
        type:MessageAction.RESPONSE_BLOCK,
        data:[]
    }
}

이제 data:에다가 마지막 블록을 가져와야함 ! 

const WebSocket = require('ws');
const wsPORT = process.env.WS_PORT || 6005;
const bc = require('./block')                //block 가져오기

 

// write() 두 번째 인자 data 만드는 함수 
function responseLastMsg(){
    return{
        type:MessageAction.RESPONSE_BLOCK,
        data:JSON.stringify([bc.getLastBlock()])
    }
}

bc.getLastBlock()으로 가져온 마지막 block을 배열로 감싸고 string으로 만들기 

 

 

 

마지막 블록을 가져와서 index 비교 => 틀리면 개수가 다른데 !? => 매칭 시켜주기 ! 

 

최초 연결시켜주었을 때 (init()) 함수 실행되었을 때 위의 함수 실행되도록 만들 것 ! 

function init(ws){
    sockets.push(ws)
    initMessageHandler(ws)
    initErrorHandler(ws)
    ws.send(JSON.stringify({type:MessageAction.QUERY_LAST, data:null}))

그런데 send 를 쉽게 보내기 위해 만든게 write() 함수임! 

 


function init(ws){
    sockets.push(ws)
    initMessageHandler(ws)
    initErrorHandler(ws)
    //ws.send(JSON.stroingify({type:MessageAction.QUERY_LAST, data:null}))
    write(ws,queryBlockMsg())
}


function queryBlockMsg(){
    return {
        type:MessageAction.QUERY_LAST,
        data:null,
    }
}

queryBlockMsg() 라는 함수로 또 따로 빼주기 

// 마지막 블록 return 
function queryBlockMsg(){
    return {
        type:MessageAction.QUERY_LAST,
        data:null,
    }
}

 

 

 

 

 

 

 

이제 QUERY_ALL 모든 블록 가져오는 case 완성시키기 

// type에 따라 처리 (reducer와 비슷)
function initMessageHandler(ws){
    ws.on("message",data =>{
        const message = JSON.parse(data)
        switch(data.type){
            case MessageAction.QUERY_LAST:
                // write(ws,{type:RESPONSE_BLOCK, data})
                write(ws, responseLastMsg())
                break;
            case MessageAction.QUERY_ALL:
                write(ws, responseBlockMsg())
                break;
            case MessageAction.RESPONSE_BLOCK:
                break;
        }
    })
}

 

// QUERY_ALL 
function responseBlockMsg(){
    return{
        type:MessageAction.RESPONSE_BLOCK,
        data:JSON.stringify(bc.getBlocks())
        // getBlock() 에서 가져오는 건 배열이어서 굳이 []로 감싸지않아도 된다. 
    }
}

ALL 용도 : 서로 다른 부분을 덮어씌기 위함 - RESPONSE_BLOCK으로 모두 확인 후 -> ALL로 마무으리 

 

 

 

case RESPONSE_BLOCK  코드 작성 

코드가 길거라 handleBlockResponse() 함수로 또 빼기 ! 

// type에 따라 처리 (reducer와 비슷)
function initMessageHandler(ws){
    ws.on("message",data =>{
        const message = JSON.parse(data)
        switch(data.type){
            case MessageAction.QUERY_LAST:
                // write(ws,{type:RESPONSE_BLOCK, data})
                write(ws, responseLastMsg())
                break;
            case MessageAction.QUERY_ALL:
                write(ws, responseBlockMsg())
                break;
            case MessageAction.RESPONSE_BLOCK:
                handleBlockResponse(message)
                break;
        }
    })
}

 

대망의 handleBlockResponse() 함수,,,

to be continue.................

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형