Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Приложение типа Клиент-Сервер

14K
08 июля 2006 года
xBLADE
13 / / 08.07.2006
Здравствуйте. Я пишу программу типа Клиент-Сервер. Пользователь запускает сервер, после чего другой пользоватеь на другом компе запускает клиент, соеденяется с сервером, и отдает ему команды. Сервер обрабатывает команды, и высылает клиенту ответ. Пишу на основе компанентов TServerSocket и TClientSocket. Но неполучается самое главное - когда клиент отдает команду серверу, сервер просто зависает =((
Подскажите ПЛИЗ что делать? Я облазил весь инет, но ниче дельного не нашел =((
Вот код...

Сервер:

Код:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls, ExtCtrls, registry;

type
  TfrmMain = class(TForm)
    Server: TServerSocket;
    procedure ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;
  registry: TRegistry;
  i: string;

implementation

{$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);
begin
Server.Open; //Запускаем сервер
end;

procedure TfrmMain.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
i := socket.ReceiveText;

// if i='<имя команды>' then
// <Действие команды>;
end;

end.


Клиент:

Код:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls, Buttons, ComCtrls;

type
  TfrmMain = class(TForm)
    Client: TClientSocket;
    edIP: TEdit;
    Label1: TLabel;
    btConnect: TBitBtn;
    Label2: TLabel;
    edCommand: TEdit;
    btCommand: TBitBtn;
    btDisconnect: TBitBtn;
    btExit: TBitBtn;
    stBar: TStatusBar;
    procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure btCommandClick(Sender: TObject);
    procedure btDisconnectClick(Sender: TObject);
    procedure btConnectClick(Sender: TObject);
    procedure btExitClick(Sender: TObject);
    procedure ClientConnecting(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientError(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;
  i: string;

implementation

{$R *.dfm}

procedure TfrmMain.ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
stBar.SimpleText := 'Подключение произошло успешно'
end;

procedure TfrmMain.ClientError(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
stBar.SimpleText := 'Произошла ошибка'
end;

procedure TfrmMain.ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
stBar.SimpleText := 'Клиент отключен'
end;

procedure TfrmMain.ClientConnecting(Sender: TObject; Socket: TCustomWinSocket);
begin
stBar.SimpleText := 'Идет подключение...'
end;

procedure TfrmMain.btExitClick(Sender: TObject);
begin
frmMain.Close
end;

procedure TfrmMain.btConnectClick(Sender: TObject);
begin
Client.Address:=(edIP.text); //Передаем клиенту IP адрес
Client.Open //Активация клиента
end;

procedure TfrmMain.btDisconnectClick(Sender: TObject);
begin
Client.Close
end;

procedure TfrmMain.btCommandClick(Sender: TObject);
begin
Client.Socket.SendText(edCommand.text);
stBar.SimpleText:='Данные отправлены';
end;

procedure TfrmMain.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
i:=Socket.ReceiveText;
stBar.SimpleText:=i;
end;

end.


Может у меня гдето ту ошибка?
Очень прошу - помогите :(

Зарание благодарен
8.4K
08 июля 2006 года
ratttx
64 / / 06.06.2006
Хм.... На каком языке делалось???
Я на 5-й дельфе этим занимался.
А вот твои комманды, что то не совсем подходят.... :-/
На 5-й дельфе у сервера есть н-ное количество сокетов.....

procedure TfrmMain.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
i := socket[Номер сокета:integer начало с 0].ReceiveText;

// if i='<имя команды>' then
// <Действие команды>;
end;

Я долго мучался, пока такая ошибка не доперла.....
339
10 июля 2006 года
verybadbug
619 / / 12.09.2005
>...Пишу на основе компанентов TServerSocket и TClientSocket...

Бедняга.... мой тебе совет - используй Indy (TIdTCPClient, TIdTCPServer)
339
10 июля 2006 года
verybadbug
619 / / 12.09.2005
незнаю... где у тя там ошибка.... мож порт используется другой прогой....


этот код работает (на форме ServerSocket, ClientSocket, Memo и три кнопки - соед. сервера, соед. клиента и отправка... порт 3003, хост 127.0.0.1).....
Код:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  if Socket.ReceiveText = 'command1' then begin
  end else if Socket.ReceiveText = 'command2' then begin
  end else MessageBox(Handle, 'Неизвестная команда', 'Ошибка', MB_ICONERROR);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText(Memo1.Text);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ServerSocket1.Open;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  ClientSocket1.Open;
end;
16K
12 июля 2006 года
medved_68
36 / / 06.07.2006
Цитата:
procedure TfrmMain.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
i := socket.ReceiveText;



Здесь ошибка:
Необходимо:

Цитата:
i := socket.connection[k].ReceiveText;


где к-номер соединения.
Если клиентов несколько и они все подключены то необходимо:

Цитата:
procedure TfrmMain.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
k:integer;
begin
for k:=0 to ServerSocket1.Sockets.ActiveConnections do
begin
if ServerSocket1.Sockets.Connections[k].ReciveLength>0 then
i:=ServerSocket1.Sockets.Connections[k].ReciveText;
//Принимаем текст от конкретного клиента
end;

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог