Форум: "Сети";
Текущий архив: 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