Skocz do zawartości

Networking podstawy


Rekomendowane odpowiedzi

Witam. Bardzo interesuje mnie Networking w GM:Studio, ale za nic nie mogę tego zrozumieć. Chcę mieć dwa programy, Server i Client. W projekcie Server mam następujący kod:

 

Create:

 

GML
GMLglobal.metal = 500;

ini_open("metal.data");

ini_write_real("saved","metal",global.metal);

ini_close();

 

Networking:

 

GML
GMLnetwork_create_server(network_socket_tcp,6510,20);

 

buff = buffer_load("metal.data");

network_send_packet(sock, buff, buffer_get_size(buff));

 

Natomiast w projekcie Client mam:

 

Create:

 

GML
GMLglobal.metal = 0;

 

Networking:

 

GML
GMLclient = network_create_socket(network_socket_tcp);

network_connect(client,"192.134.0.1",6510);

 

I nie rozumiem jednej rzeczy, jak Client ma odebrać pakiet z wartością zmiennej global.metal z Server'a? Chcę, żeby Client mógł ją wyświetlić w swoim okienku.

Odnośnik do komentarza
Udostępnij na innych stronach

W evencie networking nie zapisujesz tworzenia serwera/klienta tylko obslugujesz przychodzace pakiety.

Serwer i klienta musisz zrobic w jakims innym evencie, np. w create.

 

W evencie networking korzystasz ze stałej async_load aby skorzystać z ds_mapy w której masz przychodzące dane, zapisane w async_load[? "buffer"] bądź ds_map_find_value(async_load,"buffer"); w zaleznosci od tego czy uzywasz accessorow czy nie.

Odnośnik do komentarza
Udostępnij na innych stronach

Hmm. No to teraz to wszystko wygląda tak i nadal nie działa, a dodatkowo Client wyrzuca błąd i wyłącza Server.

 

SERVER:

Create:

GML
ini_open("data.sav");

ini_write_real("saved","metal",500);

ini_close();

network_create_server(network_socket_tcp,6510,20);

 

Networking:

GML
buff = buffer_load("data.sav");

network_send_packet(sock, buff, buffer_get_size(buff));

 

CLIENT:

Create:

GML
global.metal = 0;

client = network_create_socket(network_socket_tcp);

network_connect(client,"127.0.0.1",6510);

 

Networking:

GML
if (ds_map_find_value(async_load, metal) == true)//chciałem przy okazji zrobić, żeby ustawiało wartość -666, kiedy nie odbiera pakietu ze zmienną "metal"

global.metal = ds_map_find_value(async_load, metal);

else

global.metal = -666;

 

Draw:

GML
draw_text(10,10,fps);

draw_text(300,300,global.metal);//Żeby było widać, kiedy przychodzą pakiety z Server'a</span>

 

Wiem. Ostro kaleczę, ale zawsze miałem problem z programowaniem czegoś, co działa przez neta. Chodzi mi tylko i wyłącznie o to, żebym wiedział, jak przesłać zmienną z serwera na oddzielny program klienta.

Odnośnik do komentarza
Udostępnij na innych stronach

W async_load nie ma klucza o nazwie "metal".

Dane przekazuje sie tak:

 

1. Wyczyść bufor za pomocą buffer_seek

2. Dodaj dane do bufora za pomocą buffer_write

3. Wyślij bufor za pomocą network_send_packet

4. Odbierz bufor za pomocą async_load[? "buffer"] lub ds_map_find_value(async_load, "buffer")

5. Wczytaj dane z bufora w tej samej kolejnosci i uzywajac tego samego typu danych co zapisujac dane w kroku 2.

 

 

Kroki 4 i 5 są w evencie networking

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...