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

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

Как послать файл с ServerSocket и принять его на ClientSocket?


Страницы:   1 2

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


Страницы:   1 2

Наверх

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