![]() |
Как передать файл по Tcp
Всем привет!
Взял я из книги фленова Udp-чат и чуть-чуть модифнул, а вот какая бяка получается: нужно передавать файлы в чате, но почитав, я въехал, что Udp медленней Tcp прошу помощи вот в чём: нужно чтобы при нажатии на кнопку выходил лист с директориями, в которых можно выбрать файл и отправить ссылку на него, чтобы сообщение выглядело к примеру так: "Андрюха, при! вот документ: ССЫЛКА НА СЛИВ ФАЙЛА c компа в локалке" также в локальной сети есть комп, раздающий вай-фай, т.е. его можно использовать как временное хранилище файлов для передачи |
не вижу проблемы... используешь диалог типа 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 откроет диалог. Пример: Цитата:
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. |
Цитата:
|
ок, Tcp медленней Udp , пойду запомню...
|
Цитата:
|
скорей всего меня здесь неправильно поняли т.к.:
Я имел ввиду, что это чат, а не по типу аськи, когда идёт личная беседа В каждом клиенте стоит и клиент и серверный компонент UDP, для отправки текста, а слить файл должны мочь(корявый йазык :D ) все компыЮ но при желании человека, а оно должно выражаться кликом по ссылке)) |
Цитата:
|
ни Udp ни Tcp быстрей они все медленые если ваш инет не от билайн :)
Udp шлёт пакеты. Но делаеть их размеров в файл не стоит. Если ты будешь слать файл разбив на пакеты, то не факт, что ты их всегда будешь получать в правильной очерёдности. И хоть УДП гарантирует доставку. но пакеты могут пропадать. На этом фоне ТСП проще. Но у УДП есть большое примущество. УДП может преодоевать НАТ который стоит и получателя и отправителя. А ТСП не может. Если ты делаешь п2п чат. то УДП гораздо лучше. как раз поэтому скайп использует УДП. |
| Время: 14:50 |