JohnBuckleyGitHub / schat

Automatically exported from code.google.com/p/schat
GNU General Public License v3.0
3 stars 0 forks source link

Передача файлов #2

Closed GoogleCodeExporter closed 8 years ago

GoogleCodeExporter commented 8 years ago
Необходимо реализовать передачу файлов 
между клиентами.
P.S. Пока идей как это сделать нет.

Original issue reported on code.google.com by impomezia@gmail.com on 12 Jan 2009 at 5:33

GoogleCodeExporter commented 8 years ago
[deleted comment]
GoogleCodeExporter commented 8 years ago
Есть вот такая софтина - 
http://qt-apps.org/content/show.php/qShare?content=116612
Это - графический ftp-сервер. Может сделать 
по аналогии - кратковременно поднимается 
на рандомном порту ftp-сервис, принимающему 
отправляется урл + имя файла. После 
передачи ftp тушится. Все довольны.

Original comment by mot...@gmail.com on 10 Jun 2010 at 9:16

GoogleCodeExporter commented 8 years ago
Главное - не забыть потушить ftp после любой 
передачи даже неудачной :)

Original comment by mot...@gmail.com on 10 Jun 2010 at 9:19

GoogleCodeExporter commented 8 years ago
Спасибо весьма интересно, готовая 
реализация FTP сервера может здорово всё 
упростить. 

Original comment by impomezia@gmail.com on 10 Jun 2010 at 11:00

GoogleCodeExporter commented 8 years ago
Проект хороший, но пока что у него проблемы 
с кирилицей (знаки ? вместо символов). 
Проверял как на вин, так и на убунту. 

Original comment by Alterin...@gmail.com on 12 Jun 2010 at 5:34

GoogleCodeExporter commented 8 years ago
Насчет ftp сервера - идея не очень, так как 
через интернет тогда не будет работать 
передача файлов. Разве что реализовать 
через сервер, но это лишняя нагрузка. Хотя 
если чат только для локалки - тогда 
нормально.

Original comment by dmboh...@gmail.com on 29 Sep 2010 at 2:09

GoogleCodeExporter commented 8 years ago
Случайно наткнулся на интересный проект 
http://code.google.com/p/dukto/

Original comment by impomezia@gmail.com on 16 Dec 2010 at 11:40

GoogleCodeExporter commented 8 years ago
Если передачу файлов со всем трафиком 
через сервер:
Добавить в сообщения опкоды
от передающего клиента:
1)
запрос отправки файла
структура месежа: опкод1 /id файла/ник(кому 
отправляем файл (думаю в алл чат нет смысла 
слать файлы))/ размер файла / имя файла
2)
отправка файла
структура месежа: опкод2 /id файла/номер 
блока/длина блока/данные блока файла BYTE*
3)
отказать в передаче файла
структура месежа: опкод3 /id файла 
/причина(прервано пользователем/файл не 
найден и т.д.)

id файла - уникальный для каждого файла 
клиента (уникальная связка id файла+ник 
передающего)
файл передаётся блоками

Опкоды сервера отправляющему:
1)
передача файла запрещена
структура: опкод4/id файла/причина (неверный 
ник/имя файла содержит недопустимые 
символы/клиент отказался от файла и т.д.)
2)
опкод5 неверный ник получателя
3)

опкоды принимающего клиента:
1)
опкод7 отказаться от файла(причина?)
2)
запросить блок
структура месежа: опкод8 /id файла/ номер 
блока
запрос блока 1 равносильно "принять файл"

принимающий может оборвать приём файла в 
любой момент отправив опкод7
==============
также сервак перенаправляет опкоды 1-3 7-8 от 
передающего получателю и наоборот.

=================
если трафик не через сервер, то передающий 
клиент открывает порт для запроса файла, а 
сервер принимающему отправляет пакет типа 
имя файла/ип:порт клиента где забрать. 
получатель коннектится к отправляющему по 
указаным ип/порту, на которых 
обрабатываются опкоды 2, 7, 8 , но тут будут 
непонятки с подключениями через vpn/прокси + 
файрволы будут фигню пороть.

