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

Вниз

Потоки   Найти похожие ветки 

 
Leny   (2002-07-26 08:27) [0]

Помогите, пожайлуста!
Что-то у меня не получается работать с потоками...
У меня есть клиент и сервер. Клиент соединяется с сервером
ClientSocket1.Active:=True;
а потом должен послать строку S...
Как мне это сделать через поток, а не через SendText?


 
Digitman   (2002-07-26 08:59) [1]

А зачем ? ты же только строковую информацию собираешься посылать, так и пользуйся SendText ! К чему усложнять ? Потоки нужны для транспорта разнородной инф-ции в сеансе связи: например, графика, звук, файлы, структуры какие-то собственного определения и пр. и пр.

Вот поясни это ... Ради только строкового транспорта не имеет смысла использовать потоки ...


 
Leny   (2002-07-26 09:07) [2]

Задача у меня такая:
Есть один сервер и 10 клиентов. Если какой-то из клиентов уже связался с сервером, то остальным тоже не должно быть отказано в связи. Из книжек я поняла, что для этого необходимо создавать несколько потоков.
При этом каждый из клиентов будет посылать серверу по 7-10 строк текста, которые сервер должен принять и записать у себя тоже в виде строк.


 
Ghost.   (2002-07-26 09:24) [3]

Все это есть в компоненте не грузись лишним


 
Leny   (2002-07-26 09:27) [4]

> Все это есть в компоненте не грузись лишним

В каком компоненте? И как сделать, чтобы все клиенты могли одновременно связаться с сервером?



 
Digitman   (2002-07-26 09:57) [5]

Из книжек ты неверно поняла. Или - книжки кривые.

Давай так я тебе скажу : если ты используешь TServerSocket в режиме ServerType = stNonBlocking, то безо всяких на то "потоков" ты преспокойно решаешь свою задачу (в том, разумеется, виде как ты ее описала)


 
Leny   (2002-07-26 10:14) [6]

В этом режиме и с помощью SendText я уже написала свою программу.
Только вот возникла одна проблема. Когда сервер общался с одним клиентом, другой решил тоже соединиться - и не получилось. А как решить эту проблему, я что-то не могу сообразить (а может и знаний не хватает). Поэтому и прошу: ПОМОГИТЕ, ПОЖАЙЛУСТА!


 
Digitman   (2002-07-26 10:16) [7]

Значит, что-то неверно на серверной стороне делаешь.
Приводи код, разберемся, что там за беда...


 
Leny   (2002-07-26 10:44) [8]

Вот код сервера

procedure TForm1.FormShow(Sender: TObject);
begin
ServerSocket1.Active:=True;
Label2.Caption:="Listen...";
end;

Здесь я записываю полученные данные в таблицу

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
with StringGrid1 do
begin
RowCount:=RowCount+1;
Rows[RowCount-2].Text:=Socket.ReceiveText;
Label3.Caption:=Rows[RowCount-1].Text;
end;
end;




 
Digitman   (2002-07-26 11:03) [9]

1.Не вижу здесь ничего несуразного. Все более-менее прилично на вид (не считая явных ошибок в обработке принятых данных, но это к изначально поднятой тобой проблеме не относится).

А где же обработка OnClientConnect()/OnClientDisconnect() ?
Или она вообще не предусмотрена у тебя никоим образом ?

2. Вот об этом

>>"другой решил тоже соединиться - и не получилось"

поподробней, пожалуйста ...
что, вот так вот прямо сервер и отвечает клиенту - извини, мол, ну не получилось у тебя ?
или таки изъясняться будем кодом да конкретными сообщениями об ошибках ?


 
Leny   (2002-07-26 11:11) [10]

Действительно обработки OnClientConnect()/OnClientDisconnect() у меня нет.
Насчет сообщения об ошибке. Оно вот: Asynchronous socket error 10061.
Клиент соединяется так: ClientSocket1.Active:=True;


 
Digitman   (2002-07-26 11:30) [11]

Эта ошибка возникает как минимум в двух случаях :

1. сервер, к которому ты пытаешься осуществить коннект неактивен либо не существует;

2. сервер активен, но явно отверг запрос на соединение

Второй случай исключен - TServerSocket не поддерживает режим условного акцепта, даже если работает под W2k/XP

Значит - скорее всего, первый случай. Ищи фрагменты кода сервера, где его св-во Active по каким-то причинам переходит из состояния True в состояние False. Либо в момент обработки OnClientRead() первого клиента либо непосредственно сразу за его завершением.




 
Leny   (2002-07-26 11:44) [12]

В программе для сервера свойству Active я нигде не присваивала False. Есть еще какие-либо причины, из-за которых Active переходит из состояния True в состояние False?
Обработку OnClientRead я привела полностью, мне кажется там все нормально.


 
Digitman   (2002-07-26 11:57) [13]

Да, в принципе могут и быть. Если возникающие исключения не позволяют серверу продолжать работу в режиме "Listen".

