Книга: Программирование КПК и смартфонов на .NET Compact Framework

Передача данных

Передача данных

Код для отправки и посылки файлов приведен в листинге 12.5.

Листинг 12.5

private void butSend_Click(object sender, EventArgs e) {
 // Открываем файл для отправки и получаем его поток
 Stream fileStream;
 try {
  fileStream = new FileStream(fileSend, FileMode.Open);
 } catch (Exception exFile) {
  MessageBox.Show("Не могу открыть " + exFile.ToString());
  return;
 }
 // Создаем IrDA-клиент с установленным именем службы.
 // которое должно совпадать с именем службы на другом
 // IrDA-клиенте
 try {
  irClient = new IrDAClient(irServiceName);
 } catch (SocketException exS) {
  MessageBox.Show("Ошибка сокета: " + exS.Message +
   " - Вы щелкнули на кнопке Получить на другом устройстве?");
  return;
 }
 // Получим поток
 Stream baseStream = irClient.GetStream();
 // Получим размер отправляемого файла
 // и запишем это значение в поток
 byte[] length = BitConverter.GetBytes((int)fileStream.Length);
 baseStream.Write(length, 0, length.Length);
 // Создаем буфер для чтения файла
 byte[] buffer = new byte[buffersize];
 // Показываем число отправленных байт
 int fileLength = (int)fileStream.Length;
 statusBar1.Text = "Отправлено " + fileLength + " байт";
 // Читаем файловый поток в базовом потоке
 while (fileLength > 0) {
  int numRead = fileStream.Read(buffer, 0, buffer.Length);
  baseStream.Write(buffer, 0, numRead);
  fileLength -= numRead;
 }
 fileStream.Close();
 baseStream.Close();
 irClient.Close();
 statusBar1.Text = "Файл отправлен";
}
private void butReceive_Click(object sender, EventArgs e) {
 // Создаем поток для записи файла
 Stream writeStream;
 try {
  writeStream = new FileStream(fileReceive, FileMode.OpenOrCreate);
 } catch (Exception) {
  MessageBox.Show("Не могу открыть "+ fileReceive + " для записи");
  return;
 }
 // Создаем соединение с помощью класса IrDAEndPoint
 // для выбранного устройства из списка
 // Начинаем прослушку входящих сообщений
 // из устройства с объектом IrDAListener
 try {
  int i = listBox1.SelectedIndex;
  irEndP = new IrDAEndPoint(irDevices[i].DeviceID, irServiceName);
  irListen = new IrDAListener(irEndP);
  irListen.Start();
 } catch (SocketException exSoc) {
  MessageBox.Show("Не могу прослушивать на службе " + irServiceName + ": " +
   exSoc.ErrorCode);
 }
 // Показываем прослушивание выбранного устройства
 statusBar1.Text = "Прослушка " + listBox1.SelectedItem.ToString();
 // Создаем соединение
 // для службы, обнаруженной прослушкой
 IrDAClient irClient;
 try {
  irClient = irListen.AcceptIrDAClient();
 } catch (SocketException exp) {
  MessageBox.Show("Не могу принять сокет "+ exp.ErrorCode);
  return;
 }
 // Показываем, идет ли передача файла
 if (irListen.Pending() == true)
  statusBar1.Text = "Передача из " + irClient.RemoteMachineName;
 else
  statusBar1.Text = "Нет передачи из " + irClient.RemoteMachineName;
 // Получим поток из клиента
 Stream baseStream = irClient.GetStream();
 int numToRead;
 // Создаем буфер для чтения файла
 byte[] buffer = new byte[buffersize];
 // Читаем поток данных, который содержит
 // данные из передающего устройства
 numToRead = 4;
 while (numToRead > 0) {
  int numRead = baseStream.Read(buffer, 0, numToRead);
  numToRead -= numRead;
 }
 // Получим размер буфера для показа
 // числа байт для записи в файл
 numToRead = BitConverter.ToInt32(buffer, 0);
 statusBar1.Text = "Записываем "+ numToRead + " байт";
 // Записываем поток в файл до тех пор,
 // пока не будут прочитаны все байты
 while (numToRead > 0) {
  int numRead = baseStream.Read(buffer, 0, buffer.Length);
  numToRead -= numRead;
  writeStream.Write(buffer, 0, numRead);
 }
 // Сообщаем, что файл получен
 statusBar1.Text = "Файл получен";
 baseStream.Close();
 writeStream.Close();
 irListen.Stop();
 irClient.Close();
}

Итак, можно запустить приложение на двух устройствах и попробовать отправить и принять файл. Перед тестированием программы нужно создать текстовый документ send.txt с любым содержанием. Затем нужно повернуть друг к другу инфракрасные датчики двух устройств и на первом устройстве нажать кнопку Искать. Если поиск завершился успешно, то в списке отобразится имя второго устройства.

Затем на втором устройстве надо нажать кнопку Принять, а на первом устройстве нажать кнопку Отправить. В результате ваших действий текст сообщения из файла send.txt должен быть передан на другое устройство и сохранен в файле receive.txt.

К сожалению, данный пример нельзя тестировать на эмуляторе. Для проведения эксперимента вам необходимо иметь два настоящих устройства. Так как у меня нет второго КПК, я решил воспользоваться в качестве второго устройства своим смартфоном под управлением Windows Mobile 2005. Поскольку графический интерфейс программ для смартфонов не поддерживает кнопки, мне пришлось добавить в решение новый проект IrDA_Smartphone_CS и частично переписать код программы.

Вместо кнопок использовалось меню, а вместо элемента управления ListBox — элемент ComboBox. Но можно было обойтись и без создания текстовых файлов, а просто считывать данные из потока. В этом случае наша программа приобрела бы черты чата. Также можно написать какую-нибудь игру, в которой участвуют два игрока. С помощью инфракрасной связи вы можете передавать информацию, например, о сделанном ходе в шахматах.

Оглавление книги


Генерация: 0.033. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз