Форум: "Сети";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.012 c