А это что, весь код серверной стороны ? Больше ничего нет относящегося к серверу ?


Приводи тогда код клиента


 
Leny   (2002-07-26 12:09) [14]

Привожу код Сервера

procedure TForm1.Button1Click(Sender: TObject);
begin
ServerSocket1.Active:=True;
Label2.Caption:="Listen...";
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Label2.Caption:="соединение установлено";
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
with StringGrid1 do
begin
RowCount:=RowCount+1;
Rows[RowCount-2].Text:=Socket.ReceiveText;
Label3.Caption:=Rows[RowCount-1].Text;
end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
ServerSocket1.Active:=True;
Label2.Caption:="Listen...";
end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Label2.Caption:="Listen...";
ServerSocket1.Active:=True;
end;

И код Клиента:

procedure TClientFormTable.Button1Click(Sender: TObject);
var i,k,p:byte;
begin
if ClientSocket1.Active then
ClientSocket1.Socket.SendText(StringGrid1.Rows[1].Text);
end;

procedure TClientFormTable.ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
Label8.Caption:="Сервер Обнаружен";
end;

procedure TClientFormTable.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Label8.Caption:="Соединение установлено";
end;

procedure TClientFormTable.Button2Click(Sender: TObject);
begin
ClientSocket1.Active:=True;
end;

procedure TClientFormTable.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
ClientSocket1.Active:=False;
end;


 
Digitman   (2002-07-26 12:33) [15]

1. Вот это вот :

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Label2.Caption:="Listen...";
ServerSocket1.Active:=True;
end;

Хоть и нет здесь явно ничего страшного, но все же - изложи ход своих рассуждений , что и зачем ты тут делаешь


2. Приведи последовательность своих действий на клиенте, попытка коннекта которого приводит к отказу : какие кнопки, в каком порядке, с какими задержками жмешь, состояние выводимого тобой протокола (порядок возникающих у клиента событий)


 
Leny   (2002-07-26 12:43) [16]

1. Добавила ServerSocket1.Active:=True; чтобы Сервер оставался активным, когда клиент отсоединяется - это лишь для перестраховки по поводу Active=False
2. 1)Нажатие Button2 -
procedure TClientFormTable.Button2Click(Sender: TObject);
begin
ClientSocket1.Active:=True;
end;
2)procedure TClientFormTable.ClientSocket1Connecting(Sender: TObject;Socket: TCustomWinSocket);
begin
Label8.Caption:="Сервер Обнаружен";
end;
3) Далее появляется сообщение: Asynchronous socket error 10061.




 
Digitman   (2002-07-26 13:11) [17]

1. "для перестраховки" - это совершенно лишнее : не должен сервер деактивироваться при дисконнекте клиента. Но, уж коль ты засомневалась, следовало бы просто перед "перестраховкой" выяснить состояние св-ва Active

2. Видишь ли, событие OnConnecting() вовсе не говорит о том, что "Сервер Обнаружен" - это совершенно не соответствует действительности. Обнаружение сервера, находящемся в Listen-режиме и успешный коннект к нему - это единое событие. И оно фиксируется фактом возникновения OnConnect(). А коль ты не получаешь OnConnect(), это и говорит о том, что сервер почему-то перешел в off-line ...


Ну хорошо, убери "перестраховку" и попробуй сделать несколько последовательных connect/disconnect одного и того же клиента. Фиксируй логи обеих сторон. Каков результат ?


 
Leny   (2002-07-26 13:28) [18]

Спасибо большое за помощь!
Я убрала эту строку - подключение проходит успешно(Только я активизировала все ч/з нажитие Button). Раньше Active:=True было в FormCreate - могло ли быть в этом дело?
У меня возник еще один маленький вопрос:
Если с двух компьютеров одновременно отправляют SendText - сервер их примет как 2 или один поток?


 
Digitman   (2002-07-26 14:05) [19]

1. Могло, разумеется) ...

2. Два отдельных потока, принятых через 2 отдельных гнезда


 
cyborg   (2002-07-26 23:18) [20]

Я извиняюсь, но по моему

procedure TForm1. FormShow(Sender: TObject);
begin
ServerSocket1.Active:=True;
Label2.Caption:="Listen...";
end;

не нужно так! Либо в OnCreate либо ручное включение.


 
Leny   (2002-07-30 09:03) [21]

>cyborg
А почему нельзя в FormShow?


 
Polevi   (2002-07-30 09:46) [22]

2Leny ©
Плохой стиль - причем тут Show ???



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

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

Наверх





Память: 0.5 MB
Время: 0.008 c
1-98144
qube
2002-09-17 10:10
2002.09.30
Документ/представление


3-98006
Леван
2002-09-07 10:07
2002.09.30
Kак сделать Continue после Locate?


14-98274
PUNKER
2002-07-30 23:34
2002.09.30
Помогите с DELPHI !!!!!!!!!!!!


14-98337
?
2002-09-05 22:35
2002.09.30
?


1-98195
raiv
2002-09-18 11:45
2002.09.30
TChart





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский