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으로 설정된 상태에서 이 이벤트가 다시 트리거됩니다.
'GameMaker강좌[GMS2] > 네트워크강좌' 카테고리의 다른 글
[게임메이커 강좌-네트워킹][GMS2] 채팅 프로그램 만들기-4-채팅 메시지 보내기 (0) | 2024.12.24 |
---|---|
[게임메이커 강좌-네트워킹][GMS2] 채팅 프로그램 만들기-3-메시지 송수신 (0) | 2024.12.23 |
[게임메이커 강좌-네트워킹][GMS2] 채팅 프로그램 만들기-2-서버/클라이언트 (0) | 2024.12.23 |
[게임메이커 강좌-네트워킹][GMS2] 채팅 프로그램 만들기-1-채팅 기본 구성 (0) | 2024.12.21 |
[게임메이커 강좌-네트워킹][GMS2] 기본 서버/클라이언트 구조 (0) | 2024.12.19 |
댓글