Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

c++, Matlab

.pdf
Скачиваний:
98
Добавлен:
30.03.2015
Размер:
1 Mб
Скачать

Рис. 8.3

5.На ПК1 задать свойству Caption компонента Button1 значение «ЗАПУСК СЕРВЕРА», задать свойству Caption компонента Button2 значение «ПЕРЕДАТЬ ТЕКСТ», задать свойству Caption компонента Button3 значение «ПЕРЕДАТЬ ФАЙЛ».

6.На ПК1 задать свойству Text компонента Edit1 значение IP-адреса ПК1 (например, 192.168.1.101). IP-адрес компьютера можно узнать открыв окно сетевых подключений операционной системы Windows 7/XP.

7.На ПК1 задать свойству Text компонента Edit2 значение номера порта (например, 1001).

8.На ПК1 разместить на форме один компонент ServerSocket. Далее бу-

дем использовать для этого компонента имя ServerSocket1 (примерный вид окна после выполнения пп. 5–8 показан на рис. 8.4).

9. На ПК1 задать свойству ServerType компонента ServerSocket1 зна-

чение stNonBlocking.

10. На ПК1 в обработчике события OnClick компонента Button1 разместить следующий программный код:

ServerSocket1>Port=StrToInt(Edit2>Text);

//Запуск сервера

ServerSocket1>Active = true; ServerSocket1>Open(); Memo1>Lines>Add("Создан сервер.");

71

Рис. 8.4

11. На ПК1 в обработчике события OnAccept компонента ServerSocket1 разместить следующий программный код:

Memo1>Lines>Add("К Вам подключились.");

12. На ПК1 в обработчике события OnClientError компонента Server Socket1 разместить следующий программный код:

ErrorCode = 0;

ShowMessage("Client Error");

13. На ПК1 в обработчике события OnClick компонента Button2 разместить следующий программный код:

ServerSocket1>Socket>Connections[0]>SendText(Edit3>Text); Memo1>Lines>Add("Отправлен текст: " + Edit3>Text);

14. На ПК1 в обработчике события OnClientRead компонента Server Socket1 разместить следующий программный код:

AnsiString Rtext ; // текст, который посылает клиент

Rtext=ServerSocket1>Socket>Connections[0]>ReceiveText(); Memo1>Lines>Add("Принят текст: " + Rtext);

15. На ПК2 задать свойству Caption компонента Button1 значение «ПОДКЛЮЧИТЬСЯ К СЕРВЕРУ», задать свойству Caption компонента Button2

72

значение «ПЕРЕДАТЬ ТЕКСТ», задать свойству Caption компонента Button3 значение «ПЕРЕДАТЬ ФАЙЛ».

16.На ПК2 задать свойству Text компонента Edit1 значение IP-адреса ПК1 (т. е. значение IP-адреса сервера, к которому клиент должен подключиться,

например 192.168.1.101).

17.На ПК2 задать свойству Text компонента Edit2 значение номера порта (номер порта должен быть тот же, что и у сервера, например 1001).

18.На ПК2 разместить на форме один компонент ClientSocket. Далее будем использовать для этого компонента имя ClientSocket1 (примерный вид окна после выполнения пп. 12–15 показан на рис. 8.5).

Рис. 8.5

19. На ПК2 задать свойству ClientType компонента ClientSocket1 зна-

чение ctNonBlocking.

20. На ПК2 в обработчике события OnClick компонента Button1 разместить следующий программный код:

Memo1>Lines>Add("Подключение к указанному серверу..."); ClientSocket1>Address=Edit1>Text; ClientSocket1>Port=StrToInt(Edit2>Text);

//подключаемся к серверу

ClientSocket1>Open() ;

73

21. На ПК2 в обработчике события OnConnect компонента ClientSocket1 разместить следующий программный код:

Memo1>Lines>Add("Произведено подключение к серверу.");

22. На ПК2 в обработчике события OnError компонента ClientSocket1 разместить следующий программный код:

ErrorCode=0;

ShowMessage("Client Error");

23. На ПК2 в обработчике события OnClick компонента Button2 разместить следующий программный код:

Form1>ClientSocket1>Socket>SendText(Edit3>Text); Memo1>Lines>Add("Отправлена строка: " + Edit3>Text);

24. На ПК2 в обработчике события OnRead компонента ClientSocket1 разместить следующий программный код:

AnsiString Rtext; // текст, который посылает сервер

Rtext = ClientSocket1>Socket>ReceiveText(); Memo1>Lines>Add("Принят текст :" + Rtext);

Указания п. 25 выполнить на каждом из ПК, входящих в состав рабочего места.

25. Откомпилировать и выполнить разработанное ПО. Проект считать успешно откомпилированным при отсутствии сообщений об ошибках в процессе компиляции. Примерный вид экранных форм приложений на ПК1 и ПК2 показан на рис. 8.6 и 8.7 соответственно.

