Сетевое приложение

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Сетевое приложение

Сообщение badaninslava » 30.01.2009 15:07:43

Я не программист, но в образовательном процессе встают задачи, которые желательно решать...
В общем задача в следующем: есть 11 компьютеров в локальной сетке, их них один компьютер преподавателя. Известны все айпишники, маска подсети. Всё задаётся статически. Предполагаю следующее: программа на учительском компьютере отсылает на все компьютеры учащихся или слайд (файл), который будет отображаться, или имя файла (картинки), который будет отображать программа. После теоретической части программа учителя рассылает команду на компьютеры учеников о начале теста. После прохождения теста программы учащихся отсылаю программе учителя результат.
Проблема у меня только с тем как организовать передачу команд между программами по локальной сети. Если есть простейший пример "общения" программ по сети, буду признателен. Возможно вопрос банальный, заранее прошу прощения.

PS: пытался пользоваться готовыми программами типа iTALC - при количестве включенных компьютеров выше пяти - имеют место "тормоза" и толковой презентации не получается.
badaninslava
постоялец
 
Сообщения: 101
Зарегистрирован: 12.12.2005 01:21:44

Re: Сетевое приложение

Сообщение EmeraldMan » 30.01.2009 20:06:27

Примера на руках нет...
А вообще для работы с сетью надо ставить компоненты INDY.
Вкладки Indy Clients - Core и Indy Servers - Core
Компонеты IdTCPClient и IdTCPServer
Думаю для данной задачи вполне подойдет.
Аватара пользователя
EmeraldMan
постоялец
 
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород

Re: Сетевое приложение

Сообщение Logo » 30.01.2009 20:18:51

По моему это можно решить ВЕБ технологиями.
На учительской машине ставим веб сервер, создаем соответствующий локальный сайт, а ученики через браузер заходят на сайт, выбирают вариант, тест или еще что и прочитав условия, заполняют форму. Заполненная форма отправляется на сервер и обрабатывается. Тесты или задания готовятся предварительно и размещаются на сервере.

Если организовывать интерактивную работу учитель-ученик, чтобы в реальном времени видеть, что делает ученик, то это не так просто, но можно задействовать сервера и клиенты из набора компонент Indy.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Сетевое приложение

Сообщение badaninslava » 30.01.2009 21:49:10

А есть (понятный не знатоку английского языка) пример работы с компонентами Indy? Может быть простейший пример работы программы с IdTCPClient и IdTCPServer в среде Лазарус...
Что касается сервера - не уверен, что учительский компьютер (128 Мб оперативки, да и процессор не акти) его потянет... Но работать надо... Стремиться применять информационные технологии в учебном процессе.
badaninslava
постоялец
 
Сообщения: 101
Зарегистрирован: 12.12.2005 01:21:44

Re: Сетевое приложение

Сообщение Sawer » 31.01.2009 11:52:49

Indy:
http://www.indyproject.org/Sockets/fpc/index.en.aspx
http://www.indyproject.org/Sockets/fpc/index.en.html
Книги: Indy In Depth.pdf или Глубины Indy.pdf, если в инете не найдеш пиши в личку, отошлю (тут объем вложений не более 256Кб).
Примеры: в припленных файлах для Delphi 7.

Synapse:
http://www.ararat.cz/synapse/doku.php/public:howto
Примеры (что есть под рукой):
SSH-слиент:
Код: Выделить всё
unit UMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, blcksock, ssl_cryptlib, StdCtrls, UTcpClt;

type
  TForm1 = class(TForm)
    mmo1: TMemo;
    btn1: TButton;
    btn2: TButton;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Sock: TTCPBlockSocket;
  TcpIn: string;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
begin
  Sock := TTCPBlockSocket.Create;
  Sock.ConvertLineEnd := True;
  Sock.SSL.SSLType := LT_SSHv2;
  Sock.SSL.Username := 'root';
  Sock.SSL.Password := '111';
  Sock.Connect('192.168.0.221','22');
  Sock.SSL.SSHChannelType := '';
  Sock.SSL.SSHChannelArg1 := '';
  Sock.SSL.SSHChannelArg2 := '';
  Sock.SSLDoConnect;
  Sleep(500);
  Sock.SendString('ifconfig'+CRLF);
  repeat
    TcpIn := Sock.RecvString(2000);
    if TcpIn <> '' then
    begin
      mmo1.Lines.Add(TcpIn);
    end;
  until TcpIn = '# ';
end;

