Вверх ↑
Ответов: 4671
Рейтинг: 767
#1: 2014-08-08 15:27:27 ЛС | профиль | цитата
nesco писал(а):
А тебе не кажется, что размер памяти ограничивает размер передаваемого файла?
Да, ограничивает. Но там есть ещё концептуальные ошибки:
- во-первых, идет отправка только из st.Memory, следовательно поддерживается только MemoryStream;
- во-вторых, весь объем отправляется за раз, а в TSocket.Send нет разбиения на меньшие порции. Это приводит к тому, что если MemoryStream и может иметь размер несколько сотен Мб, то передать можно не больше нескольких мегабайт (или десятков Мб) - у сокета есть свой буфер, переполнение которого даст ошибку отправки.

Assasin писал(а):
предоставляли пользователю по нижней точки безразмерный поток данных (Stream), с которым уже можно работать с помощью StreamRW
У меня уже есть такой компонент, я потому и вывел точку Socket у новых TCP компонентов. Вот только следует учитывать как-бы две "парадигмы" работы с сетью:
- полностью "асинхронный" режим, когда ожидание и отправка данных "независимы", как сделано у нас благодаря событию onRead. Удобно применять в программах типа чатов, которые держат постоянное соединение, чтобы получать уведомления с серверов.
- "диалоговый" режим, когда программа работает в режиме запрос-ответ: одна сторона отправляет данные, затем переключается в ожидание ответа. И принятые данные будут интерпретированы в зависимости от последней посланной команды. Так работают протоколы типа HTTP, FTP, SMTP. Вот этот режим удобно реализовать компонентом SocketRW.
Если же приём будет вестись, как у нас, через событие onRead, то компонент SocketRW можно будет применять только для отправки данных.

Assasin писал(а):
я использую что-то типа самопального протокола
Вот я и хочу сделать отдельный компонент для подобного протокола, чтобы не приходилось всё это в схеме городить. Примерно:

doSendString
doSendStringAsync
doSendFile
doSendFileAsync
doSendStream
doSendStreamAsync
doAbortSend
doRejectRecv

onSend
onSendAborted - передача отменена другой стороной
onBeforeString - будет принята строка. Точка Length Содержит длину строки. Можно отказаться от приема через doRejectRecv
onBeforeFile - аналогично onBeforeString, можно указать имя для сохранения. Можно предусмотреть получение оригинального имени.
onBeforeStream - аналогично onBeforeString
onString - выдаёт принятую строку
onFile - происходит после получения файла
onStream
onErrorSend
onErrorProto - неправильные ответы другой стороны

Данные:
Stream - поток, куда будет записан принятый поток.
OutFileName - имя файла для сохранения.

Свойства:
Length - длина принимаемых данных


Assasin писал(а):
Это получается, что если мы принимаем integer или real
А поскольку тип данных мы не можем изменить в рантайм, то что ж это за программа, которая обменивается одними Интегерами

Assasin писал(а):
если нам придет больше одного значения за раз, то остальные мы потеряем
А case _prop_DataType of нужно ставить внутрь цикла
while count > 0 do
begin

end;

карма: 26

0