如何:使用红外线传输文件
更新:2007 年 11 月
.NET Compact Framework 为设备之间的红外线通信提供类。此示例演示了如何使用红外线通信在设备之间发送和接收文件。您需要两台 Pocket PC,分别用于发送和接收文件。
此示例创建一个 IrDAClient 实例,并使用其 DiscoverDevices 方法来搜索范围内的红外线设备。此方法返回一个 IrDADeviceInfo 对象数组,用于提供每台设备的信息。
此示例提供了文件发送和接收代码,这些代码可以通过“发送”和“接收”按钮进行演示。您至少应为一台设备创建“发送”应用程序,为另一台设备创建“接收”应用程序。
“发送”按钮只会将文件发送到侦听文件发送请求的设备。因此,在发送设备上点击“发送”按钮之前,必须先在接收设备上点击“接收”按钮。执行以下任务:
获取要发送的文件流。
使用为此应用程序确定的服务名创建一个 IrDAClient 实例。通过指定服务名来建立红外线连接,只要参与设备引用相同的名称,则服务名可以为任何值。在此示例中,服务名为“IrDATest”。
将文件流读入发送该文件的 IrDAClient 流。
“接收”按钮将创建一个 IrDAListener 实例,以侦听服务名与发送设备中的 IrDAClient 实例相同的设备。
执行以下任务:
创建将传输内容写入“我的文档”文件夹中的接收文件的流。
使用发送设备的设备 ID 和服务名创建 IrDAEndPoint 实例。
基于 IrDAEndPoint 实例创建一个 IrDAListener 实例并启动侦听服务。
使用 AcceptIrDAClient 方法基于 IrDAListener 实例创建一个 IrDAClient 实例。
读取 IrDAClient 实例的基础流,其中包含传输文件的数据。
将该数据流写入 Receive.txt 文件的流。
创建应用程序
为发送设备创建 Pocket PC 应用程序,并向窗体添加按钮。将该按钮命名为“发送”。
在“我的文档”文件夹中创建名为 Send.txt 的文件。
在“发送”按钮的 Click 事件中添加以下代码。
' Align the infrared ports of the devices. ' Click the Receive button first, then click Send. Private Sub SendButton_Click(sender As Object, e As System.EventArgs) _ Handles SendButton.Click Dim irClient As New IrDAClient() Dim irServiceName As String = "IrDATest" Dim irDevices() As IrDADeviceInfo Dim buffersize As Integer = 256 ' Create a collection of devices to discover. irDevices = irClient.DiscoverDevices(2) ' Show the name of the first device found. If irDevices.Length = 0 Then MessageBox.Show("No remote infrared devices found.") Return End If Try Dim irEndP As New IrDAEndPoint(irDevices(0).DeviceID, _ irServiceName) Dim irListen As New IrDAListener(irEndP) irListen.Start() irClient = irListen.AcceptIrDAClient() MessageBox.Show("Connected!") Catch exSoc As SocketException MessageBox.Show("Couldn't listen on service " & irServiceName & ": " _ & exSoc.ErrorCode) End Try ' Open a file to send and get its stream. Dim fs As Stream Try fs = New FileStream(".\My Documents\send.txt", FileMode.Open) Catch exFile As Exception MessageBox.Show("Cannot open " & exFile.ToString()) Return End Try ' Get the underlying stream of the client. Dim baseStream As Stream = irClient.GetStream() ' Get the size of the file to send ' and write its size to the stream. Dim length As Byte() = BitConverter.GetBytes(fs.Length) baseStream.Write(length, 0, length.Length) ' Create a buffer for reading the file. Dim buffer(buffersize) As Byte Dim fileLength As Integer = CInt(fs.Length) Try ' Read the file stream into the base stream. While fileLength > 0 Dim numRead As Int64 = fs.Read(buffer, 0, buffer.Length) baseStream.Write(buffer, 0, numRead) fileLength -= numRead End While MessageBox.Show("File sent") Catch exSend As Exception MessageBox.Show(exSend.Message) End Try fs.Close() baseStream.Close() irClient.Close() End Sub
// Align the infrared ports of the devices. // Click the Receive button first, then click Send. private void SendButton_Click(object sender, System.EventArgs e) { IrDAClient irClient = new IrDAClient(); string irServiceName = "IrDATest"; IrDADeviceInfo[] irDevices; int buffersize = 256; // Create a collection of devices to discover. irDevices = irClient.DiscoverDevices(2); // Show the name of the first device found. if ((irDevices.Length == 0)) { MessageBox.Show("No remote infrared devices found."); return; } try { IrDAEndPoint irEndP = new IrDAEndPoint(irDevices[0].DeviceID, irServiceName); IrDAListener irListen = new IrDAListener(irEndP); irListen.Start(); irClient = irListen.AcceptIrDAClient(); MessageBox.Show("Connected!"); } catch (SocketException exSoc) { MessageBox.Show(("Couldn\'t listen on service " + (irServiceName + (": " + exSoc.ErrorCode)))); } // Open a file to send and get its stream. Stream fs; try { fs = new FileStream(".\\My Documents\\send.txt", FileMode.Open); } catch (Exception exFile) { MessageBox.Show(("Cannot open " + exFile.ToString())); return; } // Get the underlying stream of the client. Stream baseStream = irClient.GetStream(); // Get the size of the file to send // and write its size to the stream. byte[] length = BitConverter.GetBytes(fs.Length); baseStream.Write(length, 0, length.Length); // Create a buffer for reading the file. byte[] buffer = new byte[buffersize]; int fileLength = (int) fs.Length; try { // Read the file stream into the base stream. while ((fileLength > 0)) { Int64 numRead = fs.Read(buffer, 0, buffer.Length); baseStream.Write(buffer, 0, Convert.ToInt32(numRead)); fileLength = (fileLength - Convert.ToInt32(numRead)); } MessageBox.Show("File sent"); } catch (Exception exSend) { MessageBox.Show(exSend.Message); } fs.Close(); baseStream.Close(); irClient.Close(); }
为接收设备创建 Pocket PC 应用程序,并向窗体添加按钮。将该按钮命名为“接收”。
在“接收”按钮的 Click 事件中添加以下代码。
' Align the infrared ports of the devices. ' Click the Receive button first, then click Send. Private Sub ReceiveButton_Click(sender As Object, e As System.EventArgs) _ Handles ReceiveButton.Click Dim irDevices() As IrDADeviceInfo Dim irClient As New IrDAClient() Dim irServiceName As String = "IrDATest" Dim buffersize As Integer = 256 ' Create a collection for discovering up to ' three devices, although only one is needed. irDevices = irClient.DiscoverDevices(2) ' Cancel if no devices are found. If irDevices.Length = 0 Then MessageBox.Show("No remote infrared devices found.") Return End If ' Connect to the first IrDA device Dim irEndP As New IrDAEndPoint(irDevices(0).DeviceID, irServiceName) irClient.Connect(irEndP) ' Create a stream for writing a Pocket Word file. Dim writeStream As Stream Try writeStream = New FileStream(".\My Documents\receive.txt", _ FileMode.OpenOrCreate) Catch MessageBox.Show("Cannot open file for writing.") Return End Try ' Get the underlying stream of the client. Dim baseStream As Stream = irClient.GetStream() ' Create a buffer for reading the file. Dim buffer(buffersize) As Byte Dim numToRead, numRead As Int64 ' Read the file into a stream 8 bytes at a time. ' Because the stream does not support seek operations, ' its length cannot be determined. numToRead = 8 Try While numToRead > 0 numRead = baseStream.Read(buffer, 0, numToRead) numToRead -= numRead End While Catch exReadIn As Exception MessageBox.Show("Read in: " & exReadIn.Message) End Try ' Get the size of the buffer to show ' the number of bytes to write to the file. numToRead = BitConverter.ToInt64(buffer, 0) Try ' Write the stream to the file until ' there are no more bytes to read. While numToRead > 0 numRead = baseStream.Read(buffer, 0, buffer.Length) numToRead -= numRead writeStream.Write(buffer, 0, numRead) End While writeStream.Close() MessageBox.Show("File received.") Catch exWriteOut As Exception MessageBox.Show("Write out: " & exWriteOut.Message) End Try baseStream.Close() irClient.Close() End Sub
// Align the infrared ports of the devices. // Click the Receive button first, then click Send. private void ReceiveButton_Click(object sender, System.EventArgs e) { IrDADeviceInfo[] irDevices; IrDAClient irClient = new IrDAClient(); string irServiceName = "IrDATest"; int buffersize = 256; // Create a collection for discovering up to // three devices, although only one is needed. irDevices = irClient.DiscoverDevices(2); // Cancel if no devices are found. if ((irDevices.Length == 0)) { MessageBox.Show("No remote infrared devices found."); return; } // Connect to the first IrDA device IrDAEndPoint irEndP = new IrDAEndPoint(irDevices[0].DeviceID, irServiceName); irClient.Connect(irEndP); // Create a stream for writing a Pocket Word file. Stream writeStream; try { writeStream = new FileStream(".\\My Documents\\receive.txt", FileMode.OpenOrCreate); } catch (Exception Ex) { MessageBox.Show("Cannot open file for writing. " + Ex.Message); return; } // Get the underlying stream of the client. Stream baseStream = irClient.GetStream(); // Create a buffer for reading the file. byte[] buffer = new byte[buffersize]; Int64 numToRead; Int64 numRead; // Read the file into a stream 8 bytes at a time. // Because the stream does not support seek operations, its // length cannot be determined. numToRead = 8; try { while ((numToRead > 0)) { numRead = baseStream.Read(buffer, 0, Convert.ToInt32(numToRead)); numToRead = (numToRead - numRead); } } catch (Exception exReadIn) { MessageBox.Show(("Read in: " + exReadIn.Message)); } // Get the size of the buffer to show // the number of bytes to write to the file. numToRead = BitConverter.ToInt64(buffer, 0); try { // Write the stream to the file until // there are no more bytes to read. while ((numToRead > 0)) { numRead = baseStream.Read(buffer, 0, buffer.Length); numToRead = (numToRead - numRead); writeStream.Write(buffer, 0, Convert.ToInt32(numRead)); } writeStream.Close(); MessageBox.Show("File received."); } catch (Exception exWriteOut) { MessageBox.Show(("Write out: " + exWriteOut.Message)); } baseStream.Close(); irClient.Close(); }
运行应用程序
将应用程序部署到设备并启动这些应用程序。
对齐设备的红外端口。
点击接收设备上的“接收”按钮。
点击发送设备上的“发送”按钮。
检查是否已在“我的文档”文件夹中创建 Receive.txt 文件。
编译代码
此示例需要引用下面的命名空间: