 |
|

21.09.2008, 16:36
|
|
Участник форума
Регистрация: 27.03.2008
Сообщений: 288
С нами:
9538880
Репутация:
83
|
|
Как передать файл по Tcp
Всем привет!
Взял я из книги фленова Udp-чат и чуть-чуть модифнул, а вот какая бяка получается:
нужно передавать файлы в чате, но почитав, я въехал, что Udp медленней Tcp
прошу помощи вот в чём:
нужно чтобы при нажатии на кнопку выходил лист с директориями, в которых можно выбрать файл и отправить ссылку на него, чтобы сообщение выглядело к примеру так:
"Андрюха, при! вот документ: ССЫЛКА НА СЛИВ ФАЙЛА c компа в локалке"
также в локальной сети есть комп, раздающий вай-фай, т.е. его можно использовать как временное хранилище файлов для передачи
Последний раз редактировалось ronald; 21.09.2008 в 17:24..
|
|
|

21.09.2008, 16:47
|
|
Участник форума
Регистрация: 06.04.2008
Сообщений: 102
С нами:
9524949
Репутация:
28
|
|
не вижу проблемы... используешь диалог типа 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
Последний раз редактировалось Zabuldon; 21.09.2008 в 16:51..
|
|
|

21.09.2008, 16:57
|
|
Reservists Of Antichat - Level 6
Регистрация: 12.02.2006
Сообщений: 891
С нами:
10653446
Репутация:
836
|
|
ээээ.... Как раз таки наоборот =\
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
__________________
*********************************
*Я не волшебник ٩(๏̯͡๏)۶, только учусь...*
*********************************
Программы на заказ
Times to fly...
|
|
|

21.09.2008, 17:00
|
|
Участник форума
Регистрация: 06.04.2008
Сообщений: 102
С нами:
9524949
Репутация:
28
|
|
Сообщение от 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.
Последний раз редактировалось Zabuldon; 21.09.2008 в 17:02..
|
|
|

21.09.2008, 17:05
|
|
Постоянный
Регистрация: 09.06.2005
Сообщений: 531
С нами:
11010660
Репутация:
439
|
|
Сообщение от ronald
Всем привет!
Udp медленней Tcp
с каких это пор? в Udp нет проверки ошибок => он быстрее.
|
|
|

21.09.2008, 17:12
|
|
Участник форума
Регистрация: 27.03.2008
Сообщений: 288
С нами:
9538880
Репутация:
83
|
|
ок, Tcp медленней Udp , пойду запомню...
|
|
|

21.09.2008, 17:16
|
|
Участник форума
Регистрация: 06.04.2008
Сообщений: 102
С нами:
9524949
Репутация:
28
|
|
Сообщение от ronald
ок, Tcp медленней Udp , пойду запомню...
На самом деле они правы UDP пакет устроен проще на его разбор меньше времени уходит
|
|
|

21.09.2008, 17:17
|
|
Участник форума
Регистрация: 27.03.2008
Сообщений: 288
С нами:
9538880
Репутация:
83
|
|
скорей всего меня здесь неправильно поняли т.к.:
Я имел ввиду, что это чат, а не по типу аськи, когда идёт личная беседа
В каждом клиенте стоит и клиент и серверный компонент UDP, для отправки текста, а слить файл должны мочь(корявый йазык  ) все компыЮ но при желании человека, а оно должно выражаться кликом по ссылке))
Последний раз редактировалось ronald; 21.09.2008 в 17:30..
|
|
|

21.09.2008, 17:29
|
|
Участник форума
Регистрация: 06.04.2008
Сообщений: 102
С нами:
9524949
Репутация:
28
|
|
Сообщение от ronald
скорей всего меня здесь неправильно поняли т.к.:
Я имел ввиду, что это чат, а не по типу аськи, когда идёт личная беседа
В каждом клиенте стоит и клиент и серверный компонент UDP, для отправки текста
Мой тебе совет используй сокеты... это намного проще и удобнее а поняли тебя правильно... в любом случае UDP выигрывает
|
|
|

21.09.2008, 18:44
|
|
Познающий
Регистрация: 08.03.2008
Сообщений: 46
С нами:
9567020
Репутация:
17
|
|
ни Udp ни Tcp быстрей они все медленые если ваш инет не от билайн
Udp шлёт пакеты. Но делаеть их размеров в файл не стоит. Если ты будешь слать файл разбив на пакеты, то не факт, что ты их всегда будешь получать в правильной очерёдности. И хоть УДП гарантирует доставку. но пакеты могут пропадать.
На этом фоне ТСП проще. Но у УДП есть большое примущество. УДП может преодоевать НАТ который стоит и получателя и отправителя.
А ТСП не может.
Если ты делаешь п2п чат. то УДП гораздо лучше. как раз поэтому скайп использует УДП.
|
|
|
|
 |
|
Предыдущая тема
Следующая тема
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|