Рис. 8.6

74

Рис. 8.7

26.На ПК1 в окне экранной формы нажать кнопку «ЗАПУСК СЕРВЕРА».

Втекстовом поле Memo1 экранной формы должен появиться текст «Создан сервер».

27.На ПК2 в окне экранной формы нажать кнопку «ПОДКЛЮЧИТЬСЯ К СЕРВЕРУ». В текстовом поле Memo1 экранной формы должен появиться текст «Произведено подключение к серверу».

28.На ПК1 в окне экранной формы в текстовом поле Edit3 написать любой текст и нажать кнопку «ПЕРЕДАТЬ ТЕКСТ». Убедиться, что напечатанный текст совпадает с текстом, принятым ПК2.

29.На ПК2 в окне экранной формы в текстовом поле Edit3 написать любой текст и нажать кнопку «ПЕРЕДАТЬ ТЕКСТ». Убедиться, что напечатанный текст совпадает с текстом, принятым ПК1.

30.На ПК1 и ПК2 закрыть экранные формы.

31.На ПК1 и ПК2 в файле реализации формы разместить следующий программный код (в начале файла, вне программных блоков):

//создаем поток под принимаемый файл

TMemoryStream *MS = new TMemoryStream ;

//функция записи получаемой информации в поток void Write_1(AnsiString Text);

//размер принимаемого файла int Size_1=0;

//передаем ли мы на данный момент файл bool Receive;

75

32. На ПК1 в обработчике события OnClick компонента Button3 разместить следующий программный код:

void *P;

//

указатель на файл

int Size_2=0;

//

размер передаваемого файла

if(OpenDialog1>Execute())

{

// выбираем файл

MS>LoadFromFile(OpenDialog1>FileName); Memo1>Lines>Add("Файл загружен в поток...");

}

//отправляем заголовок

ServerSocket1>Socket>Connections[0]>SendText("file#" + OpenDialog1>FileName + "#" + IntToStr(MS>Size) + "#");

Memo1>Lines>Add ("Отправлен заголовок");

MS>Position=0;

// Устанавливаем поток в начальную позицию

P=MS>Memory;

// присваиваем указателю поток файла

//отправляем буфер клиенту; Size_2=ServerSocket1>Socket>Connections[0] ->SendBuf(P, MS>Size);

Memo1>Lines>Add("Отправлено: " + IntToStr(Size_2) + " из " + IntToStr(MS>Size));

33. На ПК1 в файле реализации формы (после имеющегося кода) разместить следующий программный код:

void TForm1::Write_1(AnsiString Text)

{

 

if(MS>Size < Size_1)

// если идет прием

{

 

MS>Write(Text.c_str(), Text.Length());

Form1>Memo1>Lines>Add("Принимаем данные...");

}

 

if(MS>Size==Size_1)

// если файл принят

{

// останавливаем режим передачи

Receive=false;

MS>Position=0;

 

Form1>ServerSocket1>Socket>Connections[0] ->SendText("end");

Form1>Memo1>Lines>Add("Файл принят!"); if(Form1>SaveDialog1>Execute())

{

76

MS>SaveToFile(Form1>SaveDialog1>FileName);

Form1>Memo1>Lines>Add("Файл сохранен...");

}

 

MS>Clear();

// освобождаем поток

Size_1 = 0;

 

}

 

}

34. На ПК1 в заголовочном файле формы в разделе public разместить заголовок функции из п. 33:

void TForm1::Write_1(AnsiString Text);

35. На ПК1 в обработчике события OnClientRead компонента Server Socket1 удалить или отметить как комментарий написанный ранее программный код и разместить следующий программный код:

AnsiString Rtext;

// текст, который посылает клиент

Rtext = ServerSocket1>Socket>Connections[0]

>ReceiveText();

 

if(Receive==true)

// если мы в режиме передачи файла, то

{

// записываем его в поток

Write_1(Rtext);

}

// если нет , то

else

{

//пишем все, что принимаем

Memo1>Lines>Add("Приняли текст :" + Rtext); if(Rtext.SubString(0, Rtext.Pos("#")1)=="file")

//Если это строка типа

//file#filename#filesize#, то

{

//удаляем слово "file" Rtext.Delete(1, Rtext.Pos("#"));

//удаляем имя файла

Rtext.Delete(1, Rtext.Pos("#"));

//Определяем размер файла

Size_1 = StrToInt(Rtext.SubString(0,Rtext.Pos("#")1));

//Удаляем последний разделитель

Rtext.Delete(1, Rtext.Pos("#"));

//Выводим размер файла

Memo1>Lines>Add("Размер файла: " + IntToStr(Size_1) + " байт");

//устанавливаем режим приёма файла

Receive = true;

}

}

