Skocz do zawartości

39dll Wysyłanie obrazka


Brox

Rekomendowane odpowiedzi

Siemka! Mam pytanie jak mogę wysłać za pomocą 39dll.dll obrazek? Męczę się z tym i coś mi nie wychodzi.

 

Jak ja to robie: :D

Najpierw zamieniam obrazek.bmp na tekst, następnie otwieram go za pomocą file_text_open_read.... i całą zawartość zapisuje do jednej zmiennej (zmienna += file_text_read_string()....) no i gdy go wysłam to przy odbiorze są tylko 5 pierwszych liter tego tekstu z obrazka a reszty nie ma.

 

Więc jak to zrobić, aby wysłać obrazek poprzez 39dll.dll po zmienieniu jego formatu na .txt?

Odnośnik do komentarza
Udostępnij na innych stronach

Najpierw wysyłasz informacje o pliku( np wielkość, rozmiar bufora( ilość bajtów pliku przesłanych w jednej wiadomości ) ) następnie odczytujesz z pliku po ileś tam bajtów i wysyłasz je. Odbiorca przy pierwszym pakiecie tworzy nowy plik binarny, i zapisuje do niego bajty z kolejnych wiadomości.

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, poczytałem trochę jak wysyłać te bajty, ale i tak coś mi nie wychodzi.

 

kod na wysyłanie:

GML
file = file_bin_open("image.png",0);

size = file_bin_size(file);

for(i=0;i<size+1;i+=1)

{

bajt = file_bin_read_byte(file);

file_bin_seek(file,i);

clearbuffer();

writebyte(IMAGE);

writebyte(bajt);

sendmessage(global.serwer);

}

 

file_bin_close(file);

 

kod na odbieranie:

GML
case IMAGE:

file = file_bin_open("image.png",1)

file_bin_write_byte(file,readbyte());

file_bin_close(file)

break;

 

No i gdy już się wszystko wyśle to i tak plik jest o rozmiarze jednego bajta to tak jak by doszedł tylko jeden bajt.

Nie wiem o co chodzi, może chodzi o to że gdy ciągle otwieram ten plik aby wpisać tego bajta to najpierw się czyści ten plik a potem go zapisuje, a nie że dopisuje do tego co już jest, jeżeli tak jest to co zrobić aby dopisywało?

Oczywiście zrobię tak aby wysyłało większe pakiety tych bajtów a nie tylko po jednym, ale jak to nie chce działać to nie ma co zaczynać :D.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie opłaca Ci się otwierać i zamykać co chwilę pliku, już i tak ich obsługa jest wolna w GM.

Schemat bardzo ideowy:

GML
//serwer//

case chce_pobrac_plik:

{

//otworzenie pliku

//wyslanie id wiadomosci(np info),

//jego nazwy,

//rozmiaru,

//i rozmiaru bufora

}

///bleble ble dalszy kod

if( jestem w trakcie wysylania pliku )

{

if( aktualna pozycja w pliku >= wielkosci pliku )

{

//zamykamy plik

}else{

//wyczysc bufer

//zapisz bajt z id wiadomosci np chunk( jakas liczba do rozpoznania wiadomosci, nazwa jest tu symbolicznie( choc moze to byc stala z przypisana liczba ) )

repeat( min(rozmiar bufora, rozmiar pliku - aktualna pozycja w pliku) )

{

//zapisz jeden bajtd o bufora(39dll)

}

//wysli

}

}

///klient///

///blablabla kod na odbieranie wiadomosci z serwera

case info:

{

//otworzenie pliku do zapisu

//pobranie jego nazwy,

//rozmiaru,

//i rozmiaru bufora

}

case chunk:

{

repeat( rozmiar bufora )

{

if( ilosc pobranych bajtow >= wielkosc pliku )

{

//zamykamy plik

}else{

//zapisz_do_pliku( id_pliku, pobrany_bajt )

//zwiekszasz ilosc pobranych bajtow( najlepiej trzymac to w jakies zmiennej )

}

}

}

Jak będziesz miał jeszcze problem to szybko skręce jakiś przykładzik.

PS: Twój problem polegał na tym że w file_bin_open powinien drugi argument wynosić 2( Przy odbieraniu ).

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ę...