procedure TForm1.btn2Click(Sender: TObject);
begin
  TcpClt.Create;
end;

end.


TCP-сервер
Код: Выделить всё
unit UTcpSrv;

interface

uses
  Classes, SysUtils, StrUtils, blcksock, synsock;

type
  TcpSrv = class(TThread)
  private
    FTcpSrv: TTCPBlockSocket;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Execute; override;
  end;

  TcpSrvThrd = class(TThread)
  private
    FTcpSrv: TTCPBlockSocket;
    CSock: TSocket;
    FTcpIn, FTcpOut, FMess, FDevIp: string;
    FDevId: Integer;
    FTcpRecvLst, FTcpSendLst: TStringList;
  public
    constructor Create (HSock:TSocket);
    procedure SyncMode(Mode: string);
    procedure UpdateWhm;
    procedure GetDevId;
    procedure LogAdd;
    procedure Execute; override;
  end;

implementation

uses ULog, UMain;

constructor TcpSrv.Create;
begin
  inherited create(false);
  FTcpSrv := TTCPBlockSocket.create;
  FreeOnTerminate := True;
end;

destructor TcpSrv.Destroy;
begin
  FTcpSrv.Free;
end;

procedure TcpSrv.Execute;
var
  ClientSock: TSocket;
begin
  with FTcpSrv do
    begin
      CreateSocket;
      SetLinger(True,10);
      Bind('0.0.0.0','12000');
      Listen;
      repeat
        if Terminated then Break;
        if CanRead(1000) then
          begin
            ClientSock := Accept;
            if LastError = 0 then TcpSrvThrd.Create(ClientSock);
          end;
      until False;
    end;
end;

constructor TcpSrvThrd.Create(HSock: TSocket);
begin
  inherited create(false);
  CSock := HSock;
  FreeOnTerminate := True;
  FTcpRecvLst := TStringList.Create;
  FTcpSendLst := TStringList.Create;
  FDevId := 0;
  FDevIp := '';
end;

procedure TcpSrvThrd.GetDevId;
var i: Integer;
begin
  for i := 1 to DevsLst.Count do
    if FDevIp = Dev[i].Ip then FDevId := i;
end;

procedure TcpSrvThrd.SyncMode(Mode: string);
begin
  case AnsiIndexText(Mode,['whm','gpio','xt1']) of
    0: Synchronize(UpdateWhm);
  end;
end;

procedure TcpSrvThrd.UpdateWhm;
begin
  Dev[FDevId].WhmData.Assign(FTcpRecvLst);
  frMain.UpdateWhm(FDevId);
end;

procedure TcpSrvThrd.LogAdd;
begin
  frLog.mmoLog.Lines.Add(DateTimeToStr(Date+Time)+' '+FMess);
  frLog.mmoLog.Lines.SaveToFile('main.log');
end;

procedure TcpSrvThrd.Execute;
var i: Integer;
begin
  FTcpSrv := TTCPBlockSocket.Create;
  FTcpSrv.ConvertLineEnd := True;
  //------------------------------------------------
  try
    FTcpSrv.Socket := CSock;
    FTcpSrv.GetSins;
    FDevIp := FTcpSrv.GetRemoteSinIP; Synchronize(GetDevId);
    FMess := 'Подключение с '+FDevIp; Synchronize(LogAdd);
    //------------------------------------------------
    with FTcpSrv do
    begin
      SendString('READY'+CRLF);
      SendString('M230N'+CRLF);
      repeat
        FTcpIn := RecvString(60000);
        FTcpRecvLst.Add(FTcpIn);
        FMess := 'Получено: '+FTcpIn; Synchronize(LogAdd);
        //------------------------------------------------
        if FTcpIn = 'write' then
        begin
        repeat
          FTcpIn := RecvString(60000);
          if FTcpIn <> '' then
          begin
            FTcpRecvLst.Add(FTcpIn);
            FMess := 'Получено: '+FTcpIn; Synchronize(LogAdd);
          end;
        until (FTcpIn = 'OK') or (FTcpIn = 'ERROR');
        //------------------------------------------------
        FMess := 'Обновление: '+FTcpRecvLst.Strings[0]; Synchronize(LogAdd);
        SyncMode(FTcpRecvLst.Strings[0]);
        FTcpRecvLst.Clear;
        end;
      until FTcpIn = 'EXIT';
    end;
  finally
    FTcpSrv.CloseSocket;
    FTcpSrv.Free;
  end;
end;

end.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Sawer
новенький
 
