Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   отправка картинки через сокет сервер (http://www.flasher.ru/forum/showthread.php?t=204389)

GrafMine 28.10.2013 19:44

отправка картинки через сокет сервер
 
Хотел бы спросить как правильно отправить картинку через сокет сервер?
есть такие вот наброски:
Код AS3:

imm.source = "http://.../img10.png";
var ba:ByteArray = new ByteArray()
var encoder:JPGEncoder = new JPGEncoder(100);
ba = encoder.encode(imm.bitmapData);
socket.writeUTFBytes(ba.length.toString()); // нужно передовать длину ?
socket.writeBytes(ba,0,ba.length); // правильно тут все ?
socket.flush();

Со стороны флеша все учтено для нормального приема картинки сервером ? или не хватает каких-то деталей ?
просто на сервер иногда приходит просто разноцветная полосочка "аля радуга" или вообще нечего кроме каракуль

Добавлено через 1 час 7 минут
дошел до того что на сервер приходит куча маленьких битых пнгшек, с чем связано ?

maxkar 29.10.2013 13:17

Покажите код, которым вы на сервере данные читаете. Есть подозрение, что вы вычитываете сообщение не до конца.

На клиенте, похоже, все правильно. Ну при условии, что у вас картинка к моменту отправки на сервер уже загрузилась полностью (у вас в примере ожидания окончания img я не вижу).

Если не получается, соберите какой-нибудь простенький пример (клиент+сервер), чтобы его можно было запустить и посмотреть. Давайте именно код, а не скомпилированный результат.

Dukobpa3 29.10.2013 14:34

Цитата:

Код AS3:

socket.writeUTFBytes(ba.length.toString());


О_о
Это что?

Добавлено через 12 минут
1. длину передавать не надо. Но зависит от серверного парсера. Нужно знать ваш формат протокола чтоб точно ответить.
2. Даже если длину и надо передавать, то это нифига не запись длины в виде строки.
3. Запись в сокет неправильная.

Код AS3:

// Подготавливаем сообщение.
var msg:ByteArray = new ByteArray(); // будущее сообщение
var ba:ByteArray = new ByteArray(); // временный буффер в который запишем картинку
var encoder:JPGEncoder = new JPGEncoder(100);
ba = encoder.encode(imm.bitmapData); // читаем картинку
 
msg.writeInt(ba.length); // если нужно длину указывать.
// Если не надо, то и второй байтаррей не нужен, можно прямо в msg записать.
// Просто без дополнительного БА - не сможем длину выудить.
// Ну и еще один момент - так мы запишем четыре байта длины.
// А могут быть варианты с одним байтом или двумя. Опять же от вашего протокола зависит.
msg.writeBytes(ba); // тело сообщения
msg.writeInt(0x00); // признак конца сообщения. Поидее не нужен, но надо уточнять как сервер парсит.
 
socket.writeBytes(msg); // записываем в сокет.
socket.flush(); // отправляем

RTFM

GrafMine 29.10.2013 15:26

Цитата:

Сообщение от Dukobpa3 (Сообщение 1150285)
Код AS3:

// Подготавливаем сообщение.
var msg:ByteArray = new ByteArray(); // будущее сообщение
var ba:ByteArray = new ByteArray(); // временный буффер в который запишем картинку
var encoder:JPGEncoder = new JPGEncoder(100);
ba = encoder.encode(imm.bitmapData); // читаем картинку
 
msg.writeInt(ba.length); // если нужно длину указывать.
// Если не надо, то и второй байтаррей не нужен, можно прямо в msg записать.
// Просто без дополнительного БА - не сможем длину выудить.
// Ну и еще один момент - так мы запишем четыре байта длины.
// А могут быть варианты с одним байтом или двумя. Опять же от вашего протокола зависит.
msg.writeBytes(ba); // тело сообщения
msg.writeInt(0x00); // признак конца сообщения. Поидее не нужен, но надо уточнять как сервер парсит.
 
socket.writeBytes(msg); // записываем в сокет.
socket.flush(); // отправляем


Спасибо большое на шаг ближе к цели стал, да пока длину некуда присвоить по идеи если сокет видит биты идущие к нему он не ограничивает длину а ждет конца потока, ну все равно есть кокой-то баг с разбитием файла, объясню:
если картинка больше чем 3 кб (3072 байта), то наверно срабатывает какое-то ограничение что его бьет , что это может быть кто знает ?

Цитата:

Сообщение от Dukobpa3 (Сообщение 1150285)
Нужно знать ваш формат протокола чтоб точно ответить.

Код AS3:

socket_create(AF_INET, SOCK_STREAM, SOL_TCP)


Dukobpa3 29.10.2013 15:30

на каком языке сервер?

GrafMine 29.10.2013 15:39

Цитата:

Сообщение от Dukobpa3 (Сообщение 1150295)
на каком языке сервер?

сервер на php

Dukobpa3 29.10.2013 15:44

Если картинка меньшим размером проходит нормально - то пинай сервер. Косяк там.
А если даже маленькая не парсится - тогда будем разбираться.
Надо проконтролировать еще ba.endian у клиента и сервера должны совпадать.
Но если не совпадают - то вообще никакое сообщение не прочитается. Так что проверьте сначала на малееньком сообщении.

GrafMine 29.10.2013 16:54

Цитата:

Сообщение от Dukobpa3 (Сообщение 1150304)
Если картинка меньшим размером проходит нормально - то пинай сервер. Косяк там.
А если даже маленькая не парсится - тогда будем разбираться.
Надо проконтролировать еще ba.endian у клиента и сервера должны совпадать.
Но если не совпадают - то вообще никакое сообщение не прочитается. Так что проверьте сначала на малееньком сообщении.

До 3 кб проходит нормально,ba.endian одинаковый (вариант с распаковкой потока был в предыдущей версии попытки поймать файл тут в этой функции можно переключать big Endian сейчас же просто создается пустой файл на сервере и в него ложится те данные которые присылаю, изза того что он(поток) разбит на части, то и файлов создается столько сколько частей ).
ок тогда буду копать в сторону серва


Часовой пояс GMT +4, время: 12:07.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.