![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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
и сразу нормальный конект