Сообщения: 69
Зарегистрирован: 15.05.2007 22:53:48

Re: Сетевое приложение

Сообщение shade » 31.01.2009 12:43:29

badaninslava писал(а):Что касается сервера - не уверен, что учительский компьютер (128 Мб оперативки, да и процессор не акти) его потянет... Но работать надо... Стремиться применять информационные технологии в учебном процессе.

Для веб-сервера это более чем достаточно. Первый сервер клуба Шаманград работал на сервере с 64 Мб оперативной памяти, правда не долго, после чего одна из планок сгорела и он работал на 32 Мб :wink:
Чего было вполне достаточно для небольшого сайта.
Да и в вашей задаче сервер скорее всего тормозит не от большой нагрузки, а от не эффективной реализации или от слабой сети и/или от использования не сжатых форматов данных (например, картинок, видео).

Да, я тоже думаю что это проще решается веб-технологиями (если ими владеешь) или "гибридом" - WEB+GUI, как у нас на Шаманграде. Сейчас в основном веб-интерфейс, но постепенно развивается API для подключения GUI-программ.

Идея проста:
1. на сервере крутиться веб-сервер (например Apache + PHP), на котором реализован XML-RPC сервер.
2. API описывается XML файлами, например http://svn.shamangrad.net/pms/branches/ ... c/user.xml
3. XML-файлы описаний обрабатываются XSLT и получается документации (вам может и не нужна) и модули для доступа к API
http://svn.shamangrad.net/pms/branches/ ... index.html
http://svn.shamangrad.net/pms/branches/ ... anager.pas
4. Простеший пример использования:
Код: Выделить всё
program demo;

{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
{$ASSERTIONS ON}

uses SysUtils, Classes,
  wsrpcbase (* базовые определения *),
  wsxmlrpc (* шлюз XML-RPC (транспортный уровень) *),
  UserManager (* API управления пользователями *);

var
  user: TUserManager;
  gate: TWSXMLRPCGate;

var
  UserInfo: TUserInfo;

begin
  gate := TWSXMLRPCGate.Create('http://shamangrad.net/rpc.php');
  gate.AuthType := atBasic;
  gate.authorize('login', 'password');
  user := TUserManager.Create(gate);
  try
    UserInfo := user.UserByLogin('alex');
    writeln('id: ', UserInfo.id);
    writeln('login: ', UserInfo.login);
    writeln('avatar: ', UserInfo.avatar_url);
    writeln;
  except
    on E: Exception do
    begin
      writeln;
      writeln(E.ClassName, ': ', E.Message);
    end;
  end;
  user.Free;
end.


Но для всего этого надо иметь хотя бы небольшой опыт веб-программирования.

XML-RPC работает в режиме запрос-ответ, т.е. все действия по инциативе клиента (у вас наоборот описано по инициативе сервера, но имхо, это не так важно - клиент может по таймеру опрашивать сервер на предмет новых команд: показать слайд, начать тест и т.п.). При этом соединение устанавливается только на время выполния запросов и сервер может обслуживать "одновременно" даже тысячи пользователей (за счёт того, что они как правило работают не совсем одновременно). Но 10-20 клиентов это не так уж и много, чтобы сервер с 128 Мб оперативной памяти тормозил от действительно одновременных соединений.

PS:
Как всегда есть два пути, либо увеличивать ресурсы, либо влючать моск и оптимизировать

Добавлено спустя 17 минут 41 секунду:
badaninslava писал(а):Я не программист, но в образовательном процессе встают задачи, которые желательно решать...

Гы, на главную фразу не обратил внимания.. А оно вам нужно втягиваться в область, в которой вы не разбираетесь?..

Без обид, но может лучше найти студента/школьника который уже имеет хотя бы небольшой опыт программирования?.. Вы опишите задачу, предоставите материалы (тестовые слайды и задания). Он там подумает, скажет что он реально может сделать, что не потянет, уточните задачу и пусть делает.
Студент к примеру может сделать такую систему в рамках курсовой или дипломной работы или на производственной практике (если конечно выбранный студент не бездарь и работа организованна правильно - кроме студента желательно опытный руководитель/наставник, который сможет что-то подсказать, направить дело в нужное русло).

Если такой подход к проблеме интересен, но есть проблема с талантливыми студентами, могу подсказать пару своих знакомых, может возьмуться. А если ещё небольшой грант под это дело выбить и заплатить студенту за его работу, то тогда вообще все будут счастливы.
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 19

Рейтинг@Mail.ru