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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2010, 20:20   #311
mishqa35
Пользователь
 
Регистрация: 01.10.2009
Сообщений: 10
По умолчанию

Еще интересует как зделать возможность смены ника, когда сидиш в чате. И интересует как реализовать отправку файлов с отображением хода отправки. (название, общ. размер, скока отослано (кб), скока осталось отослать (кб), скока время осталось и скака время заняла отправка)

ps; со статусами так и не разабрался

Последний раз редактировалось mishqa35; 25.02.2010 в 21:17.
mishqa35 вне форума Ответить с цитированием
Старый 26.02.2010, 16:17   #312
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Передача файла через сокеты

Цитата:
Сообщение от mishqa35 Посмотреть сообщение
Еще интересует как сделать возможность смены ника, когда сидишь в чате. И интересует как реализовать отправку файлов с отображением хода отправки. (название, общ. размер, сколько отослано (кб), сколько осталось отослать (кб), сколько время осталось и сколько время заняла отправка)
Я человек занятой, ...напишу как, но делать не буду. Напишите особую команду, которую сервер понимает как "смена ника", сопоставьте канал отправителя со списком, замените Name.
Есть такой класс TMemoryStream - поток данных, и вы наверняка видели в сокетах кроме SendText и SendBuf - SendStream. Это и есть буфер для передачи любых данных, большого размера.
Что нужно сделать? ...создадим переменную NetFile: TMemoryStream; ...загрузим в нее файл любого формата с диска:

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

// отправка пользователю, он в канале i
ServerSocket.Socket.Connections[i].SendStream(NetFile);
Все, ...файл ушел в сеть в канал клиента. Теперь на стороне клиента примем файл:

Код:
Var
  NetBuf: TByteArray;          // приемный буфер
  NetFile: TMemoryStream; // поток
  BufLength: Integer;       // длина приемного буфера
...

// по команде с сервера создаем поток в какой-либо процедуре
NetFile := TMemoryStream.Create;
...

// в ClientSocketRead -------------------------

BufLength := ClientSocket.Socket.ReceiveLength;    // определение длины пакета
ClientSocket.Socket.ReceiveBuf(NetBuf, BufLength); // считывание пакета в буфер

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

// по условию передачи полного размера (нужно до файла слать параметры, среди которых длина файла) выполняется сохранение файла

NetFile.Position := 0;            // поток в начало
NetFile.SaveToFile({путь}); // сохраняем файл на диск
NetFile.Free;                        // освобождаем поток
Файл у клиента. Как вы будите визуализировать передачу это ваше личное дело, ...есть компонент Win32 - ProgressBar, он показывает ползунок, изучите.
Структура передачи будет такова:

1) Сервер шлет клиенту команду "прими файл", в ней имя файла, размер и сопутствующие данные, например имя отправителя или что еще угодно.
2) Сервер подготавливает поток и отсылает клиенту. В силу особенности сети поток разобьется на части и будет приходить пакетами.
3) Клиент принимает пакет заголовка, создает поток, записывает длину файла в переменную, переходит в режим приема файла. Каждый раз после приема пакета перед записью в поток сверяет с размером, если весь файл пришел, то сохраняет на диск поток, если не весь, то записывает в ProgressBar текущий размер принятого.
4) Клиент переходит в режим чата.

Цитата:
Сообщение от mishqa35 Посмотреть сообщение
ps; со статусами так и не разобрался
Придется разобраться, я объяснил все предельно понятно, ...еще яснее только - дать готовый код.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 26.02.2010 в 16:21.
Beermonza вне форума Ответить с цитированием
Старый 28.02.2010, 01:50   #313
errorrr
Пользователь
 
Регистрация: 27.02.2010
Сообщений: 12
По умолчанию

Beermonza Спасибо вам за программу,за ваше терпение ,помощь,все работает нормально!!!! Это отличное пособие для начинающих.Конечно функций мало в нем ,можно вас попросить выложить исходники регистрации нормальной в чате, смайлов, и бана! Если не можите укажите сколько денег нужно за них , мне очень нужны эти исходники ,хочу чат зделать ,хороший чат, довно мечтаю!
errorrr вне форума Ответить с цитированием
Старый 28.02.2010, 17:17   #314
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Спасибо за отзывы, ...но, думаю, вам любой знающий программист доделает из того набора, что уже предложен, ...у меня нет времени этим заниматься.
Спешу только предупредить, если вы будете использовать доделанный проект в коммерческих целях, то не забывайте об авторском праве, в остальном можно поступать с исходниками и их доработкой как-угодно.

Если вам нужна именно моя помощь, пишите в личку.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 03.03.2010, 03:44   #315
mishqa35
Пользователь
 
Регистрация: 01.10.2009
Сообщений: 10
По умолчанию

Beermonza, нужна твоя помощь..
Решил доделать статусы, перечитал все твои посты не по одному разу, сделал отправку с клиента на сервер и с сервера клиенту. Отправка сделана на StatusBox'е. Принимает и отправляет замечательно, вот загвоздка в этих строчках
Цитата:
Цитата:
Сообщение от Beermonza
В Case пойдет пункт 4: , в нем забираем 2-й байт как статус, и остальное, начиная с 3-го символа и до конца, ищем в списке пользователей UserListView.Items.Item[j].Caption совпадение, естественно, через цикл от 0 до Count-1. Найдя ник, меняем картинку UserListView.Items.Item[j].ImageIndex.
Что значит это? ...нужен цикл, перебирающий все записи в UserListView. Создайте его по j от 0 до UserListView.Items.Count-1. В нем забирайте ник с пакета (Copy(text,3,Length-2)), сканируйте в списке Caption (там содержится ник пользователей): UserListView.Items.Item[j].Caption; ...не просто так сканируйте, а при условии, условие это If..then..else..end. Задача: если сканирование нашло совпадение, тогда -сменить значок (UserListView.Items.Item[j].ImageIndex), какое значение придать? ...нужно сперва добавить картинки в ImageList1, знать порядковый номер картинки, да так, чтобы номера картинок в банке совпадали номерам записей в StatusComboBox.
Решил обойтись без картинок, а просто приписывать статус к нику.
Что я сделал, ... добавил с процедуру ClientSocketRead номер 4 и добавил код
Код:
For j:=0 to UserListView.Items.Count-1 do
Begin
If (j+1) <> i then UserListView.Items.Item[j].Caption := 'ник ['+Copy(text,2,1)+']';
end;
этот код вроде работает, висит на StatusBoxChange, после смены статуса меняются все ники. Не знаю как сделать чтобы менялся ник у того кто сменил статус.
mishqa35 вне форума Ответить с цитированием
Старый 03.03.2010, 20:55   #316
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Если все с отправкой и приемом сделано как я описал выше, то сервер присылает пакет с ником, изменившим свой статус, по коду 4. Вот у клиента сработал Case 4: что в нем? ...судя по описанию, должен быть поиск ника в списке, ...условие:

Код:
If UserListView.Items.Item[j].Caption = Copy(text,3,Length-2) then 
  UserListView.Items.Item[j].Caption := Copy(text,3,Length-2)+' статус: '+Copy(text,2,1);
Это условие в цикле по числу записей будет искать совпадение по Caption, если найдет его, то к нику припишет статус в виде цифры. Далее нужно разобраться с картинками, или создать условия на дописку, по типу того же Case, пункты - код статуса, внутри - переменная, ей придается текстовое значение: "на месте", "занят", "отошел", "недоступен" и пр. Эта переменная и будет допиской в показанное выше условие, вместо 'статус: '+Copy(text,2,1)
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 04.03.2010, 05:40   #317
mishqa35
Пользователь
 
Регистрация: 01.10.2009
Сообщений: 10
По умолчанию

Beermonza, большое спасибо с этим разобрался. Но есть глюк, возможно только один раз менять статус, при повторной смене не чего не происходит.
Вот код:
так я отправляю с клиента / сервера
Код:
procedure TForm1.StatusBoxChange(Sender: TObject);
begin
// если я сервер
If ServerSocket.Active <> false then
  begin
    For j := 0 to ServerSocket.Socket.ActiveConnections -1 do
      Begin
        If (j+1) <> i then ServerSocket.Socket.Connections[j].SendText('4'+IntToStr(StatusBox.ItemIndex)+Setting.NickEdit.Text);
      end;
  end
else // если нет
  begin
    ClientSocket.Socket.SendText('4'+IntToStr(StatusBox.ItemIndex)+UserMas[i].Name);
  end;
