Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Потоки


Страницы:   1 2

Leny ©   (2002-07-26 08:27:00) 

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


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

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


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

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


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

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

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

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


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

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

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


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

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


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

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

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


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


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

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 12:33:00) [8]

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

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

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


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


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

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

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 11:57:00) [10]

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

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


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


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

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


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

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

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

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

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

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



Leny   (2002-07-26 11:11:00) [13]

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


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

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

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

2. Вот об этом

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

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


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

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

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 10:16:00) [16]

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


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

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


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

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

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


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

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

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


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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо