Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как передать голос по сети и ..., Internet [D7, WinXP]


Страницы:   1 2

Whitevova ©   (2006-06-07 21:01:00) 

Я часто разговоравию сидя за компьютером, а занимать телефон на полчаса из-за какой-то ... не очень-то хочется. Вот и решил сделать что-то вроде TeamSpeak и аськи и лоадера и ... в одном лице. Создавать свои классы и методы соединения в первой версии проги не захотел. Решил просто посмотреть как работает сеть, и как вообше посылать, принимать ... сообшения, файлы... Обнем файлами и сообшениями решил сделать через Tclient и Tserver Socket'ы. Как чем пользоваться смотрел в DW. Вполне норм описано. Но столкнулся с некоторыми проблемами, решение которых не нашел, а может плохо искал. Так вот собственно и они:

1. Создал программу клиент - точнее заготовку - добавил пару закладок ... наметил обший вид. Посмотрел в DW как посылать/принимать сообшения - сделал "чат" ( ну недоработанный абсолютно - г..но), но работает так: запускаю прогу серв - включаю сервер, запускаю клиент - присоединяюсь, пишу сообшение, а оно видно и в клиенте и в программе сервере. Обрадовался - хотел делать норм. обмен и т.д. Но подумал, а вдруг с другого компа не коннектиться и скинул клиент другу - включил серв - и на тебе - правда - неконнект. Вот она - первая проблема.

2. При отправке сразу нескольких пакетов данных они слипаются в один. Но на этот случай в DW много решений - выбрал наиболее удобное - а оно не работает - точнее тот код, который написан в DW

----------------------------------------------------------------------------------------------------------------------------------
var
Buffer: string = '';
{$R *.dfm}

function GetUserStringFromBuffer(var UserString: string): Boolean;
var
i: Integer;
bf: string;
begin
Result := False;
if Length(Buffer) > 0 then
repeat
if Length(Buffer) > 0 then
if Buffer[1] <> '<' then
Delete(Buffer, 1, 1);
until (Buffer[1] = '<') or (Length(Buffer) <= 1);
if Length(Buffer) < 3 then
exit; - Компилятор говорит, что ошибки тут
i := 1;
bf := '';
repeat
if Length(Buffer) >= i then
begin
inc(i);
if Buffer[i] <> '>' then
bf := bf + Buffer[i];
end;
until (Buffer[i] = '>') or (Length(Buffer) <= 1);
if StrToInt(bf) + i > Length(Buffer) then
exit ------------ и тут
else
begin
Delete(Buffer, 1, i);
UserString := Copy(Buffer, 1, StrToInt(bf));
Result := True;
Delete(Buffer, 1, StrToInt(bf));
end;
end;
----------------------------------------------------------------------------------------------------------------------------------

3. И наконец то, зачем собственно и нужна прога - обмен голосом - синхронный с норм качеством. Возможно ли такое сделать на Delphi, если да, то подкажите как.

Ну вроде пока всё )

P.S. Не судите строго - все когда-то учатся.


Сергей М.   (2006-06-08 15:16:00) [21]


> medved_68 ©   (08.06.06 15:10) [4]


При чем здесь потоки ? Речь ты завел о режимах работы гнезда, а не о потоках.


medved_68   (2006-06-08 15:10:00) [22]


> С т.з. конечной цели абсолютно фиолетово, будет гнездо блокирующим

В основном потоке обрабатывать передачу на сокет да еще голосовой поток в runtime??? Да еще при нескольких клиентах(конференция)??? Это уже не фиолетово и даже не радужно Да еще при этом заботиться о пользователе, что он там нажимает при чем желательно без промедления, мы же ждать не любим


Сергей М.   (2006-06-08 12:59:00) [23]


> medved_68 ©   (08.06.06 12:54) [2]


> лучше блокирующий вариант


С т.з. конечной цели абсолютно фиолетово, будет гнездо блокирующим или неблокирующим.


medved_68   (2006-06-08 12:54:00) [24]

А по моему лучше блокирующий вариант Тогда основной проге остается только брать звуковой поток и кусками запихивать в буфер откуда поток обработки сокета их будет отсылать в сетку. При этом все обработки ошибок передачи и коннекта можно возложить на поток. Но для runTime может потребуется двойная буферизация.


Сергей М.   (2006-06-08 11:42:00) [25]

Начни с отработки логики коннекта.

Успешная попытка коннекта завершается возбуждением на стороне клиента события OnConnect, на стороне сервера - соответственно OnClientConnect.

Неуспешная попытка завершается возбуждением на стороне клиента события OnError, при этом параметр ErrorCode несет детальную информацию о причинах отказа - код ошибки.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо