Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];

Вниз

Помогите с сокетом разобраться   Найти похожие ветки 

 
Dmitriy_R   (2004-04-26 13:30) [0]

Пытаюсь создать програмулину но есть проблемма, если кто может знает то помогите решить ее.
Что надо: пишу программу сервер, что она делает, клиент подключается к серверу и передает строку (2+2) сервер должен ответить 4, если клиент передает (4+4) то сервер отвечает 8.
когда клиент один нет проблемм все работает. но если одновременно приходит 2-10 клиентов то тут у меня неразбериха полная.
Думал сделать так: после подключения клиента создавать для него отдельный поток и в нем работать с ним до его отключения, тоесть для каждого клиента будет создоваться свой поток.
Кто нить подскажите как это реализовать (если не сложно то с примером).
Заранее благодарен.


 
Digitman ©   (2004-04-26 13:42) [1]


> тут у меня неразбериха полная


в смысле ?
2 + 2 = 8 ?
)

procedure TMyForm.IdTCPServerExecute(..);
var
 s: String;
begin
 with AThread.Connection do
 begin
   s := ReadLn; // "2 + 2"
   WriteLn(s + " = " + Calculate(s)); // "2 + 2 = 4"
 end;
end;


 
Dmitriy_R   (2004-04-26 13:48) [2]

Не это понятно, но к примеру подключился клиент к серверу, создалось соединение, клиент начинает слать в сокет математические какието примеры (2+2, ......, 8+8)
ПООЧЕРЕДИ, тоесть отправил 2+2 получил ответ от сервера отправил 4+4 получил ответ и так далее до отключения клиента от сервера.
тоесть сервер общается с клиентом давольно таки долго.
В это время может быть подключено много клиентов от 1 до 10...
и сервер должен точно знатьь от кого что пришло и кому что отправить.


 
Digitman ©   (2004-04-26 13:59) [3]


> Dmitriy_R   (26.04.04 13:48) [2]


> сервер должен точно знатьь от кого что пришло и кому что
> отправить


он, сервер, и без твоего напряга знает это

смотри простейший пример в  [1]


 
Dmitriy_R   (2004-04-26 14:31) [4]

Извеняюсь за тупось но тут я не силен.
Тоесть если я сделаю примерно вот так:

procedure TMyForm.IdTCPServerExecute(..);
var
s: String;
begin
with AThread.Connection do
begin
  s := ReadLn; // "2 + 2"
  if s = "2 + 2" then WriteLn(s + " = " + Calculate(s));
  if s = "4 + 4" then WriteLn(s + " = " + Calculate(s));
  if s = "8 + 8" then WriteLn(s + " = " + Calculate(s));
  if s = "16 + 16" then WriteLn(s + " = " + Calculate(s));
end;
end;

то он будет выдавать все в норме как положено и кому положено.
да и вот еще а можно тогда все это как нить с ServerSocket.
тоесть обойтись без инди...


 
Digitman ©   (2004-04-26 14:42) [5]


> а можно тогда все это как нить с ServerSocket


можно.

на то есть событие OnClientRead


 
Dmitriy_R   (2004-04-26 14:42) [6]

И вот еще если я внутри задам цикл то после отключения клиента как она на это отреагирует?
procedure TMyForm.IdTCPServerExecute(..);
var s: String;
label st;
begin
with AThread.Connection do
begin
st:
 s := ReadLn; // "2 + 2"
 if s = "2 + 2" then WriteLn(s + " = " + Calculate(s));
 if s = "4 + 4" then WriteLn(s + " = " + Calculate(s));
 if s = "8 + 8" then WriteLn(s + " = " + Calculate(s));
 if s = "16 + 16" then WriteLn(s + " = " + Calculate(s));
goto st;
end;
end;


 
Digitman ©   (2004-04-26 14:53) [7]

кто тебя так учил циклы организовывать ? WHILE/REPEAT уже упразднили в Паскале ?

никаких циклов здесь не нужно, сам обработчик OnExecute циклически вызывается сервером до тех пор пока соединение активно


 
Dmitriy_R   (2004-04-26 14:54) [8]

