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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2011, 21:04   #1
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию Вопрос по сокетам

Доброе время суток!

Есть клиент/сервер, пересылка сообщений туда/сюда работает нормально, но вот вопрос если я запускаю несколько клиентов то как серверу определить с какого клиента читать сообщение?
То есть " i "
Код:
msg:=ServerSocket1.Socket.Connections[i].ReceiveText;
можна делать так
Код:
for i:=0 to ServerSocket1.Socket.ActiveConnections do begin
msg[i]:=ServerSocket1.Socket.Connections[i].ReceiveText;
и дальше шерстить весь масив с сообщениями на предмет наличия сообщений.
Но я считаю это неверно н/р у меня 100000 клиентов то сервер просто захлебнется.
Replicant вне форума Ответить с цитированием
Старый 26.02.2011, 12:31   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

На сколько я помню, вы не сами должны читать, а ждать OnClientRead(), в нём параметр Socket: TCustomWinSocket и укажет, с какого клиента пришли данные.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 26.02.2011, 15:43   #3
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
На сколько я помню, вы не сами должны читать, а ждать OnClientRead(), в нём параметр Socket: TCustomWinSocket и укажет, с какого клиента пришли данные.
В случае с клиентом так и происходит:
Код:
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
begin
    msg:=ClientSocket1.Socket.ReceiveText;
end;
Тут нет нюансов, сокет просто получил сообщение я его прочитал.
В случае же с сервером такая ботва не проходит, дабы прочитать полученное сообщение нужно указать индекс подключения (то самое "i"):
Код:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
    msg:=ServerSocket1.Socket.Connections[i].ReceiveText;
end;
Как я уже написал в первом посте можно прошерстить все активные подключения и считать все что сервер принял, но мне этого не нужно.
Случай такой из пачки клиентов один присылает сообщение и вместо того чтобы лопатить всех активных клиентов нужно указать индекс того который прислал данные.

Последний раз редактировалось Replicant; 26.02.2011 в 15:46.
Replicant вне форума Ответить с цитированием
Старый 26.02.2011, 16:27   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> дабы прочитать полученное сообщение нужно указать индекс подключения

честно говоря, никогда с этими классами не работал, но выглядит это более чем странно. Почему нельзя читать прямо из переданного сокета? Зачем вобще там сокет передаётся по-вашему, для красоты?

Код:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
    msg := Socket.ReceiveText();
end;
То же самое относится и к клиенту.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 26.02.2011, 16:53   #5
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

а если клиент не подключен, как потом Serverу послать?
как я понимаю, ето сохранить даные и проверять когда он будетв сети послать,
но как потом определить что ето он? вот для чего я в теме спрашивал про IP, к Clientaм ведь можно обрашаться так?
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 26.02.2011, 16:59   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

создайте новую тему, или расширьте свою, там отвечу, а тут оффтопить не буду.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 26.02.2011, 17:05   #7
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
Почему нельзя читать прямо из переданного сокета? Зачем вобще там сокет передаётся по-вашему, для красоты?

Код:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
    msg := Socket.ReceiveText();
end;
В том то и проблема что так просто сервер не читает, он выдает ошибку "Asynchronys socket error 10053" и после не е сразу еще одну: no address was sepplied (10057).
Указываешь индекс подключения и ошибки пропадают!

Последний раз редактировалось Replicant; 26.02.2011 в 17:11.
Replicant вне форума Ответить с цитированием
Старый 26.02.2011, 17:29   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Че-то у вас не то с клиентом или сервером.

Вот простейший код, который работает как и должен работать. Т.е. принимает сообщения от обоих клиентов без всяких индексов.

Проверял в Delphi 7, а у вас какая?

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    srv: TServerSocket;
    cln1: TClientSocket;
    cln2: TClientSocket;
  public
    { Public declarations }
    procedure onClnRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure onClnConnect(Sender: TObject; Socket: TCustomWinSocket);
  end;

var
  Form1: TForm1;


implementation


{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
  srv := TServerSocket.create(self);
  srv.OnClientRead := onClnRead;
  //
  cln1 := TClientSocket.create(self);
  cln2 := TClientSocket.create(self);
  cln1.OnConnect := onClnConnect;
  cln2.OnConnect := onClnConnect;
  //
  srv.Port := 8000;
  srv.Open();
  //
  cln1.Host := '127.0.0.1';
  cln1.Port := 8000;
  //
  cln2.Host := '127.0.0.1';
  cln2.Port := 8000;
end;

//
procedure TForm1.onClnRead(Sender: TObject; Socket: TCustomWinSocket);
var
  msg: string;
begin
  msg := Socket.ReceiveText();
  Caption := Caption + msg;
end;

procedure TForm1.onClnConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  if (Socket = cln1.Socket) then
    Socket.SendText('Hi from client1')
  else
    Socket.SendText('Hi from client2')
end;

//
procedure TForm1.Button1Click(Sender: TObject);
begin
  cln1.Open();
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  cln2.Open();
end;


end.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите, пожалуйста, по сокетам _Инженер_ Работа с сетью в Delphi 7 02.10.2009 17:11
Вопрос по сокетам Garacio_cain Работа с сетью в Delphi 17 29.12.2008 17:22
вопрос по сокетам и общение как в ICQ.Сложный вопрос... Руслантус Общие вопросы C/C++ 2 12.08.2008 21:10
прередача по сокетам geronime Работа с сетью в Delphi 0 22.12.2007 11:27