다음을 통해 공유


방법: 적외선 파일 전송

업데이트: 2007년 11월

.NET Compact Framework에서는 장치 간 적외선 통신을 위한 클래스를 제공합니다. 이 예제에서는 적외선 통신을 사용하는 장치 간에 파일을 보내고 받는 방법을 보여 줍니다. 각각 파일을 보내고 받을 수 있도록 두 개의 Pocket PC가 있어야 합니다.

이 예제에서는 IrDAClient의 인스턴스를 만들고 해당 인스턴스의 DiscoverDevices 메서드를 사용하여 유효 범위 내에서 적외선 장치를 검색합니다. 이 메서드는 각 장치에 대한 정보를 제공하는 IrDADeviceInfo 개체 배열을 반환합니다.

이 예제에서는 파일을 보내고 받기 위한 코드를 제공하며, Send 및 Receive 단추를 사용하여 이를 설명합니다. 최소한 장치 하나에서 사용할 Send 응용 프로그램 하나와 다른 장치에서 사용할 Receive 응용 프로그램 하나를 만들어야 합니다.

Send 단추는 파일을 보내는 요청을 수신 대기하고 있는 장치로만 파일을 보냅니다. 따라서 보내는 장치에서 Send 단추를 누르기 전에 받는 장치에서 Receive 단추를 눌러야 합니다. 다음 작업이 수행됩니다.

  • 보낼 파일 스트림을 가져옵니다.

  • 이 응용 프로그램에 대해 확인된 서비스 이름을 사용하여 IrDAClient 인스턴스를 만듭니다. 적외선 연결은 서비스 이름을 지정하여 만들어집니다. 연결에 참여하는 장치에서 서로 같은 서비스 이름을 사용하기만 하면 서비스 이름에 아무 값이나 사용할 수 있습니다. 이 예제에서는 서비스 이름이 "IrDATest"입니다.

  • 파일을 보내는 IrDAClient 스트림으로 파일 스트림을 읽어 옵니다.

Receive 단추는 보내는 장치의 IrDAClient 인스턴스와 서비스 이름이 같은 장치를 수신 대기하는 IrDAListener 인스턴스를 만듭니다.

다음 작업이 수행됩니다.

  • 전송된 내용을 내 문서 폴더의 받는 파일에 쓰기 위한 스트림을 만듭니다.

  • 보내는 장치의 장치 ID와 서비스 이름을 사용하여 IrDAEndPoint 인스턴스를 만듭니다.

  • IrDAEndPoint 인스턴스로부터 IrDAListener 인스턴스를 만들고 수신 서비스를 시작합니다.

  • AcceptIrDAClient 메서드를 사용하여 IrDAListener 인스턴스로부터 IrDAClient 인스턴스를 만듭니다.

  • 전송된 파일의 데이터를 포함하고 있는 IrDAClient 인스턴스의 내부 스트림을 읽습니다.

  • 데이터 스트림을 Receive.txt 파일의 스트림에 씁니다.

응용 프로그램을 만들려면

  1. 보내는 장치용 Pocket PC 응용 프로그램을 만들고 폼에 단추를 추가합니다. 단추 이름을 Send로 지정합니다.

  2. 내 문서 폴더에 Send.txt라는 파일을 만듭니다.

  3. Send 단추의 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();
    }
    
    
  4. 받는 장치용 Pocket PC 응용 프로그램을 만들고 폼에 단추를 추가합니다. 단추 이름을 Receive로 지정합니다.

  5. Receive 단추의 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();
    }
    

응용 프로그램을 실행하려면

  1. 응용 프로그램을 장치에 배포하고 시작합니다.

  2. 장치의 적외선 포트를 정렬합니다.

  3. 받는 장치에서 Receive 단추를 누릅니다.

  4. 보내는 장치에서 Send 단추를 누릅니다.

  5. 내 문서 폴더에 Receive.txt가 만들어졌는지 확인합니다.

코드 컴파일

이 예제에는 다음과 같은 네임스페이스에 대한 참조가 필요합니다.

참고 항목

개념

적외선 연결

.NET Compact Framework 방법 항목