![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Пример передачи файла через Socket в режиме stThreadBlocking... [D5, Win2k, WinXP]
TankMan © (2005-04-01 08:07:00)Немогу разобраться, может кто-нибудь поделиться примером, работающим примером?
TankMan (2005-04-11 12:07:00) [21]>>Slym
Хм...Ошибки вроде не выдает, но и сервер не принимает :(
>>Slym
Не мог бы сказать, где может быть ошибка логическая на стороне сервера?
Slym (2005-04-11 07:19:00) [22]
procedure TForm1.Button2Click(Sender: TObject);
var
Client: TClientSocket;
sFile:TFileStream;
begin
Client:=TClientSocket.Create(nil);
try
Client.ClientType:=ctBlocking;
Client.Address:='127.0.0.1';
Client.Port:=6184;
sFile:=TFileStream.Create(edit3.text,fmOpenRead);
try
Client.Open;
Client.Socket.SendStream(sFile)
finally
sFile.Free;
end;
finally
Client.Free;
end;
end;
TankMan (2005-04-11 06:37:00) [23]О клиенте:
object csClient: TClientSocket
Active = False
ClientType = ctBlocking
OnConnect = csClientConnect
OnDisconnect = csClientDisconnect
OnError = csClientError
end
Соединяется при старте программы:
begin
csClient.Address:='127.0.0.1';
csClient.Port:=6184;
try
csClient.Open;
except
raise
end;
А выдает ошибку он мгновенно, т.е. файл фактически и не пересылается вообще :(
Digitman (2005-04-08 09:16:00) [24]Stream write error в дан.случае может возникать только при превышении таймайта, заданного 2-м параметром конструктора TWinSocketStream .. у тебя он равен ~ 20 сек .. т.е. за эти 20 сек гнездо клиента не подтвердило передачу всех данных, которые ассоциированы с FileStream
Digitman (2005-04-08 08:27:00) [25]где и как создается, инициализируется и активируется csClient ?
TankMan (2005-04-08 06:37:00) [26]А на стороне клиента - то что я уже писал :
procedure TForm1.Button2Click(Sender: TObject);
var sFile:TFileStream;
Sock:TWinSocketStream;
smFile:tMemoryStream;
i:integer;
begin
sFile:=TFileStream.Create(edit3.text,fmOpenReadWrite);
Sock:=TWinSocketStream.Create(csClient.Socket,20000);
i:=Sock.CopyFrom(sFile,0);
if i=0 then showmessage('VOT!:(');
sock.Free;
end;
...чего-то не хватает? Отдельный поток не стал создавать, потому как приложение клиент ничем кроме как посылкой этого файла и не должно заниматься...
.. Может у меня не правильная политика?
TankMan (2005-04-08 06:32:00) [27]ОК.
Пример Серверной стороны показал Slym, так я и сделал:
procedure TForm1.ssServerGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread:=TSocketThread.Create(false,ClientSocket);
end;
{Описание SocketThread}
unit SocketThread;
interface
uses Windows,ScktComp,Classes;
type
TSocketThread=class(TServerClientThread)
protected
procedure ClientExecute; override;
end;
var
src:TFileStream;
implementation
uses unit1,SysUtils;
{ TSocketThread }
procedure TSocketThread.ClientExecute;
var Stream:TWinSocketStream;
dos:boolean;
begin
dos:=true;
try
Stream:=TWinSocketStream.Create(ClientSocket, 60000);
try
while (not Terminated) and ClientSocket.Connected do
begin
if Stream.WaitForData(10000) then
begin
if FileExists(ExtractFilePath(ParamStr(0))+'vot.upd') then DeleteFile(ExtractFilePath(ParamStr(0))+'vot.upd');
if not assigned(src) then
src:=TFileStream.Create(ExtractFilePath(ParamStr(0))+'vot.upd',fmCreate);
src.Seek(0,soFromEnd);
src.CopyFrom(Stream,Stream.Size);
ClientSocket.Close
end else
ClientSocket.Close;
end;
finally
Stream.Free;
end;
except
end;
end;
end.
Digitman (2005-04-07 12:48:00) [28]
> TankMan © (07.04.05 12:32) [6]
приводи полный код ..
TankMan (2005-04-07 12:32:00) [29]Так и есть в этом режиме csClient у меня и работает...
Digitman (2005-04-07 08:52:00) [30]
> серверу с режимом stThreadBlocking
для передатчика нет совершенно никакой разницы, в каком режиме работает гнездо приемника - в блокирующем или неблокирующем...
использование TWinSocketStream требует чтобы гнездо передатчика было инициализировано для работы в блок.режиме
TankMan (2005-04-07 07:31:00) [31]Конкретно, был бы благодарен за пример пересылки файла со стороны ClientSocket-а серверу с режимом stThreadBlocking. В сети не могу найти, может не там смотрю? А читая все то что написано по F1, мне кажется я так пришел к том что у меня и было :
sFile:=TFileStream.Create(edit3.text,fmOpenReadWrite);
Sock:=TWinSocketStream.Create(csClient.Socket,20000);
i:=Sock.CopyFrom(sFile,0); <<=====Сдесь выдается ошибка Stream write error
if i=0 then showmessage('VOT!:(');
sock.Free;
Digitman (2005-04-06 08:22:00) [32]И какая же проблема ?
TankMan (2005-04-06 06:52:00) [33]Да, похоже кипятим...
У меня проблема, кажется, осталась с пересылкой из ClientSocket а не с принятием ServerSocket-ом...
Digitman (2005-04-01 15:03:00) [34]"Вы все еще кипятите ?" (с)
пример у тебя всегда есть - вполне работоспособный проект Borland Socket Server (scktsrvr.dpr), поставляемый с исх.текстами в Делфи ... там TSocketServer как раз используется в упомянутом режиме