Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.28;
Скачать: CL | DM;

Вниз

Tserversocket не принимает коннект и сообщения   Найти похожие ветки 

 
OFP   (2006-01-31 22:14) [0]

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

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

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

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;

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

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


 
OFP   (2006-02-01 01:06) [1]

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


 
Digitman ©   (2006-02-01 08:34) [2]


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


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

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



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

Текущий архив: 2006.05.28;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.05 c
15-1146656687
Иван Шихалев
2006-05-03 15:44
2006.05.28
Есть практикующие электронщики?


3-1144592150
DevilDevil
2006-04-09 18:15
2006.05.28
Как корректно сохранить/изменить таблицу


2-1147368301
Vitalik__
2006-05-11 21:25
2006.05.28
string


2-1147171048
Finger
2006-05-09 14:37
2006.05.28
Завершение процесса


15-1146112390
Карелин Артем
2006-04-27 08:33
2006.05.28
Нужны программисты в Самаре на полный день.