Главная страница
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.045 c
2-1147406779
Elen
2006-05-12 08:06
2006.05.28
Права сеанса


3-1144434747
Alex Romanskiy
2006-04-07 22:32
2006.05.28
Картинка в DBGridEh


2-1147621938
bazadaykin
2006-05-14 19:52
2006.05.28
Новый глюк?


15-1145967193
create
2006-04-25 16:13
2006.05.28
Еще один форум о и про Delphi


3-1143533737
Dyusha
2006-03-28 12:15
2006.05.28
Экспорт данных в Excel