Блин нет не получается, если не сложно может кто даст пример на ServerSocket чтобы при конекте клиента создавался отдельный поток для каждого клиента.
Если можно пример, по нему легче понять что к чему.


 
Ozone ©   (2004-04-26 14:55) [9]

Чем Indy не нравиться?


 
Dmitriy_R   (2004-04-26 14:57) [10]

Digitman как отловить момент подключения клиента?
Тоесть клиент подключился, но первым диалог должен начать сервер.
Он шлет клиенту текст (матиматика)
только после клиет шлет ему эти примеры...


 
Digitman ©   (2004-04-26 14:58) [11]


> Dmitriy_R


IdTCPServer как раз и создает по одному доп.потоку на каждое соединение

какая тебе разница-то ?


 
Dmitriy_R   (2004-04-26 14:59) [12]

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


 
Dmitriy_R   (2004-04-26 15:07) [13]

> Digitman
Если не трудно подскажи как сделать следующее:
сервер слушает порт,
клиент подключается
сервер видя что клиент подключился отправляет ему текст (мат.)
клиент получив этот текст кидает ему какуто мат. действие (2+2)
сервер делает вычисление или что то еще и дает ответ (4)
далее идет обмен долго и упорно...
по окончании клиент разрывает соединение, или сервер рвет его.
вот что мне надо.
Если не сложно то подскажите пошагам...


 
Digitman ©   (2004-04-26 15:08) [14]


> просто я раньше все делал на ServerSocket


раз "делал все", что ж тогда жалуешься на непонятности ?


 
Dmitriy_R   (2004-04-26 15:12) [15]

> Digitman
> раз "делал все", что ж тогда жалуешься на непонятности ?

Дак в том то и дело что раньше клиент был один и небыло проблемм, а вот теперь надо чтоб несколько клиентов сидело, вот и страдаю..


 
Digitman ©   (2004-04-26 15:13) [16]


> Dmitriy_R   (26.04.04 15:07) [13]


"Я бы взял по частям, но мне нужно все сразу" (С) О.И.С.Б.М.Бендер-бей

по шагам - это значит написать за тебя всю программу

не жирно будет ? нахалявку ? может для начала пояснишь, для чего тебе мультипоточность нужна на сервере ? выражение 2 + 2 вычисляется практически мгновенно, для чего тебе потоки-то понадобились ?


 
Dmitriy_R   (2004-04-26 15:25) [17]

> Digitman
Не нетак понял.
Описано так по причине простоты.
То что надо сильно намудрено, есть машина которая снимает с некоторого устройства данные, раньше небыло проблемм по сети ОДИН клиент брал у сервера эти данный и все работало. Но вот в один прекрасный момент появилось еще несколько машин которым для управления цепями тоже надо эти данные снятые с датчика.
Вот и встал вопрос как обслужить серверу 10 клиентов с учетом что им надо разные данные. Вот я для простоты и написал.
А писать за меня не надо, я просто прошу объяснить потому как это думаю не первый случай и дальше будет хуже.
А так как на примере проще понять я и прошу простой примерчик.


 
Digitman ©   (2004-04-26 16:08) [18]


> прошу простой примерчик


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

procedure TMyForm.SSClientExecute;
var
s: String;
begin
try
 while not Terminated and ClientSocket.Connected do
  begin
   s := s + ClientSocket.ReceiveText;
   if IsMathStatement(s) then
    begin
      ClientSocket.SendText(Calculate(s));
      s := "";
    end;
  end;
except
end;
end;



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.021 c
14-1086366197
Jeer
2004-06-04 20:23
2004.06.20
Неужели вам всем все равно вот это ?


6-1083222482
IncubuS
2004-04-29 11:08
2004.06.20
Проблемы с получение hmtl страницы


14-1085903308
KilkennyCat
2004-05-30 11:48
2004.06.20
Компонент MS Word


3-1085645194
dim-
2004-05-27 12:06
2004.06.20
Разграничение доступа к записи


1-1086294580
killer
2004-06-04 00:29
2004.06.20
Изменение цветов в StringGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский