Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Работа для программиста > Фриланс
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2007, 14:54   #31
NoName_emaNoN
Форумчанин
 
Аватар для NoName_emaNoN
 
Регистрация: 15.11.2007
Сообщений: 229
По умолчанию

Цитата:
Сообщение от vizor9 Посмотреть сообщение
А ты сделай в свой чат, чтоб можно было файлы передовать, или просто дай мне исходничек по передачи файла через ClientSocket, ServerSocket, а то я искал везде и ни чего не нашел, а сам я не знаю как с ними работать!
Мне кажется на форуме должно быть много рассмотренных вопросов по передаче файлов.
Пользуйся поиском:
1) http://www.delphisources.ru/files/sources/internet/2006_year/send_udp.zip

2)Недоработанная теория: http://programmersforum.ru/showthread.php?t=4522&highlight=%CF %E5%F0%E5%E4%E0%F7%E0+%F4%E0%E9%EB% EE%E2

В чат это уже запланировано давно, можешь ждать, можешь сам делать.
Компьютер не подчиняется законам физики: глюки возникают из ниоткуда, файлы исчезают в никуда, а вес измеряется в метрах.
NoName_emaNoN вне форума Ответить с цитированием
Старый 05.12.2007, 06:14   #32
vizor9
Пользователь
 
Регистрация: 25.05.2007
Сообщений: 59
По умолчанию

Ладно, подожду!! )))
vizor9 вне форума Ответить с цитированием
Старый 06.12.2007, 15:26   #33
vizor9
Пользователь
 
Регистрация: 25.05.2007
Сообщений: 59
По умолчанию

Слышь я тебе могу помочь по передаче файлов по сокетам!!!
вот КОД:

почтавь на форму:
tserversocket, tbutton, tedit, tprogressbar и tstatiusbar.
tserversocket, порт (port): 1001.
у tstatusbar, поставь переменную simplepanel в true.

...
var
form1: tform1;
ms: tmemorystream;

procedure tform1.formcreate(sender: tobject);
begin
serversocket1.open;
end;

procedure tform1.formdestroy(sender: tobject);
begin
serversocket1.close;
end;

procedure tform1.button1click(sender: tobject); // Передаём файл
var
size: integer;
p: ^byte;
begin
ms := tmemorystream.create;
ms.loadfromfile(edit1.text);
serversocket1.socket.connections[0].sendtext('file#'+edit1.text+'#'+in ttostr(ms.size)+'#');
ms.position := 0;
p := ms.memory;
size := serversocket1.socket.connections[0].sendbuf(p^, ms.size); // progressbar1.position := size*100 div ms.size;
statusbar1.simpletext := 'Отправлено '+inttostr(size)+' из '+inttostr(ms.size)+' байт'
end;

код:

procedure tform1.serversocket1clientread(send er: tobject;
socket: tcustomwinsocket);
begin
if socket.receivetext = 'end' then
begin
statusbar1.simpletext := 'Клиент принял файл';
ms.free;
end;
end;




procedure tform1.serversocket1clientconnect(s ender: tobject;
socket: tcustomwinsocket);
begin
statusbar1.simpletext := 'Соединение установлено';
end;
А на событие onclientdisconnect впишите:

procedure tform1.serversocket1clientdisconnec t(sender: tobject;
socket: tcustomwinsocket);
begin
statusbar1.simpletext := 'Соединение не установлено';
end;

Вот сервер и готов ! Теперь перейдём к клиенту (он принимает файл) с ним возни будет побольше:
Разместите на форму компоненты: tclientsocket, две метки tlabel, tprogressbar и tstatusbar.
Установите у компонента tclientsocket, порт (port): 1001 (как у сервера), а переменную адрес (address): 127.0.0.1 (ваш ip).
Не забудьте установить у компонента tstatusbar, переменную simplepanel в true, чтоб было видно наш текст.
В одном tlabel'е выводится имя фала, в другой размер файла.
Должно получиться что-то похожее на это:

Объявляем переменные и одну процедуру. Запишите переменные именно в private, иначе ничего не будет работать:

...
procedure writing(text: string);
private
{ private declarations }
name: string;
size: integer;
receive: boolean;
ms: tmemorystream;


procedure tform1.formcreate(sender: tobject);
begin
clientsocket1.open;
receive := false;
end;


procedure tform1.formdestroy(sender: tobject);
begin
clientsocket1.close;
end;


procedure tform1.clientsocket1connect(sender: tobject;
socket: tcustomwinsocket);
begin
statusbar1.simpletext := 'Соединение установлено';
end;

procedure tform1.clientsocket1disconnect(send er: tobject;
socket: tcustomwinsocket);
begin
statusbar1.simpletext := 'Соединение не установлено';
end;


procedure tform1.writing(text: string);
begin
if ms.size < size then
ms.write(text[1], length(text));
progressbar1.position := ms.size*100 div size;
statusbar1.simpletext := 'Принято '+inttostr(ms.size)+' из '+inttostr(size);
if ms.size = size then
begin
receive := false;
ms.position := 0;
ms.savetofile(name);
clientsocket1.socket.sendtext('end' );
ms.free; // Убиваем буфер
statusbar1.simpletext := 'Файл принят';
end;
end;


procedure tform1.clientsocket1read(sender: tobject;
socket: tcustomwinsocket);
var
rtext: string;
begin
rtext := socket.receivetext;
if receive then
writing(rtext)
else
if copy(rtext, 0, pos('#', rtext) -1) = 'file' then
begin ms := tmemorystream.create;
delete(rtext, 1, pos('#', rtext));
name := copy(rtext, 0, pos('#', rtext) -1);
delete(rtext, 1, pos('#', rtext));
size := strtoint(copy(rtext, 0, pos('#', rtext) -1));
delete(rtext, 1, pos('#', rtext));
label1.caption := 'Размер файла: '+inttostr(size)+' байт';
label2.caption := 'Имя файла: '+name;
receive := true;
writing(rtext);
end;
end;
Ну вот и всё...
Данная программа проверялась на delphi6.


