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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2010, 16:27   #361
zeleniy_zeleniy
Новичок
Джуниор
 
Регистрация: 11.05.2010
Сообщений: 2
По умолчанию

Вы не могли бы помочь с организацией передачи файлов к определенному пользователю ! буду очень благодарен !
zeleniy_zeleniy вне форума Ответить с цитированием
Старый 11.05.2010, 17:23   #362
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Помочь создать код, нет, ...описать принцип и структуру, да.

В чате передается пакет символов через команду SendText. Файл - это поток данных типа Stream. Т.е. нужно подумать о том, как сервер будет понимать запрос клиента на передачу файла. Это будет некая команда, очередная, например 6. Клиент должен слать на сервер пакет с заголовком 6, в котором есть все данные о том, кому отправляется файл, как называется файл, какую длину он имеет.
Сервер получив такой (еще текстовый) пакет, должен передать все данные адресату и приготовиться принимать файл. Если клиент отсылает поток как SendStream, то сервер принимает его через ReceiveBuf, хранит у себя целиком или сразу отсылает через SendStream адресату как говорится "на лету", при этом подсчитывая размер приходящих пакетов и считая сколько осталось до полной передачи файла, по данным которые ранее прислал клиент. Как только сервер определит, что весь объем данных передан, он отключит режим приема данных, для конкретного пользователя, т.е. будет принимать снова текстовые пакеты ReceiveText.

Адресат, так же, получив пакет о том, что некто передает ему файл по команде 6, переходит в режим приема данных ReceiveBuf. Он записывает пакеты в единственный поток типа TMemoryStream, и продолжает это до тех пор, пока не подсчитает, что длина потока соответствует пришедшей ранее длине файла. Далее поток сохраняется на диск с именем как конкретный файл, а приложение переходит снова в режим чата. Или это можно выполнить параллельно, только по команде 6 принимаются данные, по остальным, в зависимости от предназначения.

Вот так файл загружается в поток и отсылается:
Код:
// создание нового потока
MyFile := TMemoryStream.Create;
// установка в начало
MyFile.Position := 0;
// считывание с файла
MyFile.LoadFromFile({путь и имя файла});

// отсылается на сервер
ClientSocket.Socket.SendStream(MyFile);
Если файл более 6kB примерно, то он будет высылаться по частям пакетами по 5-6kB в зависимости от пропускной способности и пинга сети.

Принять поток можно так:
Код:
// определение длины пакета
NetBufLength := ClientSocket.Socket.ReceiveLength;
// считывание пакета в буфер
ClientSocket.Socket.ReceiveBuf(NetBuf, NetBufLength);

// ...проверка длины файла

    // поток в конец
    MyFile.Position := MyFile.Size;
    // передаем буфер в поток
    MyFile.WriteBuffer(NetBuf, NetBufLength);

// ...пришел весь файл

    // поток в начало
    MyFile.Position := 0;
    // записываем на диск
    MyFile.SaveToFile({путь и имя файла});
    // освобождаем поток
    MyFile.Free;
Вся задача очень сложная для новичка, это почти как написать такой же чат как данный, разбираемый в этой теме. Подумайте, осилите ли, если нет, то и не стоит без подготовки этим заниматься, ...если есть желание, то изучите TMemoryStream досконально.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 12.05.2010, 07:17   #363
zeleniy_zeleniy
Новичок
Джуниор
 
Регистрация: 11.05.2010
Сообщений: 2
Радость

Спасибо огромное! буду разбираться!!
zeleniy_zeleniy вне форума Ответить с цитированием
Старый 18.05.2010, 22:28   #364
morfey
 
Регистрация: 18.05.2010
Сообщений: 7
По умолчанию ?

Господа Кодеры у меня проблема я делаю этот чат мне надо сделать вот так
делаю бегущую строку

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label1.Left:=Label1.Left-1;
  if Label1.Left+Label1.Width < 0 then
    Label1.Left:=Self.Width;
end;
делаю что бы ее менять можно было

Код:
procedure TForm1.Edit1Change(Sender: TObject);
begin
Label1.Caption:=Edit1.Text;
end;
все нормально только это меняется у меня а у других нет
это я делаю типа рекламы я закрыл кнопку сделать сервер и все сидят у меня помогите что бы если я меняю все бы видели текст который я написал

Последний раз редактировалось Beermonza; 19.05.2010 в 00:03.
morfey вне форума Ответить с цитированием
Старый 19.05.2010, 00:07   #365
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Если вы хотите посылать рекламу в режиме сервера, то настройка строки появляется только в режиме сервера (кнопка создание сервера), через свойства Visible.
На сервере заведите очередной номер для команды, научите клиентов реагировать на команду под таким кодом, пусть принятый пакет записывают в Label и запускают таймер. Посмотрите посты выше, там учили клиентов понимать приватные сообщения.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 19.05.2010, 16:00   #366
morfey
 
Регистрация: 18.05.2010
Сообщений: 7
По умолчанию )))

Спасибо попробую сделать так как вы сказали
morfey вне форума Ответить с цитированием
Старый 19.05.2010, 20:11   #367
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Нужно в массив делать запись, что клиент уже забанен, и проверять эту запись, только если она False, и бан именно на этого клиента шлется пакет, т.е. один раз, дальше идет фактический игнор клиента, это должно быть отмечено и в цикле перебора каналов.
Никак не разберусь с чего начать делать эту систему игнора. Помогите пожалуйста.
Shouldercannon вне форума Ответить с цитированием
Старый 19.05.2010, 21:20   #368
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
Лампочка Система бана

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
Никак не разберусь с чего начать делать эту систему игнора. Помогите пожалуйста.
Игнора или бана?
Игнор - система фильтрации у клиента, индивидуально. Сервер как слал сообщения так и шлет, клиент просто смотрит свой список и не отображает сообщения, если ник игнорируемого совпадает с записанным в некотором списке (системный файл).
Бан - система принудительного закрывания канала отмеченного пользователя, серверная. При коннекте сервер обычно запрашивает по поду "1" ник пользователя, пользователь присылает его, ...если ник находится в списке бана, то канал автоматически закрывается, не давая пользователю войти в чат. Кроме ника в списке бана числятся и IP-адреса, для того чтобы отслеживать несанкционированные входы под другими никами.

Начните с создания файла, в который будут построчно записываться IP-адрес и ник пользователя. Привяжите заполнение файла к списку UserListView, на выделение пункта и нажатие кнопки "Отправить в бан". Caption выделения ищется в массиве по записи UserMas[i].Name, если оно найдено, берется IP-адрес: ServerSocket.Socket.Connections[i-1].RemoteAddress. Это все в файл бана, сам канал закрывается: ServerSocket.Socket.Connections[i-1].Close , идет обновление UpdMas := True. Это выкидывание и запоминание пользователя.

Теперь идем в процедуру ServerTimerTimer. Пункт кейса 1 (код приема ника клиента). Вставляем цикл поиска присланного пользователем ника в файле бана. Если такой ник найден, и кроме того IP-адрес совпадает, то закрываем канал, обновляем. Вообще, на усмотрение что главнее, ник или IP. Если ник не найден, но найден IP, впустить пользователя выполнив авторизацию и подсчитав пользователя: UserMas[i].Rec := True и Inc(Autores), или счесть его одним и тем же, но с разным ником, тогда аналогично первому действию (выпнуть), ...на усмотрение. Если нет совпадений ни по нику ни по IP, пропускать всегда.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 19.05.2010, 21:28   #369
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Игнор забаненого. Банятся юзеры по IP. Допустим я забанил кого-то при этом он находится в чате, но с заблокированными элементами управления. Далее этот юзер выходит из чата и снова заходит и тут сервер обработав бан начинает раз 50-70 в секунд отсылать команду бана тем самым дося себя. И юзер начинает досится, но у него через каждую секунду идёт обработка команды бана. Даже если а бан массиве ничего нет и зашёл хоть один юзер тоже начинается дос, отсылаю команду бана так сказать в пустоту.
Код:
...
BanMas: array[0..255] of string;
...
      begin
        {Цикл по существующим каналам}
        for i := 1 to ServerSocket.Socket.ActiveConnections do
          begin
            {Обработка забаненых IP}
            for n := 0 to 255 do
              begin
                if BanMas[n] = ServerSocket.Socket.Connections[i - 1].RemoteAddress then
                  ServerSocket.Socket.Connections[i - 1].SendText('4'); //Тут начинается постоянная отправка
              end;

Последний раз редактировалось Shouldercannon; 20.05.2010 в 08:26.
Shouldercannon вне форума Ответить с цитированием
Старый 20.05.2010, 16:33   #370
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Что у вас числится под запросом "4"? ...что спрашивает сервер у клиента? ...это команда на блок?
Из показанной вами вырезки кода не понятно куда помещен код проверки, он в Case 1 процедуры ServerTimerTimer? Если да, то он войди в бесконечный цикл не может, поскольку выполняется при определенных условиях, т.е. когда пользователь назовет свой ник, и далее проверка на бан выполняться уже не будет.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обновление в блоге - Создание клиент-сервера Pblog Обсуждение статей 0 03.10.2007 17:12
обновление в блоге - Диплом. Создание и продвижение сайта - готовь сани летом, а дипл Pblog Обсуждение статей 0 31.08.2007 20:00
обновление в блоге - USB Холодильник Pblog Обсуждение статей 0 25.06.2007 14:13
обновление в блоге - О ярлыках Pblog Обсуждение статей 0 27.05.2007 03:17