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

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

Tserversocket не принимает коннект и сообщения


OFP ©   (2006-01-31 22:14:00) 

Доброго всем дня....

Делаю простую программу клиент - сервер для своих целей ...

И у меня возникли ряд вопросов и проблем.
По порядку:

1. На сервере.

Разместил serv : TServerSocket
- установил ему порт 45500
- serv.active:=true; ( запустил сервер )

Теперь когда, я соединяюсь с клиента, то у меня срабатывае на сервере следующие обработчики событий по порядку:

GetSocket --> Accept ---> GetThread ---> ThreadStart и все ...

Обработчик события - ClientConnect у меня не срабатывает...

соотвественно сервер, не видит когда клиент отсоединяется ...

если я с клиента посылаю любое текствое сообщение короткое, то сервер просто виснет....
если я с сервера, пытаюсь отправить сообщение к клиенту, который вроде соединился то он пишет, что все удачно, но ни чего не происходит.... вот ....

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

{РАБОТАЕТ}
procedure TFormMain.FormShow(Sender: TObject);
begin
ServerSocket.Port:=50;
ServerSocket.Active:=true;
ServerSocket.Open;
end;

{РАБОТАЕТ}
procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if ServerSocket.Active then Server.Free;
end;

{РАБОТАЕТ}
procedure TFormMain.ServerSocketAccept(Sender: TObject;
Socket: TCustomWinSocket);
begin

MemoStatusServer.Lines.Add(TimeToStr(Now)+' - Клиент принят: '+Socket.RemoteAddress+
' handle: '+IntToStr(ServerSocket.Socket.SocketHandle));

end;

{ ТУТ НЕ РАБОТАЕТ }
procedure TFormMain.ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
MemoStatusServer.Lines.Add(TimeToStr(Now)+' -Клиент присоединился ('+Socket.RemoteAddress+')');

end;

{ ТУТ НЕ РАБОТАЕТ }
procedure TFormMain.ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
MemoStatusServer.Lines.Add(TimeToStr(Now)+' - Клиент отсоединился ('+Socket.RemoteAddress+')');

end;

{??????}
procedure TFormMain.ServerSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
MemoStatusServer.Lines.Add(TimeToStr(Now)+' - Ошибка ('+Socket.RemoteAddress+')'+' - code error:'+IntToStr(ErrorCode));
end;

{ ТУТ НЕ РАБОТАЕТ }
procedure TFormMain.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
MessageText : string;
begin
MessageText := Socket.ReceiveText;
MemoStatusServer.Lines.Add(TimeToStr(Now)+' - Сообщение от клиента- ('+
Socket.RemoteAddress+'): '+ MessageText);
end;

{ отправка сообщение клиентам - НЕ РАБОТАЕТ }
procedure TFormMain.ButtonSendMessageClick(Sender: TObject);
var
i: Integer;
begin
if ServerSocket.Socket.ActiveConnections = 0 then
MemoStatusServer.Lines.Add(TimeToStr(Now)+' - Нет соединений.');

for i := 0 to ServerSocket.Socket.ActiveConnections-1 do
begin
ServerSocket.Socket.Connections[i].SendText(EditTextMessage.Text);
MemoStatusServer.Lines.Add(TimeToStr(Now)+' - Êëèåíòó '+ServerSocket.Socket.Connections[i].RemoteAddress+' ñîîáùåíèå ïîñëàííî.');
end;
end;

{РАБОТАЕТ}
procedure TFormMain.ServerSocketGetSocket(Sender: TObject; Socket: Integer;
var ClientSocket: TServerClientWinSocket);
begin

MemoStatusServer.Lines.Add(TimeToStr(Now)+' - Получить сокет, IDSocket: '+IntToStr(Socket));
end;

{РАБОТАЕТ}
procedure TFormMain.ServerSocketGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
MemoStatusServer.Lines.Add(TimeToStr(Now)+' - Получить поток.');
end;

{РАБОТАЕТ}
procedure TFormMain.ServerSocketThreadEnd(Sender: TObject;
Thread: TServerClientThread);
begin
MemoStatusServer.Lines.Add(TimeToStr(Now)+' - Закрыть поток.');
end;

{РАБОТАЕТ}
procedure TFormMain.ServerSocketThreadStart(Sender: TObject;
Thread: TServerClientThread);
begin
MemoStatusServer.Lines.Add(TimeToStr(Now)+' - Запустить поток.');
end;

{РАБОТАЕТ}
procedure TFormMain.ServerSocketListen(Sender: TObject;
Socket: TCustomWinSocket);
begin
MemoStatusServer.Lines.Add(TimeToStr(Now)+' - Слушаем потрт: '+IntToStr(ServerSocket.Port));
end;

Подскажите, где что надо исправить или дописать чтоб сервер, начал нормально работать....

Заранее большое спасибо !


Digitman   (2006-02-01 08:34:00) [1]


> нужно поставить - stNonBlocking
> и сразу нормальный конект


Он, коннект, и в случае stThreadBlocking тоже "нормальный".
Но при stThreadBlocking обработчики транспортных событий сервера вызываются в контекстах доп.потоков, а обращение к потоконебезопасным VCL-контролам (в дан.случае - MemoStatusServer) в доп.потоках недопустимо.

Замени обращение к MemoStatusServer на потокобезопасную ф-цию MessageBox() и убедись в том что всетранспортные события возбуждаются сервером в должном порядке.


OFP   (2006-02-01 01:06:00) [2]

прикол... ни когда бы не подумал..., но проблема решилась,
в что в ServerType (сервера и клиента) нужно поставить - stNonBlocking
и сразу нормальный конект


Наверх

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