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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как послать файл через TcpServer & TcpClient ? 
:(
    Опции темы
Andrewtitoff
Дата 18.1.2008, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пытаюсь послать файл, файл посылается, но прога все время вываливается с ошибками: 
Access violation, Canvas does not allow drawing... =(((
И как при приеме узнать размер пересылаемого файла что бы засунуть его в ReceiveBuf.., SizeOf(Buf) возвращает все время 4 ... =(((
Вот текст моей программы:
Код

================================================
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Sockets, StdCtrls;

type
 TMyChat = class(TForm)
   Label1: TLabel;
   Label2: TLabel;
   Label3: TLabel;
   RemoteHost: TEdit;
   RemotePort: TEdit;
   LocalPort: TEdit;
   Display: TMemo;
   Edit: TEdit;
   Connect: TButton;
   TcpServer1: TTcpServer;
   TcpClient1: TTcpClient;
   SendFile: TButton;
   procedure TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient);
   procedure SendClick(Sender: TObject);
   procedure ConnectClick(Sender: TObject);
   procedure SendFileClick(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 MyChat: TMyChat;

implementation

{$R *.dfm}

procedure TMyChat.ConnectClick(Sender: TObject);
begin
TcpServer1.LocalPort := LocalPort.Text;
TcpServer1.Active := True;
TcpClient1.RemotePort := RemotePort.Text;;
TcpClient1.RemoteHost := RemoteHost.Text;;
TcpClient1.Active := True;
end;

procedure TMyChat.FormClose(Sender: TObject; var Action: TCloseAction);
begin
TcpServer1.Active := False;
TcpClient1.Active:= False;
TcpClient1.Disconnect;
end;

procedure TMyChat.SendFileClick(Sender: TObject);
var
asd:Tmemorystream;
begin
asd := TMemoryStream.Create;
asd.Position:=0;
asd.LoadFromFile('c:\1.txt');
asd.Position:=0;
TcpClient1.Active := True;
 try
   if TcpClient1.Connect then
     begin
     TcpClient1.SendStream(asd);
     end;
 finally
   TcpClient1.Disconnect;
 end;
asd.free;
end;

procedure TMyChat.TcpServer1Accept(Sender: TObject;
 ClientSocket: TCustomIpClient);
var
    s:string;
    asd:tmemorystream;
    len:integer;
    buf:pointer;
 begin
asd:=TMemoryStream.Create;
asd.Position:=0;
len:= ClientSocket.ReceiveBuf(buf,192,0);
asd.WriteBuffer(buf,len);
asd.SaveToFile('c:\000.txt');
asd.Free;
FreeMem(Buf);
clientsocket.Close;
ShowMessage('clientsocket.Close');
end;

end.
================================================

PM MAIL   Вверх
Snowy
Дата 18.1.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Цитата(Andrewtitoff @  18.1.2008,  11:31 Найти цитируемый пост)
И как при приеме узнать размер пересылаемого файла
Передавать сначала размер, а затем сам файл.
ЗЫ. see also http://forum.vingrad.ru/topic-65704.html
PM MAIL   Вверх
Andrewtitoff
Дата 18.1.2008, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ясно, это я видел, просто я думал что можно как нить по человачески, как в TClientSocket
писать Len:=Socket.ReceiveLength;...  =((((
PM MAIL   Вверх
Snowy
Дата 18.1.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Это не по человечески.
TCP/IP - это поток.
Будут ли ещё данные или нет - известно только клиенту.
Поэтому клиент и должен сообщить - щас передам столько-то байт, принимай...
PM MAIL   Вверх
Andrewtitoff
Дата 18.1.2008, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



2 Snowy 
Ну это то да, это я поросто привел пример с исходника где сервер отправляет клиенту..., то есть как я понял что теперь если использовать TcpServer & TcpClient то узнать размер пересылаемого файла нельзя, надо тока заранее это все отаравлять строкой?, так что ли получается?
Ну это то ладно, я переживу, отправлю, слава богу с отправкой строк я разобрался..., а как мне файл то вообще послать, а то у меня файл то посылается, тока непонятные ошибки какие то и программа вылетает... =((((
PM MAIL   Вверх
Snowy
Дата 18.1.2008, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Пересылай всё, как блок данных.
Все методы, типа SendStrings - это просто обёртки над отправкой блока данных, для удобства в конкретном случае.
Всё передаваемое есть блок данных.
Отправляй размер блока, потом сам блок.
Так можно передать любые данные.
Забудь про обёртки - всё есть байты. Пихай их непосредственно в буфер отправки.
PM MAIL   Вверх
Andrewtitoff
Дата 18.1.2008, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



2 Snowy
Я с тобой полностью согласен по поводу "всё есть байты", так я изначально и спрашиваю как это сделать, исходник моей проги который я вывесил в самом начале работает тока наполовину... =(((, файл он передает, тока после этого вываливается в лучшем случае, а обычно вешает всю систему... =((((
Не мог бы ты написать мне рабочий пример(тока проверенный у себя, а то нерабочих то поно в инете) как переслать файл через TcpServer & TcpClient ?...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

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

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

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

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

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


 




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


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

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