Гость
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Закрытие соединения fsockopen() php7 / 19 сообщений из 19, страница 1 из 1
27.04.2017, 20:56
    #39445754
ZiB
ZiB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие соединения fsockopen() php7
Доброе время суток.
Возникла следующая проблема: скачиваю с сервера 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
27.04.2017, 21:06
    #39445757
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие соединения fsockopen() php7
Перед отправкой файла отправляйте размер. А вообще велосипед. Чем тот же http или ssh не угодил?
...
Рейтинг: 0 / 0
27.04.2017, 21:22
    #39445760
ZiB
ZiB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие соединения fsockopen() php7
Я не сервер.
Я ничего не решаю, я клиент.
Мне этот файл нужен регулярно.
В принципе я его получаю,
но клиент зависает до timeout.
А хотелось бы написать пользователю: "файл получен".
...
Рейтинг: 0 / 0
27.04.2017, 21:28
    #39445762
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие соединения fsockopen() php7
Если у сервера спросить "сколько байт в файле?" - он может дать конкретный и правильный ответ? Если может, то читаем из сокета, суммируем полученные байты, при достижении означенного количества закрываем соединение, так как файл получен.
...
Рейтинг: 0 / 0
27.04.2017, 21:40
    #39445764
ZiB
ZiB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие соединения fsockopen() php7
Нет, сервер этого не умеет.
...
Рейтинг: 0 / 0
27.04.2017, 21:49
    #39445768
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие соединения fsockopen() php7
А нет ли в самом файле какого-то признака "конец файла"?
...
Рейтинг: 0 / 0
27.04.2017, 21:58
    #39445769
ZiB
ZiB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие соединения fsockopen() php7
По всей видимости нет.
Т. к. все что я получаю, я пишу в файл.
Файл корректно открывается как gzip-архив WinRar'ом.
Почему не работает установка тайм-аута в 1 сек?
socket_set_timeout($fp, 1);
Висит до параметра max_execution_time в php.ini.
...
Рейтинг: 0 / 0
27.04.2017, 22:04
    #39445770
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие соединения fsockopen() php7
vkleА нет ли в самом файле какого-то признака "конец файла"?
Если там gzip - нужно его просто распаковать, данных хватило и контрольная сумма с размером сходится - значит всё прочитали, socket можно закрывать
...
Рейтинг: 0 / 0
27.04.2017, 22:05
    #39445771
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие соединения fsockopen() php7
ZiB,

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

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
28.04.2017, 07:53
    #39445834
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие соединения fsockopen() php7
Если сеть лагнет, файл не докачается. Зачем выдумывать такие горе-протоколы....
...
Рейтинг: 0 / 0
28.04.2017, 08:31
    #39445844
ZiB
ZiB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие соединения fsockopen() php7
Я нашел в начале файла его размер. Но не смог его разобрать. Забил, и оставил так. Только тайм-аут побольше поставил.
...
Рейтинг: 0 / 0
28.04.2017, 08:38
    #39445848
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие соединения fsockopen() php7
ZiBЯ нашел в начале файла его размер. Но не смог его разобрать.А в чем проблема то?
...
Рейтинг: 0 / 0
28.04.2017, 08:38
    #39445849
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие соединения fsockopen() php7
...
Рейтинг: 0 / 0
29.04.2017, 09:29
    #39446456
ZiB
ZiB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие соединения fsockopen() php7
Кодировка файла непонятная, явно 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
29.04.2017, 11:01
    #39446483
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие соединения fsockopen() php7
ZiB,

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


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