77

36. На ПК2 в обработчике события OnClick компонента Button3 разместить следующий программный код:

void *P;

//

указатель на файл

int Size_2=0;

//

размер передаваемого файла

if(OpenDialog1>Execute())

{

//выбираем файл

MS>LoadFromFile(OpenDialog1>FileName);

Memo1>Lines>Add("Файл загружен в поток...");

}

Form1>ClientSocket1>Socket

>SendText("file#" + OpenDialog1>FileName + "#" + IntToStr( MS>Size ) + "#");

//отправляем заголовок

Memo1>Lines>Add("Отправлен заголовок");

MS>Position=0;

//

Устанавливаем поток в начальную позицию

P=MS>Memory;

//

присваиваем указателю поток файла

//отправляем буфер клиенту; Size_2=Form1>ClientSocket1>Socket>SendBuf(P, MS>Size); Memo1>Lines>Add("Отправлено: " + IntToStr(Size_2) +

" из " + IntToStr(MS>Size));

37. На ПК2 в файле реализации формы (после имеющегося кода) разместить следующий программный код:

void TForm1::Write_1(AnsiString Text)

{

 

if(MS>Size < Size_1)

// если идет прием

{

MS>Write(Text.c_str(), Text.Length()); Form1>Memo1>Lines>Add("Принимаем данные...");

}

 

if(MS>Size==Size_1)

// если файл принят

{

// останавливаем режим передачи

Receive=false;

MS>Position=0;

 

Form1>ClientSocket1>Socket>SendText("end"); Form1>Memo1>Lines>Add("Файл принят!"); if(Form1>SaveDialog1>Execute())

{

78

MS>SaveToFile(Form1>SaveDialog1>FileName);

Form1>Memo1>Lines>Add("Файл сохранен...");

}

 

MS>Clear();

// освобождаем поток

Size_1 = 0;

 

}

 

}

38. На ПК2 в заголовочном файле формы в разделе public разместить заголовок функции из п. 37:

void TForm1::Write_1(AnsiString Text);

39. На ПК2 в обработчике события OnRead компонента ClientSocket1 удалить или отметить как комментарий написанный ранее программный код и разместить следующий программный код:

AnsiString Rtext;

// текст, который посылает сервер

Rtext = ClientSocket1>Socket>ReceiveText();

if(Receive==true)

// если мы в режиме передачи файла, то

{

// записываем его в поток

Write_1(Rtext);

}

// если нет , то

else

{

//пишем все, что принимаем

Memo1>Lines>Add("Приняли текст :" + Rtext); if(Rtext.SubString(0, Rtext.Pos("#")1) == "file" )

//Если это строка типа

//file#filename#filesize#, то

{

//удаляем слово "file"; Rtext.Delete(1, Rtext.Pos("#"));

//Удаляем имя файла; Rtext.Delete(1, Rtext.Pos("#"));

//Определяем размер файла

Size_1=StrToInt(Rtext.SubString(0,Rtext.Pos("#")1));

//Удаляем последний разделитель

Rtext.Delete(1, Rtext.Pos("#"));

//Выводим размер файла

Memo1>Lines>Add("Размер файла: " + IntToStr( Size_1 ) + " байт");

//Устанавливаем режим приёма файла

Receive = true;

}

}

79

Указания п. 40 выполнить на каждом из ПК, входящих в состав рабочего места.

40.Откомпилировать и выполнить разработанное ПО.

41.На ПК1 в окне экранной формы нажать кнопку «ЗАПУСК СЕРВЕРА».

Втекстовом поле Memo1 экранной формы должен появиться текст «Создан сервер».

42.На ПК2 в окне экранной формы нажать кнопку «ПОДКЛЮЧИТЬСЯ

К СЕРВЕРУ». В текстовом поле Memo1 экранной формы должен появиться текст «Произведено подключение к серверу».

43. На ПК1 в окне экранной формы нажать кнопку «ПЕРЕДАТЬ ФАЙЛ». Это приведет к появлению окна на рис. 8.8. Выбрать файл, имеющий наименование Transmit_file.txt, и нажать кнопку «Открыть».

Рис. 8.8

44. На ПК2 сохранить принятый файл на жестком диске под именем

Recieved_file.txt.

45.На ПК1 открыть файл Transmit_file.txt с помощью текстового редактора «Блокнот». На ПК2 открыть файл Recieved_file.txt с помощью текстового редактора «Блокнот».

46.Сравнить тексты открытых файлов. Текст в файле Transmit_file.txt должен совпадать с текстом в файле Recieved_file.txt.

47.Повторить действия пп. 43–46, используя ПК1 вместо ПК2 (ПК2 вместо ПК1).

80

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]