OctoberSkyJs 스터디에서 발표한 프레젠테이션 문서입니다.
NodeJS의 NET 모듈에 대한 소개이며, 관련 예제 링크도 공유드립니다.
[데모] - http://inpost.kr:7777/
[코드] - http://test.youngman.kr/node/ws/ws.js
OctoberSkyJs 스터디에서 발표한 프레젠테이션 문서입니다.
NodeJS의 NET 모듈에 대한 소개이며, 관련 예제 링크도 공유드립니다.
[데모] - http://inpost.kr:7777/
[코드] - http://test.youngman.kr/node/ws/ws.js
NDC Python 게임서버 안녕하십니까? : 몬스터 슈퍼리그 게임 서버 편의 후속으로 기획된 발표입니다. 사내 준비 도중 "너굴" 님의 질문에서 시작되었습니다.
이 발표는 잘 알려진 RPC Framework 인 Thrift, gRPC를 살펴보고 예시로 오델로 게임을 만들어보면서 기존 RPC framework 들이 게임의 서버/클라 구조에 잘 어울리지는 살펴보고 왜 몬스터 슈퍼리그에서 그런 선택을 했는지 살펴봅니다.
그리고 게임에 맞게 RPC 를 설계하고 이를 이용하여 온라인 오델로 게임을 완성해봅니다.
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원탑크리에듀(구로디지털단지역3번출구 2분거리)
탑크리에듀(www.topcredu.co.kr) 제공 C#, Network 기초강좌 입니다. 이번 강좌는 클라이언트가 서버로 데이터만 전송하는 간단한 TCP 클라이언트 및 서버 작성부터 서버가 다시 클라이언트로 에코우 시키는 예제, 이를 멀티쓰레드로 변경하여 여러 클라이언트를 상대할 수 있도록 소스를 변경하여 적성된 예제 입니다. 동영상으로도 제작될 예정이며 동영상은 http://www.topcredu.co.kr 또는 http://www.facebook.com/topcredu.co.kr, http://ojc.asia 에서 확인하실 수 있습니다.
Block chain architecture and hyperledger fabric overview병준 김
블록체인에 대한 기본 개념과 블록 체인 기술 구성에 대해서 알아본다. 기술 구성에는 P2P네트워크, Smart Contract, 전자서명과 해시, 합의 알고리즘이 있다. 각 구성 요소들이 하는 역할과 목적, 어떻게 작동하는 지에 대해서 알아본다. 그리고 Hyperledger Fabric의 개요에 대해서 살펴본다.
오픈 소스 Actor Framework 인 Akka.NET 을 통해 온라인 게임 서버를 어떻게 구현할 수 있는지를 설명합니다. Actor Model 에 대한 기본 이해부터 Scale-out 가능한 게임 서버 구축까지 전반적인 내용에 대해 알 수 있습니다. 설명을 위해 클라이언트는 Unity3D 를 사용할 예정입니다.
1. TCP/IP Protocol
제작자 : 쿠디(cooddy)
제작자 Blog :
Tistory Blog : http://cooddy.tistory.com/
2. TCP/IP Protocol
• 프로토콜(Protocol) : 통신 규칙
• 현재 TCP/IP Protocol이 주류
• TCP/IP Protocol이란?
• TCP/IP Protocol이란 TCP프로토콜 + IP프로토콜을 함께 부르는 용어
• IP 프로토콜은 네트워크에 연결된 개개의 컴퓨터에 유일한 주소를 붙이는 규칙을 정의한 프로토콜
• IP 프로토콜에 의해 컴퓨터에 붙여지는 주소를 IP 주소(IP address)라고 함
• IP주소는 인터넷 통신 서비스 회사에 비용을 지불하고 할당
• 집에서 개인적으로 인터넷 통신 서비스에 가입할 때는 보통 하나의 IP 주소를 할당
• IP주소 확인을 위해서는 윈도우의 경우 cmd 창에서 “ipconfig” 를 치면 나옴
• IP주소
• 고정IP주소 : 컴퓨터 재부팅해도 항상 같은 IP주소가 나옴
• 유동IP주소 : 컴퓨터를 재부팅하면 다른 IP주소가 나옴
• IP주소는 컴퓨터들을 유일하게 식별하기 때문에 통신 프로그램이 대상 컴퓨터를 찾을 때 IP주소를 이용
• But, 통신 프로그램이 실질적으로 데이터를 교환하는 대상은 컴퓨터가 아닌 프로그램이기 때
문에, 네트워크 통신을 하기 위해서는 상대 컴퓨터에서 작동 중인 여러 프로그램들 중 하나를
식별해야 함
• 식별은 OS에서 관리하는 포트(Port)를 통해 가능
3. TCP/IP Protocol
• 포트(Port)란?
• 네트워크를 통해 데이터를 주고받는 가상의 출입구
• TCP/IP를 지원하는 OS에서는 포트마다 번호를 붙여서 관리
• 번호는 0~65535범위
• IP 주소와 함께 포트번호를 사용하면 통신할 컴퓨터의 프로그램을 찾을 수 있음
• 같은 포트를 여러 프로그램이 사용하려고 하면 안 됨
• 통신 프로그램을 작성할 때는 다른 프로그램이 사용하고 있는 포트 번호를 확인
• 포트번호 확인법
• OS에서 ‘netstat’ 명령을 실행해서 확인
• 주의점
• 0~1023 까지는 시스템이 사용하는 포트번호
• 1024 이상의 포트 번호 중 하나를 선택해야 함
• 도메인(Domain)
• 숫자로 구성된 IP주소는 기억이 어렵기 때문에 도메인 이름을 등록해서 IP 주소 대신 사용하기도 함
• 이런 이름은 도메인을 관리하는 공인 기관에 대가를 지불하고 등록 해야 함
4. TCP/IP Protocol을 이용한 데이터 교환
• TCP/IP 프로토콜로 통신하는 두 프로그램은 데이터 교환전에 먼저 연결(Connection)을 맺어야 함
• 연결을 맺기 위해선 한 프로그램은 포트를 열어놓고 연결 요청이 오기를 기다려야 함 서버 프로그램
• 그리고 다른 프로그램은 그 포트로 연결 요청을 보내야 함 클라이언트 프로그램
클라이언트
프로그램
서버
프로그램
1) 포트를 열어놓고
연결 요청이 들어오기를 기다림
2) 서버에게 연결 요청
포
트
포
트
3) 연결이 맺어지면 연결 통로를 통해
데이터를 주고받을 수 있음
5. TCP/IP 통신 프로그램의 작성 방법
• 서버와 클라이언트는 연결을 맺을 때도 포트를 사용해야 하고, 데이터를 교환 시에도 포트를 사
용해야 함
• But, 포트는 운영체제 관점에서 보았을 때 데이터 통신 출입구이고, 프로그램 안에서는 직접 사용
할 수 없음
• JAVA 프로그램에서는 포트 사용을 위해 소켓(Socket)을 사용
• 클라이언트 소켓 & 서버 소켓
• 서버소켓
• 서버 프로그램에서만 사용되는 소켓
• 이 소켓은 포트를 통해 연결 요청이 오기를 기다리다가, 연결 요청이 오면 클라이언트와 연결을 맺고 또 다른 소켓(클라이언트 소켓)을 만듬
• 실제로 데이터 전송에 사용되는 것은 이 새롭게 만들어진 소켓(클라이언트 소켓)임
• 클라이언트 소켓
• 서버 프로그램으로 연결 요청을 하는 일과 데이터 전송을 하는 일을 둘 다 함
6. TCP/IP 통신 프로그램의 작성 방법
클라이언트
프로그램
서버
프로그램
1) 서버 소켓을 통해
연결 요청이 들어오기를 기다림
2) 서버에게 연결 요청
포
트
포
트
소
켓
서버
소켓
클라이언트
프로그램
서버
프로그램
3) 서버 프로그램은 서버 소켓이 만든
소켓을 통해 데이터를 주고 받음
4) 클라이언트 프로그램은 연결 요청에 사용한
소켓을 통해 데이터를 주고 받음
포
트
포
트
소
켓
서버
소켓 소
켓
소켓을 이용한 클라이언트 프로그램과 서버 프로그램의 통신 과정
7. 클라이언트/서버 프로그램의 작성
• 서버 소켓과 클라이언트 소켓은 자바 프로그램 안에서 모두 객체로 표현
• 서버 소켓 : java.net Package에 있는 ServerSocket 클래스
• 클라이언트 소켓 : java.net Package에 있는 Socket 클래스
• 서버 소켓을 생성하고 사용하는 방법
• 서버 소켓을 생성할 때는 생성자 파라미터로 포트 번호를 넘겨주어야 함
• 이때 넘겨주는 포트 번호는 다른 프로그램이 사용하지 않는 포트 번호라야 함
• ServerSocket serverSocket = new ServerSocket(9000);
• accept() 함수
• ServerSocket 객체의 함수, 클라이언트로부터 연결 요청이 오기를 기다리는 기능
• Socket socket = serverSocket.accept();
• accept 함수는 포트를 열어두고 연결 요청이 오기를 기다리다가, 연결 요청이 들어오면 클라이언트 프로그램과 연결을 맺고 그 후 그 결과를 가지고 클라
이언트 소켓을 생성하여 리턴
포트 번호
서버 소켓으로 연결 요청이 들어오면 연결을 맺고,
클라이언트 소켓을 생성해서 리턴하는 함수
8. 클라이언트/서버 프로그램의 작성
• 클라이언트 소켓을 생성하고 사용하는 방법
• Socket 클래스의 생성자를 이용하여 클라이언트 소켓을 직접 생성해야 함
• 파라미터(인자)로는 서버 프로그램이 있는 컴퓨터의 IP주소와 포트 번호를 넘겨주어야 함
• Socket socket = new Socket(“219.153.21.14”, 9000);
• Socket 클래스의 생성자를 호출하면 이 생성자 안에서 서버 프로그램으로 연결 요청이 전송되고, 그 결과 클라이언트
프로그램과 서버 프로그램의 연결이 맺어짐
• 클라이언트와 서버 프로그램은 소켓을 생성하는 방법은 다르지만, 일단 클라이언트 소켓이 생성
되고 난 다음에 그 소켓을 가지고 데이터를 주고받는 방법은 동일
• ※ 클라이언트 소켓을 생성할 때는 클라이언트 프로그램이 사용할 포트 번호를 넘겨줄 필요 없음
• 클라이언트 소켓이 생성되는 과정에서 OS로부터 사용되지 않는 포트 번호를 자동으로 할당받기 때문
서버 프로그램이 열어 놓은 포트 번호
서버 프로그램이 있는 컴퓨터 IP 주소
9. InputStream/OutputStream
• getInputStream()/getOutputStream()
• getInputStream() : 메시지 수신에 사용할 입력 스트림 리턴(InputStream을 가져오는(get) 함수)
• InputStream in = socket.getInputStream();
• getOutputStream() : 메시지 송신에 사용할 출력 스트림 리턴(OutputStream을 가져오는(get) 함수)
• OutputStream out = socket.getOutputStream();
• out.write(data); 파라미터로 넘겨준 데이터를 송신
• int data = in.read(); 수신된 데이터를 읽어서 리턴
• close() 함수 : 데이터의 전송을 모두 마친 다음에는 클라이언트 소켓을 닫아야 함
• socket.close();
• serverSocket.close(); 서버 소켓도 마찬가지로 close 함수를 호출해서 닫을 수 있음
• ※ 소켓을 사용하고 나서 닫지 않으면, 운영체제로부터 할당받은 포트번호가 해제되지 않기 때문
에 다른 프로그램이 그 포트 번호를 사용할 수 없는 상태로 남아 있게 됨
10. 클라이언트/서버 프로그램 작성하기
TCP/IP 프로토콜에서는 데이터 전송의 기본 단위가 바이트이기 때문에, 문자 데이터를 전송하기 위해
송신할 문자를 바이트 타입으로 바꾸고, 수신된 바이트를 문자 타입으로 바꾸는 과정이 필요
11. InputStreamReader/OutputStreamReader Class(java.io)
• InputStreamReader/OutputStreamReader
• 앞에서 송신 할 때 문자열을 바이트 배열로 치환하고 수신할 때 바이트 배열을 문자열로 치환 하였음
• 이를 자동으로 해주는 클래스가 바로 InputStreamReader/OutputStreamReader
• InputStreamReader Class
• 입력된 바이트 스트림을 문자 스트림으로 바꿔주는 클래스
• 생성자에 소켓으로 부터 얻은 InputStream 객체를 넘겨주면, 네트워크로 수신된 데이터를 문자 스트림 형태로 읽을
수 있는 InputStreamReader 객체가 생성(데이터 배열 문자열)
• InputStreamReader reader = new InputStreamReader(InputStream 객체);
• OutputStreamReader Class
• 문자열 바이트 배열로 바꿔주는 클래스
• But, 출력하는 데이터가 주로 문자열일 경우 PrintWriter 클래스를 사용하는 것이 더욱 편리
• PrinterWriter writer = new PrinterWriter(OutputStream 객체);
• 이렇게 생성한 PrintWriter객체를 가지고 println(), print(), printf() 메소드를 호출하면 파라미터로 넘겨준 문자열이 바이트 스트림으로 변환되어 네트워크
로 전송