Всем привет! Взял я из книги фленова 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.
скорей всего меня здесь неправильно поняли т.к.: Я имел ввиду, что это чат, а не по типу аськи, когда идёт личная беседа В каждом клиенте стоит и клиент и серверный компонент UDP, для отправки текста, а слить файл должны мочь(корявый йазык ) все компыЮ но при желании человека, а оно должно выражаться кликом по ссылке))
Мой тебе совет используй сокеты... это намного проще и удобнее а поняли тебя правильно... в любом случае UDP выигрывает
ни Udp ни Tcp быстрей они все медленые если ваш инет не от билайн Udp шлёт пакеты. Но делаеть их размеров в файл не стоит. Если ты будешь слать файл разбив на пакеты, то не факт, что ты их всегда будешь получать в правильной очерёдности. И хоть УДП гарантирует доставку. но пакеты могут пропадать. На этом фоне ТСП проще. Но у УДП есть большое примущество. УДП может преодоевать НАТ который стоит и получателя и отправителя. А ТСП не может. Если ты делаешь п2п чат. то УДП гораздо лучше. как раз поэтому скайп использует УДП.
мдаа... вобщем так, насколько я знаю: udp Быстрый за счет того что не требует ответа от получателя, преодалевает Nat tcp Медленный, но надежный. Требует ответ от получателя. К примеру от программы А уходит пакет к программе Б, программа А не пошлет очередной пакет, до тех пор, пока программа Б, не вернет ответ что все ОК, если же не ОК, пакет отправится снова. Upd целесобразно применять для мультимедии, голосовая передача, вэб камера и т.п. Но передавать бинарные файлы с помощью Upd не советую
Оффтоп, пошел спор, прекращаем, для выбора файла используй OpenDialog как тебе сказал WiZard, для передачи, лучше вообще используй сокеты.