서로의 정보를 공유할 수 있도록 만들기
지난 주 금요일 수업 이어서
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.................
'블록체인 기반 핀테크 및 응용 SW개발자 양성과정 일기' 카테고리의 다른 글
[122일차] 블록체인 작업증명 Proof of Work (POW) (0) | 2021.09.08 |
---|---|
[121일차] WebSocket ws로 Server 구현 (0) | 2021.09.07 |
[119일차 복습] 블록체인 네트워크 웹소켓 http ws 웹서버 구축 (0) | 2021.09.06 |
[119일차] 블록체인 네트워크 웹소켓 http ws 웹서버 구축 (0) | 2021.09.03 |
[118일차 복습] 블록체인 새 블록 추가, 연결하고 검증하기 (0) | 2021.09.03 |