![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как передать голос по сети и ..., Internet [D7, WinXP]
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 несет детальную информацию о причинах отказа - код ошибки.