Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Tcserversocket Tclientsocket, проблема передачи файлов 
:(
    Опции темы
Cameron
Дата 28.9.2005, 12:12 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Здраствуйте уважаемые программеры у меня небольшая проблема так как я не опытный программист. Она состоит в следующем.
Я пытаюсь переслать изображение с формы сервера на форму клиента и всегда возникает ошибка EAccesViolation или EConvertError
Вот обработчики события OnClient read Сервера и клиента.

Код
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
    var
  Ms:Tmemorystream;
  I:integer;
begin
if socket.ReceiveText='send' then
begin
Ms:=TmemoryStream.Create;
image1.Picture.Grafic.SaveToStream(ms);
i:=ms.Size;
buffer:=ms.Memory; // Здесь возникае ошибка  
//EConvertError 
//а если написать ms.read(buffer,i); Возникнет EAccesViolation.
socket.SendText(inttostr(i));
socket.SendBuf(buffer^,i);
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;

begin
data:=Tmemorystream.Create;
size:=strtoint(socket.ReceiveText);
socket.ReceiveBuf(bufer,size);
data.Write(bufer,size);
image2.Picture.bitmap.LoadFromStream(data);
end;


Помогите объесните как это заставить работать.
Зарание благодарен!!!!!!

Это сообщение отредактировал(а) p0s0l - 28.9.2005, 15:32
  Вверх
_hunter
Дата 28.9.2005, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 5
Всего: 98





--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Voyager
Дата 29.9.2005, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: нет
Всего: 18



Цитата
buffer:=ms.Memory; // Здесь возникае ошибка

Так присваивание не делаетсяsmile
Нужно примерно так (если buffer - pointer):
Код

Move(ms.Memory^,buffer^,ms.Size);

Ну и не забывать выделять память и очищать после выполнения операции.
PM   Вверх
Cameron
Дата 29.9.2005, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 28.9.2005

Репутация: нет
Всего: нет



Вот программа передачи файлов через сокеты но она передаёт не больше 8 кб помогите сделать так что бы передавать любой обьём.
Код
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls, jpeg, ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    ClientSocket1: TClientSocket;
    ServerSocket1: TServerSocket;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure Button2Click(Sender: TObject);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure Button3Click(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
  private
  buffer1:^integer;
  buffer2:^integer;
  Output:TmemoryStream;
  InPut:TmemoryStream;
  Size:Integer;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
serversocket1.Port:=1001;
serversocket1.Active:=true;
serversocket1.Open;
memo1.Lines.Add('Ñåðâåð Àêòèâåí');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
clientsocket1.Port:=1001;
clientsocket1.Address:='192.168.0.2';
clientsocket1.Active:=true;
memo1.Lines.Add('Êëèåíò àêòâåí');
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
clientsocket1.Open;
memo1.Lines.Add('Êëèåíò ïîäêëþ÷èëñÿ');
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
memo1.Lines.Add('Ñåðâåð: êëèåíò ïîäêëþ÷èëñÿ');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
clientsocket1.Socket.SendText('send');
memo1.Lines.Add('Çàïðîñ îòïðàâëåí send');
end;



procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
begin
input:=tmemorystream.Create;
input.Position:=0;
size:=socket.ReceiveLength;
getmem(buffer2, size);
socket.ReceiveBuf(buffer2^,size);
input.Write(buffer2^, size);
freemem(buffer2);
begin
input.Position:=0;
memo1.Lines.Add(inttostr(socket.ReceiveLength));
input.SaveToFile('d:\1.jpg');
memo1.Lines.Add('Ôàéë ïðèíÿò');
end;
end;


procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
begin

begin
Output:=Tmemorystream.Create;
output.Position:=0;
image1.Picture.Graphic.SaveToStream(output);
i:=output.Size;
memo1.Lines.add(inttostr(i));
getmem(buffer1,i);
output.Position:=0;
begin
output.Read(buffer1^,i);
serversocket1.Socket.Connections[0].SendBuf(buffer1^,i);
freemem(buffer1);
end;
memo1.Lines.Add('Ôàéë îòïðàâëåí');
end;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
memo1.Lines.Add(socket.ReceiveText);
end;

end.


Это сообщение отредактировал(а) Snowy - 4.10.2005, 11:21
PM MAIL   Вверх
Dubinsky
Дата 10.10.2005, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



Cameron ! вот прога передающая файлы неограниченного размера (от dDsergej) :

http://forum.vingrad.ru/index.php?act=Atta...=post&id=293873
PM MAIL WWW   Вверх
Stolzen
Дата 22.10.2005, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: нет
Всего: 48



отправляю я так:

Код

var
    FSName: string;
    Size: integer;
    Receive: boolean;
    MS, MSServ: TMemoryStream;


Код

procedure TMainForm.fsSendButtonClick(Sender: TObject);
var
  SizeS: integer;
  P: ^Byte;
  Name1: string;
begin
 try
  with OpenDialog1 do if Execute then
   begin
   MSServ := TMemoryStream.Create;
    MSServ.LoadFromFile(FileName);
    Name1 := FileName;
    fsSendFileNameLabel.Caption := GetFileName(Name1, 20);
    FileSendServer.Socket.Connections[0].SendText('file#' + FileName + '#' + IntToStr(MSServ.Size) + '#');
    fsSendSizeLabel.Caption := IntToStr(MSServ.Size div 1024) + ' Кбайт';
    MSServ.Position := 0;
    P := MSServ.Memory;
    SizeS := FileSendServer.Socket.Connections[0].SendBuf(P^, MSServ.Size);
    SendFileProgress.Progress := SizeS * 100 div MSServ.Size;
    fsSendLabel.Caption := 'Отправлено ' + IntToStr(SizeS) + ' из ' + IntToStr(MSServ.Size) + ' байт';
   end;
 except
    MessageBeep(MB_ICONHAND);
    ShowMessage('Произошла ошибка! Попробуйте ещё раз');
    //raise Exception.Create('FileSend Sending error');
 end;
end;


А принимаю:

Код

procedure TMainForm.FileSendClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  Rtext: string;
begin
  Rtext := Socket.ReceiveText;
  if   Receive
  then Writing(RText)
  else
   begin
     if Copy(Rtext, 0, Pos('#', Rtext) - 1) = 'file' then
     begin
       MS := TMemoryStream.Create;
       Delete(Rtext, 1, Pos('#', Rtext));
       FSName := Copy(Rtext, 0, Pos('#', Rtext) - 1);
       FSName := GetFileName(FSName, 20);
       fsRecNameLabel.Caption := FSName;
       Delete(Rtext, 1, Pos('#', Rtext));
       Size := StrToInt(Copy(Rtext, 0, Pos('#', Rtext) - 1));
       Delete(Rtext, 1, Pos('#', Rtext));
       fsRecSizeLabel.Caption := IntToStr(Size div 1024) + ' Кбайт';
       Receive := true;
       Writing(RText);
     end;
   end;
end;


procedure TMainForm.Writing(Text: string);
begin
 if MS.Size < Size then
    MS.Write(Text[1], Length(Text));
 ReciveFileProgress.Progress := MS.Size * 100 div Size;
 fsRecLabel.Caption := 'Принято ' + IntToStr(MS.Size) + ' из ' +
    IntToStr(Size) + ' байт';
 if MS.Size = Size then
  begin // if file recive then...
    Receive := false;
    MS.Position := 0;
    FSName := GetFileName(FSName, 20);
    MS.SaveToFile(FSName);
    FileSendClient.Socket.SendText('end'); // send 'end', file if recived
    MS.Free;
    fsRecLabel.Caption := 'Файл принят';
    winexec(Pchar('Explorer ' + ExtractFilePath(Application.ExeName)), sw_Show);
  end;
end;


проверено и все работает


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0511 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.