вобщем както так:)

Original comment by sead...@gmail.com on 14 Feb 2011 at 8:02

GoogleCodeExporter commented 8 years ago
Сейчас работаю над реализацией нового 
протокола с учётом всего накопленного 
опыта, нынешняя реализация просто ужасна в 
плане расширяемости.

Original comment by impomezia@gmail.com on 14 Feb 2011 at 9:01

GoogleCodeExporter commented 8 years ago
Помощь нужна? Есть идеи)

Original comment by sead...@gmail.com on 15 Feb 2011 at 6:22

GoogleCodeExporter commented 8 years ago
Новый протокол будет двухуровневый 
Транспортный уровень будет делать всю 
грязную работу по доставке пакетов и 
обработке сетевых ошибок, на этом уровне 
будет только один тип пакета, задача 
которого доставлять пакеты вышестоящего 
уровня, в одном транспортом пакете может 
быть инкапсулировано больше одного 
виртуального.

Каждый виртуальный пакет будет содержать 
адрес назначения, благодаря этому можно 
например легко расширить client to client 
протокол без изменения кода сервера 
например для передачи файлов, т.к. пакет 
будет просто доставлен куда нужно, также 
подобная реализация сделает добавление 
новых виртуальный пакетов очень простым.

Для передачи файлов планируется 
максимально использовать p2p и использовать 
сервер для передачи только в случае 
невозможности прямой передачи файлов 
между клиентами.

P.S. От идей не откажусь ;)

Original comment by impomezia@gmail.com on 15 Feb 2011 at 10:26

GoogleCodeExporter commented 8 years ago
По идеям:
Общее для клиента:
для транспортного уровня достаточно 1 
класса (на основе QSsl или QTcp сокета) в 
котором для пакетов
слот send(AbstractSendablePacket*) 
сигнал resrv(AbstractReservingPacket*)
для подключения методы connect() isConnected() onConnect() 
onDisconnect() вынести в паблик
этот класс самостоятельно будет 
заниматься 
сжатием/распаковкой/шифрованием, т.е. 
преобразовывать данные из QByteArray 
AbstractSendablePacket'а в формат:
размер пакета/флаг пакета(сжат/шифрован и 
т.д.)/обработанные данные пакета(сжаты и/или 
зашифрованы или без изменений)
Также будет самостоятельно разбирать 
трафик от сервера на отдельные пакеты, и 
производить с ними обратные операции в 
зависимости от флагов.

Т.е. в общем случае для 1 подключения (к 
серверу или к другому клиенту) 1 екземпляр 
наследника сокета, что уже позволит 
работать с несколькими серверами 
одновременно.
По пакетам мне лично понравился подход в java 
l2j сервере к этому делу 2 базовых 
виртуальных класса для отправляемых и 
принимаемых пакетов, а уже наследники 
базовых пакетов имеют все необходимые для 
конкретного пакета свойства и методы, т.е. 
например для отправки текстового 
сообщения примерно следующая иерархия:
AbstractPacket
{
QByteArray data;
quint opcode;
}
AbstractSendablePacket:AbstractPacket
{
virtual void make()=0;//Собственно пререгружаем в 
каждом пакете, который можно отправить 
преобразовывает заполненую структуру 
пакета в QByteArray
}
SendTextPacket:AbstractSendablePacket
{
QString text;
virtual void make()
{
//формируем базовую структуру сообщения в 
data
}
}

код отправки будет выглядеть примерно так:
SendTextPacket msg;
msg.text=Гуи->полеввода->toHtml();
connetcion_to_server->send(&msg);

Опкоды для конкретных пакетов 
присваиваются в конструкторе.

Original comment by sead...@gmail.com on 16 Feb 2011 at 7:39

GoogleCodeExporter commented 8 years ago

Original comment by impomezia@gmail.com on 27 Jul 2011 at 7:59

GoogleCodeExporter commented 8 years ago
Реализовано в версии 1.99.32.

Original comment by impomezia@gmail.com on 22 Jun 2012 at 1:33