![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как послать файл с ServerSocket и принять его на ClientSocket?
kosmach © (2002-08-05 10:17:00)У ServerSocket есть три до боли простых по своей логике метода:
SendText, SendBuffer и SendStream. Первые два прекрасно работают, впрочем последний тоже работает, данные то клиенту приходят и правильно приходят, но сам он выдает ошибку: "Access violation at adress 00000000",;
Вот код сервера:
procedure TForm1.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
FS: TFileStream;
St: String;
begin
St:=Socket.ReceiveText;
if St="Send" then begin
try
FS:=TFileStream.Create("file.txt", fmOpenRead);
Socket.SendStream(FS);
finally
FS.Free;
end;
end;
end;
А вот клиента:
procedure TForm1.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
var
FS: TFileStream;
buf: PChar;
size: longint;
begin
Size:=Socket.ReceiveLength;
GetMem(Buf, Size);
Socket.ReceiveBuf(buf^,size);
FreeMem(buf);
end;
Вроде бы все просто, а не работает, даже предположить не могу, что не так, может кто-нибудь, что-нибудь заметит.
Digitman (2002-08-05 12:51:00) [21]Сложно, говоришь ? Разговор не получится, извини.
Я не знаю, как тебе "на пальцах" объяснить вещи, которые ты хоть в минимальном объеме, но просто обязан познать перед тем как заниматься программированием/отладкой приложений Win32 вообще и программированием/отладкой сетевых приложений в среде Делфи в частности.
kosmach (2002-08-05 12:39:00) [22]Господи, как все сложно, я таких слов даже и не знаю.
Рассказываю:
Я создал форму, на нее поместил два компонента ServerSocket и ClientSocket, присвоил ClientSocket.host="127.0.0.1", поставил одинаковый порт у Server и у Client. После чего, по нажатии кнопочки ClientSocket.Open:=True, а по нажатии другой кнопочки ClientSocket.SendText("Send"); Остальной код ты видел. Затем я нажимаю "Run(F9)". Вот и все, а Delphi integrated bebugging tools я не пользуюсь, так как скорее всего не знаю что это такое.
Digitman (2002-08-05 12:31:00) [23]>>"..Delphi помечает зеленой стрелочкой где застряла.."
что есть "зеленая стрелочка" ? Почему именно - "зеленая" ? А если у меня она - серо-буро-малиновая, что это меняет в принципе по-твоему ?
что значит - "застряла" ?
Какое приложение ты отлаживаешь - серверное или клиентское ? Используешь ли Delphi integrated bebugging tools для отладки ?
kosmach (2002-08-05 12:27:00) [24]В таком случае объясни мне - полному чайнику, как мне определить где у меня AV. Обычно в run-time Delphi помечает зеленой стрелочкой где застряла, по крайней мере я это так понимаю. Тут ничего подомного нет.
А насчет ".. но явно где-то на сервере." извени, может я и поторопился.
Digitman (2002-08-05 12:19:00) [25]>kosmach
(05.08.02 10:17)
>>"AV я получаю не на клиенте.."
(05.08.02 12:06)
>>"..данные то клиентуприходят и правильно приходят, но сам онвыдает ошибку.."
А эту несуразицу как прикажешь понимать ? Изволь уж выражаться точно.
1. >> "А где она AV выдает я не знаю, она никакую конкретную строчку не помечает"
Кто - "она" ? Почему кто-то должен тебе что-то "помечать" в run-time ?
2.>> ".. но явно где-то на сервере."
На основании чего такая уверенность ?
kosmach (2002-08-05 12:17:00) [26]Люди, а как же я, может кто-нибудь посоветует как подругому послать файл.
Digitman (2002-08-05 12:11:00) [27]>ACR
Не обижайся, но если уж я и найду время и сподоблюсь-таки статью написать, то она будет по-русски. По всем правилам русского языка. Тебе ее читать, inho, тяжеловато будет.
kosmach (2002-08-05 12:06:00) [28]AV я получаю не на клиенте, то как я дописываю, создавая новый объект или дописывая в старый, не имеет значения. Клиент прекрасно считывает в буфер все что ему пришло. Я пробовал послать маленький текстовый файл, который полностью принял в буфер за один раз. А где она AV выдает я не знаю, она никакую конкретную строчку не помечает, но явно где-то на сервере.
ACR (2002-08-05 12:02:00) [29]Digitman главный спец па сокетам :-)
напиши статью пра сокеты в асинхронном режиме
пра то как палезна пользовать OnWrite
и как реализавать машину состояний :-)
а то постоянно отвечаешь... отвечаешь...
а вот если все тваи ответы собрать то очень хорошая статья получится
нет я не для себя прашу
у меня давно имеются компаненты
TACRServerSocket
TACRClientSocket
которые нифига не поточные а об"екта передающие ;-)
это я за всех тупых людей прашу...
хатя я тоже тупой......
Digitman (2002-08-05 11:48:00) [30]1. Вот эта строчка вполне может дать AV
FS.WriteBuffer(buf^, Size);
правда, не с такими параметрами, что ты привел.
2. Зачем 2 раза создавать объект TFileStream ? Что, разве нельзя , создав единожды объект, дозаписать в конец файла (нового или существующего) очередной блок принятых реально данных ?
И на какой же строчке ты получаешь AV ?
kosmach (2002-08-05 11:23:00) [31]Клиентский код я привел просто для примера. На самом деле я делаю так:
procedure TForm1.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
var
FS: TFileStream;
buf: PChar;
size: longint;
begin
Size:=Socket.ReceiveLength;
GetMem(Buf, Size);
Socket.ReceiveBuf(buf^,size);
if not FileExists("DL\file.txt") then
try
FS:=TFileStream.Create("DL\file.txt", fmCreate);
finally
FS.Free;
end;
try
FS:=TFileStream.Create("DL\file.txt", fmOpenReadWrite);
FS.Seek(0, soFromEnd);
FS.WriteBuffer(buf^, Size);
finally
FS.Free;
end;
FreeMem(buf);
end;
Вобщем, логика такая, там я отсылаю поток, который или весь сразу, если файл маленький, или по частям приходит к клиенту, но в любом случае, клиент все что ему пришло считывает в буфер, а уже потом в или в файл, или в поток или еще куда, т.к. метода для приема потока нет.
Digitman (2002-08-05 11:01:00) [32]>>даже предположить не могу, что не так
Кто за тебя будет на стороне клиента создавать объект класса TFileStream ? Ты этого не делаешь, вот и получаешь AV