Просмотр полной версии : Как передать файл по Tcp
Всем привет!
Взял я из книги фленова Udp-чат и чуть-чуть модифнул, а вот какая бяка получается:
нужно передавать файлы в чате, но почитав, я въехал, что Udp медленней Tcp
прошу помощи вот в чём:
нужно чтобы при нажатии на кнопку выходил лист с директориями, в которых можно выбрать файл и отправить ссылку на него, чтобы сообщение выглядело к примеру так:
"Андрюха, при! вот документ: ССЫЛКА НА СЛИВ ФАЙЛА c компа в локалке"
также в локальной сети есть комп, раздающий вай-фай, т.е. его можно использовать как временное хранилище файлов для передачи
Zabuldon
21.09.2008, 16:47
не вижу проблемы... используешь диалог типа fileopen, сохрани путь к файлу потом сделай temp директорию на том компе (убедившись что права доступа есть), скопируй туда файл, затем выдай ссылку типа 172.12.12.12/temp/имя файла и все... но есть способы намного проще... юзай сокеты...
вот пример...
Обработчик для клиента:
var
MyStream: TMemoryStream;
begin
MyStream := TMemoryStream.Create;
MyStream.LoadFromFile('c:\windows\рабочий стол\DelphiWorld.txt');
NMStrm1.PostIt(MyStream);
MyStream.Free;
end;
Обработчик для сервера:
procedure TForm1.NMStrmServ1MSG(Sender: TComponent;
const sFrom: string; strm: TStream);
var
MyStream: TMemoryStream;
begin
MyStream := TMemoryStream.Create;
MyStream.CopyFrom(strm, NMStrmServ1.BytesTotal);
MyStream.SaveToFile('c:\windows\рабочий стол\DelphiWorld2.txt');
end;
Пример взят из Delphi World
ээээ.... Как раз таки наоборот =\
TCP медленее UDP...
ну ты крут, слушай, wi-fi... ссылки...
для начала:
OpenFileDialog - Диалог для выбора файла. Метод Execute откроет диалог. Пример:
if (OpenFileDialog1.Execute) then Edit1.Text:=OpenFileDialog1.FileName else ShowMessage('Файл не выбран');
По поводу передачи файлов:
http://www.hostmake.ru/articles/delphi/384/
www.delphisources.ru/pages/faq/internet_net.html
http://www.cyberforum.ru/delphi/thread8742.html
http://fssr.ru/hz.php?name=Forums&file=viewtopic&t=20820
Zabuldon
21.09.2008, 17:00
ээээ.... Как раз таки наоборот =\
TCP медленее UDP...
ну ты крут, слушай, wi-fi... ссылки...
для начала:
OpenFileDialog - Диалог для выбора файла. Метод Execute откроет диалог. Пример:
По поводу передачи файлов:
http://www.hostmake.ru/articles/delphi/384/
www.delphisources.ru/pages/faq/internet_net.html
http://www.cyberforum.ru/delphi/thread8742.html
http://fssr.ru/hz.php?name=Forums&file=viewtopic&t=20820
Ну зачем так жестко =)) судя по всему просто человек был дезинформирован =)
З.Ы. вот еще пример с сокетами:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls;
type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
ServerSocket1: TServerSocket;
btnTestSockets: TButton;
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure btnTestSocketsClick(Sender: TObject);
private
FStream: TFileStream;
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
iLen: Integer;
Bfr: Pointer;
begin
iLen := Socket.ReceiveLength;
GetMem(Bfr, iLen);
try
Socket.ReceiveBuf(Bfr^, iLen);
FStream.Write(Bfr^, iLen);
finally
FreeMem(Bfr);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FStream := nil;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(FStream) then
begin
FStream.Free;
FStream := nil;
end;
end;
procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
if Assigned(FStream) then
begin
FStream.Free;
FStream := nil;
end;
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
FStream := TFileStream.Create('c:\temp\test.stream.html', fmCreate or fmShareDenyWrite);
end;
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Socket.SendStream(TFileStream.Create('c:\temp\test .html', fmOpenRead or fmShareDenyWrite));
end;
procedure TForm1.btnTestSocketsClick(Sender: TObject);
begin
ServerSocket1.Active := True;
ClientSocket1.Active := True;
end;
end.
BrainDeaD
21.09.2008, 17:05
Всем привет!
Udp медленней Tcp
с каких это пор? в Udp нет проверки ошибок => он быстрее.
ок, Tcp медленней Udp , пойду запомню...
Zabuldon
21.09.2008, 17:16
ок, Tcp медленней Udp , пойду запомню...
На самом деле они правы UDP пакет устроен проще на его разбор меньше времени уходит
скорей всего меня здесь неправильно поняли т.к.:
Я имел ввиду, что это чат, а не по типу аськи, когда идёт личная беседа
В каждом клиенте стоит и клиент и серверный компонент UDP, для отправки текста, а слить файл должны мочь(корявый йазык :D ) все компыЮ но при желании человека, а оно должно выражаться кликом по ссылке))
Zabuldon
21.09.2008, 17:29
скорей всего меня здесь неправильно поняли т.к.:
Я имел ввиду, что это чат, а не по типу аськи, когда идёт личная беседа
В каждом клиенте стоит и клиент и серверный компонент UDP, для отправки текста
Мой тебе совет используй сокеты... это намного проще и удобнее а поняли тебя правильно... в любом случае UDP выигрывает
ни Udp ни Tcp быстрей они все медленые если ваш инет не от билайн :)
Udp шлёт пакеты. Но делаеть их размеров в файл не стоит. Если ты будешь слать файл разбив на пакеты, то не факт, что ты их всегда будешь получать в правильной очерёдности. И хоть УДП гарантирует доставку. но пакеты могут пропадать.
На этом фоне ТСП проще. Но у УДП есть большое примущество. УДП может преодоевать НАТ который стоит и получателя и отправителя.
А ТСП не может.
Если ты делаешь п2п чат. то УДП гораздо лучше. как раз поэтому скайп использует УДП.
мдаа...
вобщем так, насколько я знаю:
udp
Быстрый за счет того что не требует ответа от получателя, преодалевает Nat
tcp
Медленный, но надежный. Требует ответ от получателя. К примеру от программы А уходит пакет к программе Б, программа А не пошлет очередной пакет, до тех пор, пока программа Б, не вернет ответ что все ОК, если же не ОК, пакет отправится снова.
Upd целесобразно применять для мультимедии, голосовая передача, вэб камера и т.п. Но передавать бинарные файлы с помощью Upd не советую
De-visible
21.09.2008, 20:49
Оффтоп, пошел спор, прекращаем, для выбора файла используй OpenDialog как тебе сказал WiZard, для передачи, лучше вообще используй сокеты.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot