Список клиентов. В чем ошибка?

Рейтинг: 0Ответов: 1Опубликовано: 05.02.2011

Здравствуйте!) Посмотрите что не так?

Активируется socket и отправляется сообщение:

procedure TForm1.Button2Click(Sender: TObject);
begin
if organiz.Text <> '' then
begin
ClientSocket1.Address:='127.0.0.1';
ClientSocket1.Port:=3030;
clientsocket1.Active:=true;
ClientSocket1.Socket.SendText(organiz.Text);
end
else
begin
organiz.SetFocus;
MessageDlg('Введите название организации', mtError,[mbOK],0);
end;
end;

Здесь запоминается и выводится socket:

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  j:=j+1;
  sockets[j]:=Socket.SocketHandle;
  n:=j;
  chat.Lines.Insert(0,inttostr(sockets[j]));
end;

Здесь должно приниматься сообщение с именем клиента и выводиться в clients (ListBox):

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
  var s: string;
begin
for i:=1 to n do
 if Socket.SocketHandle = sockets[i] then
 begin
  s:=socket.ReceiveText;
  name[i]:=s;
  clients.items.add(s);
 end;
end;

но почему то ничего не выводится... Смысл всего этого в том, чтоб при подключение клиента, в массив (sockets) заносилось значение socket.handle. Далее сразу же посылалось сообщение, содержащие имя клиента, которое также запоминалось в массиве (name) и заносилось в clients (listBox), чтоб потом прежде чем отправить сообщение, надо выбрать из списка имя клиента и потом по значению sockets этого имени отправлять сообщение, т.е определенному клиенту... А дальше при посылке другого сообщение проверять есть ли такой socket.handle в массиве, если да то проводить другой анализ, если нет, то записываем... но что то не так пошло с самого начало, а вот что? Спасибо)

Ответы

▲ 3Принят

Есть идея. Прочтите здесь: http://docwiki.embarcadero.com/VCL/en/ScktComp.TClientSocket.Active. Тут сказано, что в рантайме надо использовать Open.

At design time, set Active to true to make the socket open a connection when the application starts running. At runtime, use the Open or Close method to open or close the connection.

Лично у меня есть подозрение, что установка Active=true асинхронна, так что в тот момент, когда вы пытаетесь что-то отправить (вызываете SendText) сокет ещё не подключён.

Для того, чтобы быть уверенным, что вы шлёте данные, когда действительно имеете такую возможность, делайте это тогда и только тогда, когда соединение установлено. Например, слушайте событие OnConnect компонента ClientSocket. И не забывайте обрабатывать ошибки. В сети вероятность коммуникационных ошибок очень велика, поэтмоу не следует ею пренебрегать.

И последнее: вы используете метод SendText. Этот метод посылает текст.. в какой-то кодировке.. один бог ведает, в какой. Это очень непереносимо и моджет вызвать неприятности с кодировками и, как следствие, получение мусора. Так же, этот метод возвращает количество байт, которые были переданы и это количество может быть меньше, чем вы просили передать. Это означает, что надо по идее проверять, а было ли послано всё или только часть. И уж совсем плохо (серьёзный недостаток API, упущение борланда) то, что он возвращает количество байт, а на вход принимает символы. Это не всегда одно и то же и не всегда можно узнать, какое количество символов соответствует этим байтам, так как это зависит от кодировки. Правда, пока у вас винда одной версии на обеих сторонах, бояться нечего. Но времена меняются. Надо сразу привыкать думать о таких вещах.

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

По поводу XML:

http://ru.wikipedia.org/wiki/XML

http://www.w3schools.com/xml/default.asp

После освоения можно браться за реализацию

http://www.codenet.ru/cat/Languages/Delphi/Delphi-XML/

Ну и конечно же, источник истины в первой инстранции по XML: http://www.w3.org/TR/2008/REC-xml-20081126/