Я не программист, но в образовательном процессе встают задачи, которые желательно решать...
В общем задача в следующем: есть 11 компьютеров в локальной сетке, их них один компьютер преподавателя. Известны все айпишники, маска подсети. Всё задаётся статически. Предполагаю следующее: программа на учительском компьютере отсылает на все компьютеры учащихся или слайд (файл), который будет отображаться, или имя файла (картинки), который будет отображать программа. После теоретической части программа учителя рассылает команду на компьютеры учеников о начале теста. После прохождения теста программы учащихся отсылаю программе учителя результат.
Проблема у меня только с тем как организовать передачу команд между программами по локальной сети. Если есть простейший пример "общения" программ по сети, буду признателен. Возможно вопрос банальный, заранее прошу прощения.
PS: пытался пользоваться готовыми программами типа iTALC - при количестве включенных компьютеров выше пяти - имеют место "тормоза" и толковой презентации не получается.
Сетевое приложение
Модератор: Модераторы
-
badaninslava
- постоялец
- Сообщения: 101
- Зарегистрирован: 12.12.2005 00:21:44
- EmeraldMan
- постоялец
- Сообщения: 149
- Зарегистрирован: 16.10.2008 08:41:51
- Откуда: Белгород
- Контактная информация:
Примера на руках нет...
А вообще для работы с сетью надо ставить компоненты INDY.
Вкладки Indy Clients - Core и Indy Servers - Core
Компонеты IdTCPClient и IdTCPServer
Думаю для данной задачи вполне подойдет.
А вообще для работы с сетью надо ставить компоненты INDY.
Вкладки Indy Clients - Core и Indy Servers - Core
Компонеты IdTCPClient и IdTCPServer
Думаю для данной задачи вполне подойдет.
По моему это можно решить ВЕБ технологиями.
На учительской машине ставим веб сервер, создаем соответствующий локальный сайт, а ученики через браузер заходят на сайт, выбирают вариант, тест или еще что и прочитав условия, заполняют форму. Заполненная форма отправляется на сервер и обрабатывается. Тесты или задания готовятся предварительно и размещаются на сервере.
Если организовывать интерактивную работу учитель-ученик, чтобы в реальном времени видеть, что делает ученик, то это не так просто, но можно задействовать сервера и клиенты из набора компонент Indy.
На учительской машине ставим веб сервер, создаем соответствующий локальный сайт, а ученики через браузер заходят на сайт, выбирают вариант, тест или еще что и прочитав условия, заполняют форму. Заполненная форма отправляется на сервер и обрабатывается. Тесты или задания готовятся предварительно и размещаются на сервере.
Если организовывать интерактивную работу учитель-ученик, чтобы в реальном времени видеть, что делает ученик, то это не так просто, но можно задействовать сервера и клиенты из набора компонент Indy.
-
badaninslava
- постоялец
- Сообщения: 101
- Зарегистрирован: 12.12.2005 00:21:44
А есть (понятный не знатоку английского языка) пример работы с компонентами Indy? Может быть простейший пример работы программы с IdTCPClient и IdTCPServer в среде Лазарус...
Что касается сервера - не уверен, что учительский компьютер (128 Мб оперативки, да и процессор не акти) его потянет... Но работать надо... Стремиться применять информационные технологии в учебном процессе.
Что касается сервера - не уверен, что учительский компьютер (128 Мб оперативки, да и процессор не акти) его потянет... Но работать надо... Стремиться применять информационные технологии в учебном процессе.
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-слиент:
TCP-сервер
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.У вас нет необходимых прав для просмотра вложений в этом сообщении.
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
badaninslava писал(а):Что касается сервера - не уверен, что учительский компьютер (128 Мб оперативки, да и процессор не акти) его потянет... Но работать надо... Стремиться применять информационные технологии в учебном процессе.
Для веб-сервера это более чем достаточно. Первый сервер клуба Шаманград работал на сервере с 64 Мб оперативной памяти, правда не долго, после чего одна из планок сгорела и он работал на 32 Мб
Чего было вполне достаточно для небольшого сайта.
Да и в вашей задаче сервер скорее всего тормозит не от большой нагрузки, а от не эффективной реализации или от слабой сети и/или от использования не сжатых форматов данных (например, картинок, видео).
Да, я тоже думаю что это проще решается веб-технологиями (если ими владеешь) или "гибридом" - 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 писал(а):Я не программист, но в образовательном процессе встают задачи, которые желательно решать...
Гы, на главную фразу не обратил внимания.. А оно вам нужно втягиваться в область, в которой вы не разбираетесь?..
Без обид, но может лучше найти студента/школьника который уже имеет хотя бы небольшой опыт программирования?.. Вы опишите задачу, предоставите материалы (тестовые слайды и задания). Он там подумает, скажет что он реально может сделать, что не потянет, уточните задачу и пусть делает.
Студент к примеру может сделать такую систему в рамках курсовой или дипломной работы или на производственной практике (если конечно выбранный студент не бездарь и работа организованна правильно - кроме студента желательно опытный руководитель/наставник, который сможет что-то подсказать, направить дело в нужное русло).
Если такой подход к проблеме интересен, но есть проблема с талантливыми студентами, могу подсказать пару своих знакомых, может возьмуться. А если ещё небольшой грант под это дело выбить и заплатить студенту за его работу, то тогда вообще все будут счастливы.