Только как мне это реализовать в чате, как сделать чат чтоб там сразу пресудствовали сервер и клиент по передачи файлов, я так попробовал сделать и он на одной форме начал отправлять файл сам себе и вызывается ошибка, а еще в самом чате присутствует клиент сервер и вообще полный пепец!!!! Помоги соединить все вместе!!! ))
vizor9 вне форума Ответить с цитированием
Старый 06.12.2007, 16:26   #34
NoName_emaNoN
Форумчанин
 
Аватар для NoName_emaNoN
 
Регистрация: 15.11.2007
Сообщений: 229
Хорошо

Пасиба за помощь!
Я позже опробую этот код.
В принципе, да, клиент и сервер на одной форме могут не понять и передавать файлы между собой.
Я ещё чуть позже возму работающий код передачи файлов, уже проверенный, только я пока не знаю каким образом он передаёт файлы, так чтож пока ничё сказать не могу. Через недельку будут какие-нибудь результаты !
Компьютер не подчиняется законам физики: глюки возникают из ниоткуда, файлы исчезают в никуда, а вес измеряется в метрах.
NoName_emaNoN вне форума Ответить с цитированием
Старый 10.12.2007, 00:11   #35
NoName_emaNoN
Форумчанин
 
Аватар для NoName_emaNoN
 
Регистрация: 15.11.2007
Сообщений: 229
По умолчанию

Vizor9, посмотрел, использовал той код, в нём есть распространённая проблема:

Ну во-первых мало общался с ServerSocket, поэтому может что-то и не до конца понимаю, но не ты первый с этим кодом, который "тупит".
Когда я передаю самому себе через localhost файл 10 МБ, проходит секунд 10, это не совсем правильно, ведь скорость на HDD куда быстрей чем 1МБ/с, в том коде который я хотел взять тоже была такая ошибка, но она была исправлена, значит когда возму код, отпишусь.

Кстати когда передавал файл в 700 метров, у меня всё глюкнуло, поэтому это код нужно либо исправлять, либо выбрасывать

Можно попробовать передавать через UDP, но там похоже используется вообще прямой поток, т.е. при сбое может потерятся часть информации, а если будет передаваться exe файл, то хана exe файлу, этот способ подходит только для передачи видео или звука.

А можно вообще использовать idTCPCLient, который используется в чате, только продумывать передачу файла, да ещё и одновременную переписку, будет тяжело, но можно просто поместить второй Клиент, только присоеденить к другому порту.

Вообщем надо думать, и жду от тебя, vizor9 предложений, только продуманных уже!
Компьютер не подчиняется законам физики: глюки возникают из ниоткуда, файлы исчезают в никуда, а вес измеряется в метрах.
NoName_emaNoN вне форума Ответить с цитированием
Старый 10.12.2007, 09:59   #36
vizor9
Пользователь
 
Регистрация: 25.05.2007
Сообщений: 59
По умолчанию

Ладно подумаю, А ты не подскажешь мне как сделать смайлики в чате, чтоб не исходником передовались, а картинкой!
vizor9 вне форума Ответить с цитированием
Старый 10.12.2007, 11:22   #37
NoName_emaNoN
Форумчанин
 
Аватар для NoName_emaNoN
 
Регистрация: 15.11.2007
Сообщений: 229
По умолчанию

Цитата:
Сообщение от vizor9 Посмотреть сообщение
Ладно подумаю, А ты не подскажешь мне как сделать смайлики в чате, чтоб не исходником передовались, а картинкой!
В смысле исходником?
Компьютер не подчиняется законам физики: глюки возникают из ниоткуда, файлы исчезают в никуда, а вес измеряется в метрах.
NoName_emaNoN вне форума Ответить с цитированием
Старый 11.12.2007, 07:17   #38
vizor9
Пользователь
 
Регистрация: 25.05.2007
Сообщений: 59
По умолчанию

Ну всмысле, чтоб рисунком передовались по инету, а не так:* , * ну и т.д!!
vizor9 вне форума Ответить с цитированием
Старый 11.12.2007, 07:19   #39
vizor9
Пользователь
 
Регистрация: 25.05.2007
Сообщений: 59
По умолчанию

Ну ты надеюсь понял, как в обычных чатах!!!
vizor9 вне форума Ответить с цитированием
Старый 11.12.2007, 09:12   #40
NoName_emaNoN
Форумчанин
 
Аватар для NoName_emaNoN
 
Регистрация: 15.11.2007
Сообщений: 229
Радость

Тебе в сообщение нужно вставить какой-то уникальный код, и в какой-нибудь список внести все отправляемые смайлы. При отправке сообщения отправлять картинки (смайлы), которые нужно.
На стороне другого клиента, принимать все картинки, сохранять их во временную папку, потом при отображении сообщения, заменять все уникальные коды на принятые картинки.

Но я не понимаю зачем оно тебе нужно, почему не подайдёт как в обычных чатах? Ведь при передачи картинок тратится много времени, и трафика. Лучше сделать 10-20 стандартных смайлов, и отправлять их уникальный код, а на стороне принимающего отображать смайлы согласно стандарту.

Я правильно тебя понял?
Компьютер не подчиняется законам физики: глюки возникают из ниоткуда, файлы исчезают в никуда, а вес измеряется в метрах.
NoName_emaNoN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц