본문 바로가기
GameMaker강좌[GMS2]/네트워크강좌

[게임메이커 강좌-네트워킹][GMS2] 게임메이커 네트워킹 기능

by 타락카얀 2024. 12. 19.
728x90

 

 

GAME MAKER 강좌

 

KAYAN

 

 

 

 

 

 

 

◈ 네트워킹 기능

 

GameMaker 네트워킹 기능은 모든 플랫폼에서 산업 표준인 소켓을 기반으로 합니다.

소켓을 사용하면 GML을 사용하여 클라이언트와 서버를 모두 만들 수 있으며,

 

(▲ 클라이언트와 서버)

 

클라이언트/서버 모델을 사용하여 싱글 플레이어 게임도 만들 수 있습니다.

 

(▲ 클라이언트/서버)

 

 

기본적으로 소켓은 네트워크의 포트(Port)를 통해 보내고, 받고, 연결하고, 수신할 수 있는 객체입니다.

TCP를 사용하는 경우 IP 주소(예: 192.168.1.10)를 사용하여 한 소켓을 다른 IP 주소(예: 192.168.1.11)

다른 소켓에 연결합니다.

 

(▲ 클라이언트와 서버)

 

연결되면 이 두 소켓은 network_send_* 함수(예: network_send_packet)와 이에 의해 발생하는

전용 네트워크 비동기 이벤트(Network Async Event)를 사용하여 데이터를 주고받을 수 있습니다.

 

네트워크 비동기 이벤트는 수신된 데이터와 기타 세부 정보를 포함하는 DS 맵을 생성하며,

주고 받는 데이터의 세부 정보를 관리할 수 있습니다.

 

※[참고] : Windows, macOS 및 Ubuntu에서는 최대 1024개의 소켓이 제한되고, 다른 모든 플랫폼에서는 64개의 소켓이 제한됩니다.

 

UDP 프로토콜은 연결이 없으므로 소켓을 연결하지 않고 network_send_udp를 사용하여 IP 주소와 포트로 직접 데이터를 보냅니다.

 

※[참고] : GameMaker는 Nintendo Switch, PlayStation 4 및 PlayStation 5를 제외한 모든 플랫폼에서 IPv4 및 IPv6 주소를 지원합니다.

 

 

IP 주소(영어: Internet Protocol address, IP address, 표준어: 인터넷규약주소)는 컴퓨터 네트워크에서

장치들이 서로를 인식하고 통신을 하기 위해서 사용하는 특수한 번호입니다.

즉, IP 주소는 네트워크 상에서 컴퓨터를 찾을 때 필요한 주소를 나타냅니다.

 

포트(Port)는 네트워크에서 특정한 프로세스나 서비스가 데이터를 주고받을 수 있는 컴퓨터 내에서

논리적으로 할당된 지점(장소)를 말합니다.

즉, 포트(Port)는 컴퓨터 안에서 프로그램을 찾을 때를 나타내는 통로(문)와 같습니다.

포트는 0~65535까지 번호 논리적으로 할당할 수 있습니다.

 

IP 주소와 포트를 통해 클라이언트와 서버가 통신을 할 수 있습니다.

 

서버는 소켓을 만든 다음 특정 포트에 바인딩하여 수신하며, 그런 다음 해당 소켓에서 클라이언트와의 연결, 연결 해제 및

데이터 전송에 대한 알림을 받게 됩니다.

 

데이터 "패킷" 자체는 버퍼에서 가져온 이진 데이터로 구성됩니다.

이 버퍼는 GameMaker 버퍼 함수를 ​​사용하여 만들고 조작할 수 있습니다.

 

 

 

 

 

 

◈ 네트워킹 비동기 이벤트(Network Async Event)

 

네트워킹 이벤트는 들어오는 네트워크 트래픽에 의해 발동하는 이벤트이며, 네트워크 기능에 연결됩니다.

 

(▲ 네트워킹 비동기 이벤트)

 

이 이벤트는 이 이벤트에만 적용되는 특수 DS 맵을 생성하고, 특수 변수 async_load에 저장합니다.

이 DS 맵은 이를 생성한 네트워크 이벤트의 유형에 따라 다른 정보를 포함할 수 있습니다.

 

(▲ async_load 맵에 저장된 키를 사용하여 이벤트를 구성)

 

 

 

 

● 일반적인 네트워킹 이벤트(async_load)

 

