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