end;
В procedure ClientSocketRead добавил пункт 4
Код:
       4: begin
		// клиент принимает и показывает в ChatRzRichEdit
		ChatRzRichEdit.Lines.Add(Copy(text, 3, Length(text)-2)+' | '+Copy(text, 2, 1)); // тест nick | status
		For j:=0 to UserListView.Items.Count-1 do
		Begin
			If UserListView.Items.Item[j].Caption = Copy(text, 3, Length(text)-2) then
				UserListView.Items.Item[j].Caption := Copy(text, 3, Length(text)-2)+' ['+Copy(text, 2, 1)+']';
          	end;
       end;
В procedure ServerTimerTimer добавил пункт 4
Код:
                 4: Begin
                     // добавим себе
                     ChatRzRichEdit.Lines.Add(Copy(text, 2, 1)+' | '+UserMas[i].Name); // тест status | nick
                      // разошлем всем пользователям (кроме того, кто прислал)
                      For j := 0 to ServerSocket.Socket.ActiveConnections -1 do
                        Begin
                          If (j+1) <> i then ServerSocket.Socket.Connections[j].SendText('4'+Copy(text, 2, 1)+UserMas[i].Name);
                        end;
                      // меняем статус
                      If UserListView.Items.Item[j].Caption = UserMas[i].Name then
                        UserListView.Items.Item[j].Caption := UserMas[i].Name+' ['+Copy(text, 2, 1)+']';
                 end;
И не мог разобраться как сделать вот это
Цитата:
... Далее нужно разобраться с картинками, или создать условия на дописку, по типу того же Case, пункты - код статуса, внутри - переменная, ей придается текстовое значение: "на месте", "занят", "отошел", "недоступен" и пр. Эта переменная и будет допиской в показанное выше условие, вместо 'статус: '+Copy(text,2,1)
Крутил код но так и не получилось. Cтатуса будет 3. Картинки добавлены в TImageList.. ImageIndex 2, 3 и 4. Я так полагаю надо что то типа если статус 0 то показывать 2 картинку, если статус 1 то показывать 3 картинку, если статус 2 то показывать 4 картинку. Но не знаю как это будет выглядеть в коде.
mishqa35 вне форума Ответить с цитированием
Старый 04.03.2010, 15:53   #318
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

procedure TForm1.StatusBoxChange(Sender: TObject); - ошибки, с сервера приписка UserMas[i].Name. Разослать с сервера нужно всем, без условий, поскольку каналы числятся на клиентах.

В ServerTimerTimer аналогично, без условий отсылать всем клиентам, ведь клиент шлет только запрос, а статус меняет ему и всем остальным - сервер.

С картинками:

Код:
// меняем статус
If UserListView.Items.Item[j].Caption = Copy(text, 3, Length(text)-2) then
  Begin
     UserListView.Items.Item[j].ImageIndex := StrToInt(Copy(text, 2, 1));
  end;
У клиента пункты статуса не соответствуют номерам картинок, нужно написать соответствие, в зависимости от номера пункта в списке статусов задавать сразу правильный индекс картинки и отправлять на сервер.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 04.03.2010, 23:19   #319
errorrr
Пользователь
 
Регистрация: 27.02.2010
Сообщений: 12
По умолчанию )))

Здравствуйте еще раз хочу процитировать ваш пост

Цитата:
Сообщение от Beermonza
Еще масса изменений и доработок нужно выполнить, прежде чем это все заработает как нужно .
На счет смайликов, ...я вообще не сторонник этого дела, хватает и простых скобок и знаков препинания, но желающие все же оснастить чат рисуночками или просто помочь кому-то это сделать, могут разобраться с TRxRichEdit и выложить алгоритмы.
я строю по вашей методике чат пока все пашет и радует вот нету смайлов можете помочь это сделать очень нужно

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

Понимаю, что очень вам нужно, но у меня просто нет компонента TRxRichEdit, скачивать его и заниматься, чтобы потом объяснить на пальцах, у меня, к сожалению нет времени, ...итак кодинга завались, еле разгребаю, ...извините.
Задайте вопрос по поводу использования компонента TRxRichEdit в соответствующем разделе: http://programmersforum.ru/forumdisplay.php?f=39 ...вам помогут.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 05.03.2010 в 00:59.
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