отчет ВМ2
.doc
Министерство образования и науки Российской Федерации
Федеральное бюджетное образовательное учреждение высшего профессионального образования
«Ярославский государственный технический университет»
Кафедра «Кибернетика»
Отчет защищен
с оценкой
Преподаватель
( ) А. П. Харитонов
РАЗРАБОТКА ПРОТОКОЛА СЕАНСОВОГО УРОВНЯ ДЛЯ РЕШЕНИЯ ПРИКЛАДНОЙ
ЗАДАЧИ
Отчет о лабораторной работе
по курсу “Вычислительные машины, системы и сети”
ЯГТУ 220301.65 ЛР
Отчет выполнил
студент гр. МА-33
( ) Баталин А.В.
2012
Цели работы:
изучение на основе протоколов TCP/IP принципов сетевого взаимодействия,
знакомство с компонентами Delphi, предназначенными для поддержки сети, и работа с некоторыми из них,
разработка простейших сетевых программ.
Задание:
Разработать программу для игры по сети в крестики-нолики (ХО) поле 3х3. Для организации взаимодействия программ использовать протокол UDP (порт 1024). Программу разработать с использованием Delphi.
При разработке программы выделим три этапа:
1. программа для обмена сообщениями между компьютерами по IP-адресам,
2. программа для установления, поддержания и завершения диалога между двумя компьютерами в полудуплексном режиме,
3. программа для игры в ХО.
Этап 1. Программа должна давать пользователю возможность выбрать IP-адрес (из имеющихся) и послать по этому адресу текстовое сообщение, а также должна принимать сообщения от других компьютеров и отображать их с указанием IP-адреса отправителя.
Этап 2. Программа должна функционировать следующим образом.
1. Пользователь вводит имя и выбирает, будет он играть крестиками (ходит первым) или ноликами (ходит вторым).
2. Если пользователь выбрал «Играю Х».
2.1. Программа посылает по всем известным ей IP-адресам с интервалом 1 секунда команду: $01<имя>
2.2. Анализируются все приходящие данные, ожидается команда $02<имя>
2.3. После прихода такой команды прекращается посылка команды $01<имя> и пользователю предлагается согласиться на диалог с автором принятой команды (по его имени)
2.3.1. Если пользователь согласен, то считаем, диалог установлен:
2.3.1.1. Программа дает возможность ввести и послать сообщение
2.3.1.2. Осуществляется ожидание ответа до 1 минуты. Если ответ получен , то он отображается и переход к 2.3.1.1. Если нет, то диалог прекращен, пользователю выдается соответствующее сообщение и переход к 2.1.
2.3.2. Если пользователь не согласен – то переход к 2.1.
3. Пользователь выбрал «Играю О».
3.1. Программа анализирует все приходящие данные, ожидая команды $01<имя>.
3.2. После прихода такой команды анализ входных данных прекращается и пользователю предлагается согласиться на диалог с автором принятой команды (по имени)
3.2.1. Если пользователь согласен, то
3.2.1.1. автору принятой команды посылается команда $02<имя>
3.2.1.2. осуществляется ожидание ответа до 1 минуты. Если ответ получен, то он отображается, пользователь может вводить и отсылать свое сообщение. Далее переход на 3.2.1.2. Если ответа нет, то диалог прерван (или не начинался), пользователю выдается соответствующая информация, затем – переход 3.1.
3.2.2. Если пользователь не согласен, то переход к 3.1
Этап 3. На основе первых двух этапов разработать программу с графическим интерфейсом для игры в ХО. Реализовать контроль корректности хода и автоматическое определение, и выдачу результата игры.
Описание структуры программы
Компонент Memo1 служит для отображения принятых и отсылаемых сообщений.
Компонент Memo2 – служит для ввода сообщения.
Компонент Button1 (“Играть!”) – для начала игры.
Компонент Edit1 – для ввода имени пользователя.
Компонент CheckBox1 и CheckBox2 – для переключения выбор пользователем за кого играть.
Компонент Button2 (“Прервать”) – для сброса всех параметров.
Компонент Timer1 – для посекундной отправки приглашений и контроля ожидания ответного сигнала в течение минуты.
Компонент Timer2 – для контроля времени ожидания в размере одной минуты ответа в режиме диалога.
Компонент Button3 (“Отправить”) – для отправки сообщений.
Компоненты UDPClient1 и UDPServer1 для реализации обмена сообщениями по сети.
Инструкция по работе с программой
После запуска программа ждет, когда пользователь введет свое имя в поле Edit1, выберет за кого играть и нажмет кнопку «Начать». После чего начнется либо рассылка приглашений (за крестик), либо ожидание приглашения (за нолик). После получения приглашения нолик в праве решить, хочет он играть с этим игроком (имя отображено на панели) или нет, в случае отказа он продолжает получать приглашения от игроков. В случае согласия «нолик» входит в режим диалога и ожидает ответа от «крестика». «Крестик» в свою очередь решает, хочет он играть с этим игроком или нет. В случае отказа «крестик» продолжит рассылку, а нолик будет ждать до конца минуты ожидания ответа или в праве нажать «Прекратить диалог». Если крестик соглашается на диалог, то он получает право отправить первое сообщение «нолику», после чего диалог ведется в полудуплексном режиме до тех пор пока, кто-нибудь из пользователей не нажмет «Прекратить диалог» или не будет передано ни одного сообщения в течение минуты. Общий вид программы изображен на рисунке 1.
Рис 1 - Общий вид
Исходный код
var s:string;
time:integer;
bGame :boolean = false;
pName : string;
procedure restart;
begin
form1.CheckBox1.Enabled:=true;
form1.CheckBox2.Enabled:=true;
form1.CheckBox1.Checked:=false;
form1.CheckBox2.Checked:=false;
form1.Edit1.Enabled:=true;
form1.Edit1.Clear;
bGame:=false;
form1.ProgressBar1.Visible:=false;
form1.Button1.Visible:=true;
form1.Button1.Enabled:=true;
form1.Button2.Visible:=false;
form1.button3.Visible:=false;
form1.Memo2.Visible:=false;
form1.Timer1.Enabled:=false;
form1.Timer2.Enabled:=false;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
bGame := false;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if edit1.Text='' then showmessage('Введите имя!') else
begin
if (checkbox1.Checked=false) and (checkbox2.checked=false) then showmessage('Крестик или Нолик?') else
begin
if checkbox1.checked=true then
timer1.Enabled:=true;
if checkbox2.Checked=true then
timer2.Enabled:=true;
time:=0;
idudpclient1.Host:='255.255.255.255'; idudpclient1.BroadcastEnabled:=true;
edit1.Enabled:=false;
button2.Visible:=true;
button1.Visible:=false;
checkbox1.Enabled:=false;
checkbox2.Enabled:=false;
progressbar1.Max:=60;
progressbar1.Visible:=true;
progressbar1.Position:=1;
end;
end;
end;
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var ip:string;
ButtonSelected,n:integer;
begin
n:=adata.Size;
setlength(s,n);
adata.Read(s[1],n);
ip:=abinding.PeerIP;
if(bGame) then
begin
memo1.Lines.Add(pName +': '+s);
time := 0;
Button3.Enabled:= true;
end;
if(not bGame) then
if ((timer2.enabled=true) and (s[1]=chr($01))) or ((timer1.enabled=true) and (s[1]=chr($02))) then
begin
ButtonSelected:= messagedlg('Вы хотите сыграть с '+copy(s,2,n)+' '+'Вы согласны?',mtConfirmation,[mbYes, mbNo], 0);
if (ButtonSelected=mrYes) then
begin
IdUdpClient1.BroadcastEnabled:=false;
timer1.Enabled:=false;
idudpclient1.Host:=ip;
memo2.Visible:=true;
button3.Visible:=true;
button1.Enabled:=false;
button2.Visible:=true;
timer2.Enabled:=true;
bGame := true;
pName := copy(s,2,n);
time :=0;
if(CheckBox2.Checked) then
begin
IdUdpClient1.Send(chr($02) + Edit1.Text);
end;
end;
end;
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if checkbox1.checked=true then checkbox2.Enabled:=false;
if checkbox1.checked=false then checkbox2.Enabled:=true;
end;
procedure TForm1.CheckBox2Click(Sender: TObject);
begin
if checkbox2.checked=true then checkbox1.Enabled:=false;
if checkbox2.checked=false then checkbox1.Enabled:=true;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
restart;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
time:=time+1;
progressbar1.Position:=time+2;
IdUdpClient1.Send(chr($01)+edit1.text);
if time=60 then
begin
messagebeep(0);
showmessage('Игроков не найдено :( ');
restart;
timer1.Enabled:=false;
end;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
time:=time+1;
progressbar1.Position:=time+2;
if time=60 then
begin
messagebeep(0);
showmessage('Ответ не получен');
restart;
timer2.Enabled:=false;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if(edit1.text <> '') then
begin
button3.Enabled:=false;
IdUdpClient1.Send(memo2.text);
memo1.Lines.Add(Edit1.Text+': '+ memo2.text);
memo2.Text := '';
time:=0;
end;
end; end.
Блок схемы
procedure TForm1.Button1Click
procedure TForm1.Button2Click
procedure TForm1.IdUDPServer1UDPRead
procedure TForm1.CheckBox1Click И procedure TForm1.CheckBox2Click
procedure restart
procedure TForm1.Timer1Timer
procedure TForm2.Timer1Timer
procedure TForm1.Button3Click