Здравствуйте. Я вот только что пробовал передать клиенту обычную png картинку, но ничего не получилось. Я перевёл каждый символ в цифру, пользуясь ord(x) и отравил всё это клиенту. Дальше уже в клиенте я всё записывал в файл используя chr(x) Проверьте что не так: P.s Я тот человек который сидит на gm8
Скрипт writefile:
Код
var str,i,fln,buff,s; buff=argument1 fln=argument0 writestring(filename_name(fln),buff) fln=file_text_open_read(fln) while(1) { str=file_text_read_string(fln) i=0 while(1) { s='' s=s+string(ord(string_char_at(str,i))) if s!='' {writeushort(s,buff)} if i<string_length(str) {i+=1}else{break;} } if file_text_eof(fln) {writeushort(60000,buff);file_text_close(fln);break;}else{writeushort(59999,buff);file_text_readln(fln)} }
Скрипт readfile:
Код
var fln,bt; fln=file_text_open_write(working_directory+'\'+string(readstring())) while(1) { bt=readushort() if bt=60000 {file_text_close(fln);break} if bt=59999 {file_text_writeln(fln)} if bt<59999{file_text_write_string(fln,chr(bt))} }
Qvant, Да ладно? Я знаю что он может сохранить в свой буфер и передать, но как я только не пробовал, ничего не получалось. Даже стандартными скриптами в 39DLL
Добавлено (13 марта 2015, 22:08) --------------------------------------------- P.s Передаётся только часть файла
-Не люблю я этих кошек. -Просто ты не умеешь их готовить.
ты просто неправильно делаешь - наверняка в шаге проверяешь буфер , и если он не пустой то начинаешь с ним работать. А за один шаг все данные могут и не придти !
1)сначала отсылай байты размер буфера 2)потом отсылаем буфер пакетами по 8192 байтов (или меньше) 3)в клиенте проверяй стал ли буфер равным байтам которые приняли из 1) пункта если он меньше , то ничего не делаем а как только буфер станет равным - сохраняем буфер в файл , это и будет картинка.
Сообщение отредактировал Qvant - Суббота, 14 Марта 2015, 00:23
maksim1221232, почему нельзя передать содержимое буфера и название буфера? Кода возможно будет больше, за то точно будет работать. Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)
Я знаю. Я думал что игра может затормозить на время, но главное что файл придёт целым.
ЦитатаQvant ()
1)сначала отсылай байты размер буфера 2)потом отсылаем буфер пакетами по 8192 байтов (или меньше) 3)в клиенте проверяй стал ли буфер равным байтам которые приняли из 1) пункта если он меньше , то ничего не делаем а как только буфер станет равным - сохраняем буфер в файл , это и будет картинка.
Я тут не очень всё понял. Ты имеешь в виду что надо передавать файл по 8Кб? P.s Извини за мою тупость Можете мне разъяснить всё по подробнее, или пример какой нибуть дать...
Я тут не очень всё понял. Ты имеешь в виду что надо передавать файл по 8Кб? P.s Извини за мою тупость Можете мне разъяснить всё по подробнее, или пример какой нибуть дать...
Тебе наверное хотели сказать, что сначала отошли клиенту размер данных, которые отправляешь, а потом отправляй файл кусочками.На стороне клиента проверяй, равен ли текущий объем данных - отправляемому, если нет, то продолжаешь слать данные пока количество принятых данных не станет равно отправленным. Размер кусочков, которые ты можешь отправлять за один раз написали для примера, ты можешь использовать свой(размер).
Сообщение отредактировал maker-rus - Суббота, 14 Марта 2015, 03:08
Я использую TCP. Или это всё одно и тоже? P.s Я про вес пакета который они могут передать
Добавлено (14 марта 2015, 12:11) --------------------------------------------- И почему они не могут передать такой вес? Картинка всего то весит 6кб, я уже пытаюсь передать вообще 180байт, вроде бы приходит, но картинку открыть нельзя. Раньше я когда делал игры, передавал карты весом 23кб и ничего, всё полностью приходило без всяких ошибок.
надеюсь байты которые отправляются как размер картинки ты не сохраняешь вместе с данными из буфера в файл
Нет, я не отправляю никакие размеры файла. У меня в начале передаётся название, а далее читается строка из файла, символы в которой переводятся в цифры и записываются в буфер. Когда строка прочитана, в буфер записывается число 60000 что бы клиент понял что дальше надо всё писать с новой строки, а когда полностью прочитан файл, записывается 60001. Далее клиент принимает, он создаёт файл с именем который отправил ему сервер, и начинает всё записывать в него переводя цифры в буквы которые отправил ему сервер.
Добавлено (14 марта 2015, 13:25) --------------------------------------------- Всё, вроде бы получилось, но появилась одна неудобная вещь: Когда клиенту приходит файл, он сохраняет его себе, но зачем то в конце добавляет пробел. Из за этого файл весит на 2байта больше. Если так передать картинку, то она может не работать. Как это исправить? Вот скрипты:
var fln,bt,strg; strg='' fln=file_text_open_write(working_directory+'\'+string(readstring())) while(1) { bt=readushort()-1 if bt=64001 {file_text_close(fln);break} if bt=64000 {file_text_write_string(fln,strg);strg='';file_text_writeln(fln)} if bt<64000 {strg=strg+string(chr(bt))} }
Добавлено (15 марта 2015, 01:08) --------------------------------------------- Всё, решил проблему!
Я воспользовался стандартными функциями 39dll типа fileopen, filesize и т.д. Вот сами скрипты:
Код
/* argument0 - Путь к файлу с именем argument1 - Часть файла argument2 - Буфер
@Автор скрипта - maksim1221232 (14.03.2015 23:44:20) */ var buff; buff=0 if argument2!=0 {buff=argument2} file=fileopen(argument0,2); if argument1!=0 {filesetpos(file,4096*argument1)} writestring(filename_name(argument0),buff) writestring(''+string(filesize(file)),buff) writeushort(argument1+1,buff) fileread(file,4096,buff); fileclose(file);
Код
/* argument0 - Путь к папке в которую надо сохранить файл(С косой чертой в конце).
Возвращает true когда вес файла в клиенте совпал с весом в сервер(тоесть файл полностью пришёл), или наоборот, false если не совпадает. @Автор скрипта - maksim1221232 14.03.2015 (23:52:41) */ var file,sz,szc; file=fileopen(string(argument0)+string(readstring()),2) sz=readstring() filesetpos(file,((readushort()-1)*4096)) filewrite(file) szc=filesize(file) fileclose(file) if szc=real(sz) {return(true)}else{return(false)}
Всё очень просто. Используете эти скрипты как и другие (writebyte,writeshort и т.д) Вам понадобится создать одну переменную, которая будет хранить часть переданного файла. Вот пример: В сервере пишете: clearbuffer(1) writebyte(2,1) writefile(working_directory+'\music.mp3',fpos,1) sendmessage(socket,0,'',1) fpos+=1
В клиенте принимаете: if readfile(working_directory+'\music\') { show_message('Файл передан!') } else { clearbuffer() writebyte(3) sendmessage(socketserver) Когда в сервер приходит пакет с номером три(который выше) то просто запихиваете код отправки файла(как выше где ещё есть пер. fpos) туда и всё)
У меня за секунд ~30 передалась музыка 7.1мб P.s Скорость комнаты с сервером 100 а в клиенте 70 P.s.s Также можете побаловаться с весом. Например 4кб увеличить до 16 или ещё как нибуть... P.s.s.s Если кому нибуть понадобится пример, пишите в личку или в скайп. }
Сообщение отредактировал maksim1221232 - Воскресенье, 15 Марта 2015, 01:20