업비트 API - 웹소켓(WebSocket) 연결성공
정말 업비트 API 메뉴얼 부실하다...
샘플 소스라도 하나라도 만들어 보여주면 이렇게 삽질을 하진 않으련만...
결론적으로 아래와 같이 구현을 했습니다.
가장 핵심은 소켓타입을 "arraybuffer" 로 해야하는 것과, 데이터를 arraybuffer로 받고나서 string 으로 변경을 해야하는 점이 체크포인트다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>WebSocket 테스트</title>
<script language="javascript" type="text/javascript">
var wsUri = "wss://api.upbit.com/websocket/v1";
var output;
function init()
{
output = document.getElementById("output");
testWebSocket();
}
function testWebSocket()
{
websocket = new WebSocket(wsUri);
websocket.binaryType = 'arraybuffer';
//websocket.binaryType = 'Blob';
//websocket.binaryType = 'String';
websocket.onopen = function(evt) { onOpen(evt) ;};
websocket.onclose = function(evt) { onClose(evt) };
websocket.onmessage = function(evt) { onMessage(evt) };
websocket.onerror = function(evt) { onError(evt) };
}
function onOpen(evt)
{
writeToScreen("연결완료");
var msg = [
{
"ticket" : "TEST",
},
{
"type" : "ticker",
"codes" : ["KRW-BTC"]
}
];
msg = JSON.stringify(msg);
doSend(msg);
}
function onClose(evt)
{
writeToScreen("연결해제");
}
function onMessage(evt)
{
//console.log(evt.data);
var enc = new TextDecoder("utf-8");
var arr = new Uint8Array(evt.data);
console.log(enc.decode(arr));
writeToScreen('<span style="color: blue;">수신: ' + evt.data+'</span>');
websocket.close();
}
function onError(evt)
{
writeToScreen('<span style="color: red;">에러:</span> ' + evt.data);
}
function doSend(message)
{
writeToScreen("발신: " + message);
websocket.send(message);
}
function writeToScreen(message)
{
var pre = document.createElement("p");
pre.style.wordWrap = "break-word";
pre.innerHTML = message;
output.appendChild(pre);
}
window.addEventListener("load", init, false);
</script>
</head>
<body>
<h2>WebSocket Test</h2>
<div id="output"></div>
</body>
</html>