다음 키는 모든 수신 네트워크 함수에 공통적이며 항상 async_load 맵에 존재합니다.


◎ "type": 아래 표에 나열된 상수 중 하나를 반환 값으로 가지며 네트워크 이벤트 유형을 지정합니다.


◎ "id": 이벤트를 수신하는 소켓 ID(network_create_server 또는 network_create_socket 함수에서 반환된 실수).
           대부분의 경우 반환된 소켓 ID는 이벤트를 트리거한 TCP 또는 UDP 소켓의 ID이지만,
           이벤트가 서버에서 트리거되고 데이터 이벤트인 경우 소켓 ID는 데이터를 보낸 클라이언트의 ID가 됩니다.


◎ "ip": 소켓의 IP 주소(문자열).
◎ "port": IP 주소와 연결된 포트(UDP 작업 시 유용함).

 

 

 

"type" 키에 대한 가능한 반환 값은 아래 나열된 네 가지 상수 중 하나일 수 있습니다.


- network_type_connect : 네트워크 연결로 인해 발생합니다.
- network_type_disconnect : 네트워크 연결 해제로 인해 발생합니다.
- network_type_data : 네트워크로 들어오는 데이터로 인해 발생합니다.


- network_type_non_blocking_connect : 이벤트는 비차단으로 구성된 연결로 인해 트리거되었습니다
                            이것은 network_set_config 함수를 사용하거나 network_connect_async 또는
                             network_connect_raw_async를 사용하여 연결한 경우입니다.

 

 

 

 

 

 

● 연결/연결 해제

 

network_type_connect 또는 network_type_disconnect 유형의 이벤트가 있는 경우,

async_load 맵에는 다음과 같은 추가 키가 존재합니다.

 


   ◎ "socket": 이 키는 연결/연결 해제 소켓 ID를 보관합니다.

 

이벤트가 network_type_non_blocking_connect 유형인 경우는 다음과 같은 키가 추가로 있습니다.

 


◎ "succeeded": 이 키는 0 또는 1이며, 0은 연결 시간이 초과되었음을 의미하고 1은 성공했으며,
                           소켓을 사용할 준비가 되었음을 의미합니다.

 

서버와의 연결이 끊어지면 클라이언트에서 네트워킹 이벤트가 발생하지 않고,

연결이 TCP 기반인 경우에도 연결된 서버의 연결이 끊어지면 두 network_type_* 이벤트가

클라이언트에서 발생하지 않습니다.

 

 

 

● 데이터 수신

 

네트워크가 데이터를 수신했음을 나타내는 network_type_data 유형 이벤트가 있는 경우 async_load 맵에는 다음 키가 있습니다.

 


◎ "buffer": 이벤트에서 생성된 버퍼에 대한 핸들입니다.
                  "grow" 유형 버퍼는 바이트가 1로 정렬되어 ID를 보관하기 위해 생성되며, 이 이벤트에서 버퍼에 대한
                   모든 추가 함수 호출에 사용됩니다.
                   async_load 맵과 마찬가지로 생성된 버퍼는 이 이벤트가 끝나면 자동으로 메모리에서 제거됩니다.
                   버퍼에 대한 자세한 내용은 참조 - 버퍼를 참조하세요.


◎ "size": 수신되는 버퍼 데이터의 크기(바이트)입니다.


◎ "message_type": (WebSockets 전용) - 수신된 메시지가 바이너리 형식인 경우 network_send_binary이고,
                               텍스트 형식으로 수신된 경우 network_send_text입니다.


◎ "server": (서버 소켓 전용) 데이터를 수신한 서버 소켓의 ID입니다.


 

※ [참고] 생성된 버퍼는 네트워킹 이벤트에서만 유효하며 네트워킹 이벤트가 끝나면 자동으로 해제됩니다.

 

 

 

● 연결 시도

 

network_connect_active 또는 network_connect_passive를 사용할 때 os_is_network_connected (네트워크 연결 여부)함수가

false를 반환했을 때 네트워크 이벤트에서 비동기적으로 아래와 같은 상수가 반환됩니다.

async_load 맵의 "type" 키는 다음 값 중 하나입니다.

 


- network_type_up : 연결이 성공했습니다.
- network_type_up_failed : 연결이 실패했습니다.

 

어느 상황이든 네트워크가 다운되면, "type" 키가 network_type_down으로 설정된 상태에서 이 이벤트가 다시 트리거됩니다.

 

 

 

 

 

 

 

 

 

300x250

댓글