Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Как передать файл по Tcp (https://forum.antichat.xyz/showthread.php?t=85606)

ronald 21.09.2008 16:36

Как передать файл по 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

W!z@rD 21.09.2008 16:57

ээээ.... Как раз таки наоборот =\
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

Цитата:

Сообщение от W!z@rD
ээээ.... Как раз таки наоборот =\
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

Цитата:

Сообщение от ronald
Всем привет!
Udp медленней Tcp

с каких это пор? в Udp нет проверки ошибок => он быстрее.

ronald 21.09.2008 17:12

ок, Tcp медленней Udp , пойду запомню...

Zabuldon 21.09.2008 17:16

Цитата:

Сообщение от ronald
ок, Tcp медленней Udp , пойду запомню...

На самом деле они правы UDP пакет устроен проще на его разбор меньше времени уходит

ronald 21.09.2008 17:17

скорей всего меня здесь неправильно поняли т.к.:
Я имел ввиду, что это чат, а не по типу аськи, когда идёт личная беседа
В каждом клиенте стоит и клиент и серверный компонент UDP, для отправки текста, а слить файл должны мочь(корявый йазык :D ) все компыЮ но при желании человека, а оно должно выражаться кликом по ссылке))

Zabuldon 21.09.2008 17:29

Цитата:

Сообщение от ronald
скорей всего меня здесь неправильно поняли т.к.:
Я имел ввиду, что это чат, а не по типу аськи, когда идёт личная беседа
В каждом клиенте стоит и клиент и серверный компонент UDP, для отправки текста

Мой тебе совет используй сокеты... это намного проще и удобнее а поняли тебя правильно... в любом случае UDP выигрывает

fry 21.09.2008 18:44

ни Udp ни Tcp быстрей они все медленые если ваш инет не от билайн :)

Udp шлёт пакеты. Но делаеть их размеров в файл не стоит. Если ты будешь слать файл разбив на пакеты, то не факт, что ты их всегда будешь получать в правильной очерёдности. И хоть УДП гарантирует доставку. но пакеты могут пропадать.

На этом фоне ТСП проще. Но у УДП есть большое примущество. УДП может преодоевать НАТ который стоит и получателя и отправителя.

А ТСП не может.

Если ты делаешь п2п чат. то УДП гораздо лучше. как раз поэтому скайп использует УДП.


Время: 14:50