string irServiceName;
int buffersize;
В конструкторе формы надо создать экземпляр класса IrDAClient
, задать имена файлов для приема и отправки сообщения, указать имя службы, установить размер буфера для передаваемого файла и также временно сделать недоступными кнопки для отправки и посылки сообщения. Соответствующий код приведен в листинге 12.3.
Листинг 12.3
public Form1() {
InitializeComponent();
irClient = new IrDAClient();
// Файлы, предназначенные для отправки и приема
fileSend = ".\\My Documents\\send.txt";
fileReceive = ".\\My Documents\\receive.txt";
// Задаем имя для службы IrDA
// Это может быть любое слово
// Другие устройства для примера должны использовать это же
// слово
irServiceName = "IrDAFtp";
// Устанавливаем максимальный размер буфера для передаваемого
// файла
buffersize = 256;
// Делаем недоступными кнопки отправки и посылки сообщений
// до тех пор, пока не будут обнаружены устройства
butSend.Enabled = false;
butReceive.Enabled = false;
}
Теперь надо написать код для кнопки butFindDevs
, предназначенной для обнаружения устройств. При тестировании примера необходимо направить инфракрасные порты устройств друг на друга. Код, ответственный за выполнение этой задачи, приведен в листинге 12.4.
Листинг 12.4
private void butFindDevs_Click(object sender, EventArgs e) {
// Ищем доступные устройства с инфракрасной связью
// и помещаем их в список
// Поиск не более трех доступных устройств
irDevices = irClient.DiscoverDevices(2);
// Если устройства не найдены, то выводим сообщение
if (irDevices.Length == 0) {
MessageBox.Show("Устройства с ИК-портами не обнаружены!");
return;
}
// Перечисляем массив IrDADeviceInfo
// и выводим информацию о каждом устройстве в список
string device;
int ID;
listBox1.Items.Clear();
foreach (IrDADeviceInfo irDevice in irDevices) {
ID = BitConverter.ToInt32(irDevice.DeviceID, 0);
device =
ID.ToString() + " " + irDevice.DeviceName + " " + irDevice.CharacterSet +
" " + irDevice.Hints;
listBox1.Items.Add(device);
}
listBox1.SelectedIndex = 0;
if (irDevices.Length > 0)
statusBar1.Text = irDevices.Length.ToString() + " устройств(а)";
// Делаем доступными кнопки для отправки и посылки сообщения
butSend.Enabled = true;
butReceive.Enabled = true;
}
Код для отправки и посылки файлов приведен в листинге 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;
Читать дальше