Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ServerSocket, Отправка сообщения определенным клиентам 
:(
    Опции темы
blazhko
Дата 31.7.2009, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 12.12.2007

Репутация: нет
Всего: нет



Привет! Я хочу реализовать отправку сообщений с TServerSocket определенной группе клиентов. Т.е. при подключении ник клиента добавляется в CheckListBox, помечаем потом несколько клиентов и отправляем им сообщения.

Пробовал реализовать так,но выдает ошибку:


Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls, CheckLst;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    ServerSocket1: TServerSocket;
    Button2: TButton;
    Edit1: TEdit;
    NameList: TCheckListBox;
    procedure Button1Click(Sender: TObject);
    procedure ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

Type
  TUserList = object
  Name: String;    // имя (ник)
  Handle: Integer; // id клиента
 end;




var
  Form1: TForm1;
  log:string;
  len,com:integer;
  UserMas: array[0..255] of TUserList;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 serversocket1.Active:=true;
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
 Memo1.Lines.Add('Client connected');
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  i,j: Integer;
begin
 log:=Socket.ReceiveText;
 com:=StrToInt(Copy(log,1,1));
 len:=Length(log)-1;
 if com=1 then
 begin
   {NameList.Items.Add(Copy(log,2,len));}

      For i:=1 to ServerSocket1.Socket.ActiveConnections do
        Begin
          UserMas[i].Name:=Copy(log,2,len);
          UserMas[i].Handle:=ServerSocket1.Socket.Connections[i].SocketHandle;
          NameList.Items.Add(UserMas[i].Name + ' ' + IntToStr(UserMas[i].Handle));
        end;
  {Memo1.Lines.Add('Nick= ' + Copy(log,2,len) + IntToStr(ServerSocket1.Socket.Handle));}
 end else
 begin
  Memo1.Lines.Add('Message= ' + Copy(log,2,len));
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 i:integer;
begin
For i := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
  If (NameList.Checked[i]) and (NameList.Items.Strings[i]=UserMas[i].Name) then
   begin
     if ServerSocket1.Socket.Connections[i].SocketHandle <> UserMas[i].Handle then
     ServerSocket1.Socket.SendText(Edit1.Text);
   end;
 end;

end.



PM MAIL   Вверх
kami
Дата 31.7.2009, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Цитата(blazhko @  31.7.2009,  18:24 Найти цитируемый пост)
Пробовал реализовать так,но выдает ошибку:

текст ошибки, значения, конечно, не имеет....

Приведи полный текст ошибки, и где (на какой строчке) возникает.

На первый взгляд могу сказать только:
Цитата(blazhko @  31.7.2009,  18:24 Найти цитируемый пост)
 ServerSocket1.Socket.SendText(Edit1.Text);

заменить на
Код

ServerSocket1.Socket.Connections[i].SendText(Edit1.Text);


Добавлено через 1 минуту и 54 секунды
Цитата(blazhko @  31.7.2009,  18:24 Найти цитируемый пост)
com:=StrToInt(Copy(log,1,1));

на второй взгляд:
а что ты будешь делать, если клиент отправляет "12345", а на сервер приходит сперва "123" а потом "45" (это более чем возможная ситуация). ???
PM MAIL WWW   Вверх
kami
Дата 31.7.2009, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



И на третий взгляд:
1. массив UserMas - лишний.
Для хранения информации о пользователе лучше воспользоваться свойством Data, присутствующем в Socket, обслуживающем соединение (т.е. в ServerSocket.Socket.Connections[i].Data). В это свойство легко "запихиваются" как записи, так и объекты. Единственное, на что стоит обратить внимание - создание и своевременное уничтожение этих данных.
2. Зачем хранить в UserMas хендлы сокетов, если они и так имеются в TCustomWinSocket? Тем более, что статический массив не обеспечивает правильной работы с сокетами. Как пример: есть пользователи 1, 2, 3. Пользователь 2 отключился. В ServerSocket остались пользователи 1 (как и раньше - с индексом 0) и 3 (был с индексом №2, теперь с индексом №1). Потом пользователь 2 опять подключился. И в ServerSocket теперь порядок пользователей - 1, 3, 2. Эту ситуацию со статическим массивом обрабатывать несколько неудобно.
PM MAIL WWW   Вверх
blazhko
Дата 31.7.2009, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 12.12.2007

Репутация: нет
Всего: нет



Ошибка : List index out of bounds (1)
PM MAIL   Вверх
kami
Дата 31.7.2009, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Цитата(blazhko @  31.7.2009,  21:39 Найти цитируемый пост)
Ошибка : List index out of bounds (1)

ГДЕ? На какой строке кода?
PM MAIL WWW   Вверх
blazhko
Дата 31.7.2009, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 12.12.2007

Репутация: нет
Всего: нет



Да когда приходит сообщение с данными клиента.
PM MAIL   Вверх
kami
Дата 31.7.2009, 21:53 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Цитата(blazhko @  31.7.2009,  21:50 Найти цитируемый пост)
Да когда приходит сообщение с данными клиента.

Может, все-таки ответишь на мой вопрос? На. Какой. Строке. Кода. Вываливается. Ошибка.

Добавлено через 5 минут и 46 секунд
Ладно, не буду долго мучить.
На будущее совет - если на форуме спрашивают что-то (для того, чтобы понять где и в чем скрылась ошибка), нужно отвечать по существу и полностью на поставленный вопрос.

Ошибка у тебя в коде скрылась здесь:
Цитата(blazhko @  31.7.2009,  18:24 Найти цитируемый пост)
 For i:=1 to ServerSocket1.Socket.ActiveConnections do

Индексация соединений у ServerSocket начинается с 0, а не с 1. И лучше сразу приучить себя всё нумеровать с нуля - легче будет потом.
Поэтому правильный код для ServerSocket1ClientRead будет
Код

For i:=0 to ServerSocket1.Socket.ActiveConnections-1 do


Добавлено через 8 минут и 47 секунд
И на всякий случай - перечитай мои предыдущие сообщения, бо логика, которую ты закладываешь в программу годится только для несложных тестовых примеров. Если собираешься сделать рабочую программу, то лучше сразу стараться сделать ее правильно.

хотя о чем это я - сам несколько лет назад делал сетевое приложение, считая его код идеальным. Сейчас даже боюсь смотреть на его исходники - инфаркт хватит...
PM MAIL WWW   Вверх
blazhko
Дата 31.7.2009, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 12.12.2007

Репутация: нет
Всего: нет



Спасибо огромное!=)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0864 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.