![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ClientSocket, ServerSocket - несколько отправок [D6]
Brand © (2002-07-11 23:07:00)Если один из этих компонентов выполняет SendText и тут в момент выполнения опять вызывается SendText. Что будет: выскочет ошибка или этот запрос станет в очередь и выполнится после того, как выполнится предыдущая SendText?
Alex SV (2002-07-17 17:15:00) [41]Если деление, в данном случае, принесет наилучший результат - его можно и нужно использовать!
А оперу надо брать такую, которая максимально ефективно решит вопрос. Ну это же всем понятно... хотя нет, видно не всем.
Digitman (2002-07-17 17:05:00) [42]Слушай, любезный, ты читать умеешь вопрос ?
Цитирую персонально для тебя, "товарищ с широким кругозором" :
>>как-же сделать, чтобы это было все-таки две отдельных отправки
Никаких "отдельных отправок" режим SOCK_STREAM никогда не обеспечит. И не надо "лепить" сюда деление исходящего/входящего потока на логические дейтаграммы - это из другой оперы, и автор про твою "другую оперу" ни слова не произнес.
Alex SV (2002-07-17 15:59:00) [43]Видеть единственное решениеэто очень серьезное заболевание. Надо расширять кругозор, товарищ!
Что-бы добраться из пункта А в пункт В всегда есть множество путей.
Source.ruрекомендует использовать метод SendStream ClientSocket1.Socket.SendStream(srcfile). Отличным решением данной задачи является тот же файловый поток - TFileStream (либо поток в памяти - TMemoryStream). Принимать частички данных из сокета можно через событие OnRead (OnClientRead), используя универсальный метод ReceiveBuf. Определить размер полученного блока можно методом ReceiveLength. Также можно воспользоваться сокетным потоком.
Книга "Delphi 5. Руководство для профессионалов"(это не про Вас, Цифра-Мужик) предлагает использовать команды типа "#N", "#U", "#M", и т.д., которые вводятся самим разработчиком просто чтобы определить, что прислали из сокета.
На странице Королевство Delphiесть описание способа обмена информацией межу сервером и клиентом при котором сервер подтверждает получение информации и после этого клиент высылает следующую посылку.
Вот так. Учите мат-часть.
А послать в "Потрепаться" может любой дурак.
Digitman (2002-07-17 11:42:00) [44]>Alex SV
Тебе есть что сказать по делу, сударь ? Есть - говори, нет - вперед в "Потрепаться" !
По СУТИ поставленного вопроса ("как-же сделать, чтобы это было все-таки две отдельных отправки") я вижу единственное решение - использование message-oriented режима TCP/IP-протокола. О деталях и ограничениях альтернативы речи пока не шло.
У тебя иное мнение ? Есть возражения ? Что ж , излагай ... чего трепаться-то бестолку ?
Alex SV (2002-07-17 10:41:00) [45]Удалено модератором
Digitman (2002-07-15 08:17:00) [46]>Brand
Чего "например" ?
Brand (2002-07-12 20:44:00) [47]Например?
Digitman (2002-07-12 14:09:00) [48]никак.
откажись от компонентов, использующих поточный протокол и используй иные компоненты для работы в режиме UDP.
или реализуй логику, предложенную [nex]
Brand (2002-07-12 13:56:00) [49]Я попробовал написать два раза подряд:
Socket.SendText(.....);
Socket.SendText(.....);
На сервере, и вправду, все принялось, как одна строка. А как-же сделать, чтобы это было все-таки две отдельных отправки?
Digitman (2002-07-12 08:15:00) [50]>Brand
Запросы на передачу и прием становятся в очередь.
>[nex]
Это не баг. Это - особенность штатного SOCK_STREAM-режима работы гнезд.
[nex] (2002-07-12 00:55:00) [51]Ошибка не вылятитъ, но текст из первой отправки может слится с текстом из следующей. Устранить этот баг можно только одним способом: надо вначале строки указать её длину, чтобы при получении инфы считывалось только нужная длина и удаляешь её, а следующий текст идёт на следующий обработчик...