powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Закрытие соединения fsockopen() php7
19 сообщений из 19, страница 1 из 1
Закрытие соединения fsockopen() php7
    #39445754
ZiB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZiB
Гость
Доброе время суток.
Возникла следующая проблема: скачиваю с сервера gzip файл по его протоколу.
Протокол следующий:
1. Я с ним соединяюсь и отправляю команду "Дай файл":
$fp = fsockopen("tcp://1.9.1.9", 4313, $errno, $errstr, 5);
fputs ($fp, "getfile\r\n");
2. Сервер меня спрашивает "Ты кто?":
$line = fgets($fp); // who?
3. Я ему я тот-то:
fputs ($fp, "login\r\n");
4. Сервер спрашивает чего мне надо?:
$line = fgets($fp); // what?
5. Я ему "Дай файл"
fputs ($fp, "full\r\n"); //

И вот тут сервер мне начинает слать здоровый файл.
Я его получаю вот так:

//socket_set_timeout($fp, 1);
$file = fopen("D:\price.txt", "w");
while (!feof($fp)){
fwrite($file, fgets($fp,16384)); // 16384 - так файл скачивается быстрее
};

Где-то через минуту файл у меня целиком оказывается, где я и ожидаю: D:\price.zip
Но соединение не прерывается, сервер не сообщает, что передача окончена.
Ни какого символа в конце передачи, означающего конец передачи, нет.
Установка тайм-аута socket_set_timeout($fp, 1); в одну секунду не помогает.

Как мне разорвать соединение, если от сервера нет сообщений?
Или может у самого файла gzip есть какой-то признак окончания файла?
У той стороны узнать не удалось.

Помогите пожалуйста.
...
Рейтинг: 0 / 0
Закрытие соединения fsockopen() php7
    #39445757
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перед отправкой файла отправляйте размер. А вообще велосипед. Чем тот же http или ssh не угодил?
...
Рейтинг: 0 / 0
Закрытие соединения fsockopen() php7
    #39445760
ZiB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZiB
Гость
Я не сервер.
Я ничего не решаю, я клиент.
Мне этот файл нужен регулярно.
В принципе я его получаю,
но клиент зависает до timeout.
А хотелось бы написать пользователю: "файл получен".
...
Рейтинг: 0 / 0
Закрытие соединения fsockopen() php7
    #39445762
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если у сервера спросить "сколько байт в файле?" - он может дать конкретный и правильный ответ? Если может, то читаем из сокета, суммируем полученные байты, при достижении означенного количества закрываем соединение, так как файл получен.
...
Рейтинг: 0 / 0
Закрытие соединения fsockopen() php7
    #39445764
ZiB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZiB
Гость
Нет, сервер этого не умеет.
...
Рейтинг: 0 / 0
Закрытие соединения fsockopen() php7
    #39445768
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А нет ли в самом файле какого-то признака "конец файла"?
...
Рейтинг: 0 / 0
Закрытие соединения fsockopen() php7
    #39445769
ZiB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZiB
Гость
По всей видимости нет.
Т. к. все что я получаю, я пишу в файл.
Файл корректно открывается как gzip-архив WinRar'ом.
Почему не работает установка тайм-аута в 1 сек?
socket_set_timeout($fp, 1);
Висит до параметра max_execution_time в php.ini.
...
Рейтинг: 0 / 0
Закрытие соединения fsockopen() php7
    #39445770
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkleА нет ли в самом файле какого-то признака "конец файла"?
Если там gzip - нужно его просто распаковать, данных хватило и контрольная сумма с размером сходится - значит всё прочитали, socket можно закрывать
...
Рейтинг: 0 / 0
Закрытие соединения fsockopen() php7
    #39445771
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZiB,

Если файл успешно распаковался - сокет можно закрыть. Руками без всяких фантазий с таймаутами
...
Рейтинг: 0 / 0
Закрытие соединения fsockopen() php7
    #39445772
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилЕсли там gzip Оу, ну да, точно ж
...
Рейтинг: 0 / 0
Закрытие соединения fsockopen() php7
    #39445783
ZiB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZiB
Гость
Все получилось следующим образом:

stream_set_timeout($fp, 20);
$file = fopen("D:\price.zip", "w");
while (!feof($fp)){
fwrite($file, fgets($fp,65536));
$info = stream_get_meta_data($fp);
if ($info['timed_out']) {
break;
};
};

И код пошел дальше... а именно отправил пока серверу
fputs ($fp, "bye\r\n");
и разорвал соединение:
fclose ($fp);
...
Рейтинг: 0 / 0
Закрытие соединения fsockopen() php7
    #39445834
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если сеть лагнет, файл не докачается. Зачем выдумывать такие горе-протоколы....
...
Рейтинг: 0 / 0
Закрытие соединения fsockopen() php7
    #39445844
ZiB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZiB
Гость
Я нашел в начале файла его размер. Но не смог его разобрать. Забил, и оставил так. Только тайм-аут побольше поставил.
...
Рейтинг: 0 / 0
Закрытие соединения fsockopen() php7
    #39445848
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZiBЯ нашел в начале файла его размер. Но не смог его разобрать.А в чем проблема то?
...
Рейтинг: 0 / 0
Закрытие соединения fsockopen() php7
    #39445849
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Закрытие соединения fsockopen() php7
    #39446456
ZiB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZiB
Гость
Кодировка файла непонятная, явно UTF-8,
AkelPad именно в этой кодировке открывает и там читаемый текст.
Но при импорте в этой кодировку в PostgreSQL пишет:
INSERT INTO sxd.d(d) SELECT convert_from(pg_read_binary_file('2.csv'), 'UTF8');

ОШИБКА: неверная последовательность байт для кодировки "UTF8": 0x00
SQL-состояние: 22021

Собственно это время в не очень читаемом блоке находится.

Начало файла:
꾅srjava.util.ArrayListxНơIsizexpy힇%UDFBF1;Значение справочника 1t2;Значение справочника 2t 17;Значение справочника 3t

Вот теперь ломаю голову как его импортировать и распарсить.
...
Рейтинг: 0 / 0
Закрытие соединения fsockopen() php7
    #39446483
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZiB,

Голову ломать не надо, это очень похоже на формат сериализация Java
Строки действительно в utf-8
...
Рейтинг: 0 / 0
Закрытие соединения fsockopen() php7
    #39446503
ZiB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZiB
Гость
Как мне распарсить в PHP этот формат?
...
Рейтинг: 0 / 0
Закрытие соединения fsockopen() php7
    #39446525
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZiBКак мне распарсить в PHP этот формат? спецификацию прочитать - убедиться что оно (учесть, что формат не текстовый,а двоичный)
Ну и разобрать ArrayList ( полный парсер писать необязательно)
https://docs.oracle.com/javase/7/docs/platform/serialization/spec/protocol.html
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Закрытие соединения fsockopen() php7
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]