| « Поставить закладку » « Сделать стартовой » | |||
|
|||
|
Пишем программу для пересылки файлов через сокеты
Начинающие программисты (и я сам, когда начинал учить Delphi), задаются вопросом: как же передать файл через сокеты, если кроме этого файла через сокет передаётся ещё куча информации !? Вроде бы проблема не такая уж и сложная, но всё же не из лёгких... После долгих поисков в интернете, я так и не нашёл ни одной полезной статьи по этой теме. Вот я и решил исправить этот недостаток, и в этой статье я постараюсь помочь решить эту проблему... Напишем программу, которая сможет передавать файлы через сокеты (клиент и сервер), и кроме этого другие команды, например какое-нибудь сообщение ! Клиент будет принимать файлы или команды, а сервер - отсылать. Если же клиент будет всё подряд записывать в буфер, то кроме файла, в нём будут и команды, а нам нужно сделать так, чтоб файлы и команды не в коем случае не сливались ! Ещё нужно учитывать, что если файл большой, то при пересылке, он разрежется на несколько пакетов, то есть файл перешлётся не в одном пакете, а в нескольких, и событие OnClientRead будет вызываться несколько раз... В этом и заключается основная проблема передачи ! Чтоб можно было отделить команды от файла, сначала пошлём клиенту примерно
такую строку: "file#file.txt#16", то есть: команда + разделитель + имя файла +
разделитель + размер файла. И так приступим к написанию кода:
Разместите
на форму следующие компоненты: TServerSocket, TButton, TEdit, TProgressBar и
TStatiusBar. Расположите их как показанно на рисунке. Сначала добавим буфер для файла в глобальные переменные:
Теперь сделаем, чтоб при создании формы, открывался сокет:
При завершении приложения, нужно не забыть закрыть сокет:
При нажатии на кнопку посылаем файл:
На событие OnClientRead, компонента TServerSocket, впишите следующий код:
Это нужно для того, чтоб сервер убил буфер, только после того, как клиент примет файл. Если убить буфер, сразу после передачи файла, то клиент не успеет принять весь файл ! Как только клиент примет файл, он пошлёт серверу команду "end", что значит файл принят, и сервер убьёт буфер. Теперь сделаем чтоб наш сервер выводил немного информации о соединении:
А на событие OnClientDisconnect впишите:
Вот сервер и готов ! Теперь перейдём к клиенту (он принимает файл) с пим возни будет побольше:
Разместите
на форуму компоненты: TClientSocket, две метки TLabel, TProgressBar и TStatusBar. Объявляем переменные и оду процедуру. Запишите переменные именно в private, иначе ничего не будет работать:
На событие создания формы, мы соединяемся с сервером и ждём передачи файла:
При завершении приложения, закрываем сокет:
Так-же как и у сервера, сделаем чтоб клиент выдавал информацию о соединении:
Теперь нам нужно вписать код в процедуру Writing. Эта процедура нужна для того, чтоб принятые данные записывать в файл. Код процедуры:
Теперь на событие OnClientRead компонента TClientSocket, впишите следующий код:
Таким образом, если файл большой, и событие OnClientRead будет вызываться ни один раз, а несколько, то если клиент в режиме приёма файла, он будет записывать данные в буфер, если же нет, то клиент определит принятую команду, и если это файл, то перейдёт в режим приёма файла. Если вы чего-то не поняли, то прочитайте код программы, я там не зря всё раскоментировал :-) Ну вот и всё... Удачи в программировании ! Рубрика: Интернет и Сети
Вышел MySQL 5.1.30, первый стабильный рели....
После публикации 29 тестовых версий анонсирован первый стабильный релиз MySQL 5.1, пригодный для промышленной эксплуатации и обеспечивающий увеличение производительности для "тяжелых" SQL запросов, по сравнению с MySQL 5.0, примерно на 15-20%. Главные новшества появившиеся в MySQL 5.1:
Подробнее... |
Рубрика: MySQL
| Добавлено: 28.11.2008
Тестирование параллельных программ.
Тестирование параллельного программного обеспечения представляет собой более сложную задачу по сравнению с тестированием последовательной программы. Программист должен знать о подводных камнях при тестировании параллельного кода, имеющихся методологиях и инструментарии.
Подробнее... |
Рубрика: Тестирование
| Добавлено: 28.11.2008
Архитектура AMD64 (EM64T).
Аннотация. В статье кратко рассматривается архитектура AMD64 компании AMD и ее реализация EM64T компании Intel. Описаны особенности архитектуры, ее возможности, достоинства и недостатки.
Подробнее... |
Рубрика: Архитектура AMD
| Добавлено: 27.11.2008
Остальные статьи: |
Цитата дня (все,добавить):
|
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|