![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сокеты [D6, Win2k]
Freedom © (2005-01-08 22:24:00)Здравствуйте!
Используя коспоненты ClientSocket и ServerSocket,реализовал две программы Клиент и Сервер.Две программы могут передавать друг другу сообщения и передавать файлы.Возникла проблема в передачи файла.Файлы передаю через ClientSocket1.Socket.SendStream(TFileStream.Create(filename,fmOpenRead or fmShareDenyWrite));
На сервере имеется обрабработчик onread, который принимает как текстовые сообщения так и файлы.Выглядит это так:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var ilen,z: Integer;
buf: Pointer;
begin
//прием текстового сообщения
if (Socket.ReceiveText<>'send') and (not flag) then
begin
ListBox1.Items.Add('Client: '+Socket.ReceiveText);
for z := 0 to ServerSocket1.Socket.ActiveConnections-1 do ServerSocket1.Socket.Connections[z].SendText('Client: '+Socket.ReceiveText);
// прием файла
end
else
if flag then
begin
{Открываем временный файл для записи}
FStream := TFileStream.Create('myfile.tmp',fmCreate or fmShareDenyWrite);
{Записываем в l размер полученного блока}
ilen := Socket.ReceiveLength;
{Заказываем память для буфера}
GetMem(buf,ilen);
{Записываем в буфер полученный блок}
Socket.ReceiveBuf(buf^,ilen);
{Ставим позицию в конец файла}
try
Socket.ReceiveBuf(Buf^, iLen);
FStream.Write(Buf^, iLen);
finally
FreeMem(Buf);
end;
ListenFileEdit.Text:='Получен файл';
end
else
begin
flag:=true;
exit;
end;
end;
Текстовые сообщения принимает отлично,а вот файл получается пустым.Если переставить код принятие файла до приема простых сообщений,то все отлично.
Посоветуйте пожалуйства,что делать.
Не охото вставлять второй компонент на форму.
Alexander Panov (2005-01-10 01:12:00) [21]Eraser © (09.01.05 0:12) [1]
Используй Indy, и забей на ClientSocket и ServerSocket, на них ничего серьёзного не сделаешь, по причине отсутствия многозадачности.
Тебе кто об этом сказал? Или на собственном опыте убедился?
Eraser (2005-01-10 00:43:00) [22]kaZaNoVa
Спору нет )) Indy на API и написаны! Просто делать серьёзный сервер на API это почти тоже самое, что делать приложение Win32 на ассмеблере, можно, но не очень просто...
Хотя в некоторых случаях без API не обойтись. Но Indy предоставляет дескрипторы!
Alexander Makhanev (2005-01-09 20:11:00) [23]
> Eraser © (09.01.05 00:12) [1]
У меня на ServerSocketThread/ClientSocketThread все отлично работает...
kaZaNoVa (2005-01-09 19:20:00) [24]API сокеты рулят !!!
Дмитрий В. Белькевич (2005-01-09 19:14:00) [25]Релиз десятой уже вышел? Пойду гляну. И, конечно же, причина, не [1]. Просто Инди гораздо удобнее. Зачем, собсно, и делались.
Eraser (2005-01-09 13:38:00) [26]Дмитрий В. Белькевич
Уже 10 версия вышла, успешно юзаю )))
Polevi (2005-01-09 12:48:00) [27]>Eraser © (09.01.05 00:12) [1]
ну это просто LOL
VMcL (2005-01-09 11:17:00) [28]http://www.indyproject.org/
Вроде, оно.
TButton (2005-01-09 07:15:00) [29]
> Используй Indy, и забей на ClientSocket и ServerSocket,
> на них ничего серьёзного не сделаешь, по причине отсутствия
> многозадачности.
> Ерейзер дело говорит. Пользуй Инди, желательно 9-ю версию
> посвежее поставить. Там всё просто до слёз.
можно линк, а то в 5й дельфе индей не густо.
Дмитрий В. Белькевич (2005-01-09 06:38:00) [30]Ерейзер дело говорит. Пользуй Инди, желательно 9-ю версию посвежее поставить. Там всё просто до слёз.
Eraser (2005-01-09 00:12:00) [31]Используй Indy, и забей на ClientSocket и ServerSocket, на них ничего серьёзного не сделаешь, по причине отсутствия многозадачности.