'=========================================================
'Задать и загрузить файл!
'=========================================================
internal_WaitForIRFileDownload(outputStream, irdaClient, irStreamIn)
Catch 'Поглотить любые возникающие ошибки
setStatus(ReceiveStatus.Done_ErrorOccured)
End Try
'============================================= 'Освободить все ресурсы '============================================= 'Закрыть наш входной поток If Not (irStreamIn Is Nothing) Then Try irStreamIn.Close() Catch 'Поглотить любые возникающие ошибки End Try End If 'Закрытие клиента IrDA If Not (irdaClient Is Nothing) Then Try irdaClient.Close() Catch 'Поглотить любые возникающие ошибки End Try End If 'Закрыть файл, в который осуществлялась запись If Not (outputStream Is Nothing) Then Try outputStream.Close() Catch 'Поглотить любые возникающие ошибки End Try End If 'Закрыть прослушивающее устройство, если оно выполняется If Not (m_irListener Is Nothing) Then 'Установить первым, чтобы код, выполняющийся другим потоком, 'был отменен, если он установлен m_wasListenerStopped = True Try m_irListener.Stop() Catch 'Поглотить любые возникающие ошибки End Try m_irListener = Nothing End If End Sub
Private Sub internal_WaitForIRFileDownload( _ ByRef outputStream As System.IO.Stream, _ ByRef irdaClient As System.Net.Sockets.IrDAClient, _ ByRef irStreamIn As System.IO.Stream) '--------------------------------------------------------- 'Открыть входной файл для направления в него потока данных '--------------------------------------------------------- outputStream = System.IO.File.Open( _ m_fileNameForDownload, _ System.IO.FileMode.Create)
'========================================== 'ОБНОВЛЕНИЕ СОСТОЯНИЯ '========================================== setStatus(ReceiveStatus.NotDone_WaitingForSender)
'--------------------------------- 'Открыть прослушивающее устройство '--------------------------------- Try m_wasListenerStopped = False m_irListener = _ New System.Net.Sockets.IrDAListener(m_IrDAServiceName) m_irListener.Start() Catch eListener As System.Exception m_errorDuringTransfer = "Error creating listener - " + _ eListener.Message GoTo exit_sub_with_error End Try 'Проверить, не поступила ли команда отменить выполнение If (m_wasListenerStopped = True) Then GoTo exit_sub_with_abort End If
'------------------ 'Принять соединение '------------------ Try '-------------------------------------------------------------------- 'Выполнение будет приостановлено здесь до тех пор, пока устройство не 'начнет передавать информацию, или не будет остановлен объект 'прослушивания, выполняющийся в другом потоке) '-------------------------------------------------------------------- irdaClient = m_irListener.AcceptIrDAClient() Catch eClientAccept As System.Exception 'Если прослушивание остановлено другим потоком, инициировавшим отмену 'выполнения, будет сгенерировано исключение и управление будет 'передано сюда. If (m_wasListenerStopped = True) Then GoTo exit_sub_with_abort End If
'Если прослушивание не было прекращено, 'то произошло иное исключение. Обработать его. m_errorDuringTransfer = "Error accepting connection - " + _ eClientAccept.Message GoTo exit_sub_with_error End Try
'В этом месте возможны два состояния: '#1: Мы получили соединение от передающего устройства IR '#2: IR-запрос был отменен (кто-то вызвал функцию STOP) ' (в этом случае приведенный ниже код сгенерирует исключение) 'Проверить, не было ли отменено выполнение If (m_wasListenerStopped = True) Then GoTo exit_sub_with_abort End If
'========================================== 'ОБНОВЛЕНИЕ СОСТОЯНИЯ '========================================== setStatus(ReceiveStatus.NotDone_Receiving)
'------------------------- 'Открыть принимающий поток '------------------------- Try irStreamIn = irdaClient.GetStream() Catch exGetInputStream As System.Exception m_errorDuringTransfer = "Error getting input stream - " + _ exGetInputStream.Message GoTo exit_sub_with_error End Try
'Приготовиться к получению данных! Const BUFFER_SIZE As Integer = 1024 Dim inBuffer() As Byte ReDim inBuffer(BUFFER_SIZE) Dim bytesRead As Integer
Do 'Считать байты из порта IR bytesRead = irStreamIn.Read(inBuffer, 0, BUFFER_SIZE) 'Записать байты в наш выходной поток If (bytesRead > 0) Then outputStream.Write(inBuffer, 0, bytesRead) End If Loop While (bytesRead > 0)
outputStream.Flush() 'Закончить запись любых выходных данных
'========================================== 'ОБНОВЛЕНИЕ СОСТОЯНИЯ: УСПЕШНО ВЫПОЛНЕНО '========================================== setStatus(ReceiveStatus.Done_Success) Return 'No errors
'========================================== 'ОШИБКА. '========================================== exit_sub_with_abort: 'ОБНОВЛЕНИЕ СОСТОЯНИЯ: Отменено (но не из-за ошибки) setStatus(ReceiveStatus.Done_Aborted) Return
exit_sub_with_error: 'ОБНОВЛЕНИЕ СОСТОЯНИЯ: ОШИБКА!!!! setStatus(ReceiveStatus.Done_ErrorOccured) End Sub End Class
'Если файл, который мы хотим записать, уже существует, удалить его If (System.IO.File.Exists(filenameWhereTo) = True) Then System.IO.File.Delete(filenameWhereTo) End If Try 'Создать Web-запрос
'============================================= 'Освободить все ресурсы '============================================= 'Закрыть наш входной поток If Not (irStreamIn Is Nothing) Then Try irStreamIn.Close() Catch 'Поглотить любые возникающие ошибки End Try End If 'Закрытие клиента IrDA If Not (irdaClient Is Nothing) Then Try irdaClient.Close() Catch 'Поглотить любые возникающие ошибки End Try End If 'Закрыть файл, в который осуществлялась запись If Not (outputStream Is Nothing) Then Try outputStream.Close() Catch 'Поглотить любые возникающие ошибки End Try End If 'Закрыть прослушивающее устройство, если оно выполняется If Not (m_irListener Is Nothing) Then 'Установить первым, чтобы код, выполняющийся другим потоком, 'был отменен, если он установлен m_wasListenerStopped = True Try m_irListener.Stop() Catch 'Поглотить любые возникающие ошибки End Try m_irListener = Nothing End If End Sub
Private Sub internal_WaitForIRFileDownload( _ ByRef outputStream As System.IO.Stream, _ ByRef irdaClient As System.Net.Sockets.IrDAClient, _ ByRef irStreamIn As System.IO.Stream) '--------------------------------------------------------- 'Открыть входной файл для направления в него потока данных '--------------------------------------------------------- outputStream = System.IO.File.Open( _ m_fileNameForDownload, _ System.IO.FileMode.Create)
'========================================== 'ОБНОВЛЕНИЕ СОСТОЯНИЯ '========================================== setStatus(ReceiveStatus.NotDone_WaitingForSender)
'--------------------------------- 'Открыть прослушивающее устройство '--------------------------------- Try m_wasListenerStopped = False m_irListener = _ New System.Net.Sockets.IrDAListener(m_IrDAServiceName) m_irListener.Start() Catch eListener As System.Exception m_errorDuringTransfer = "Error creating listener - " + _ eListener.Message GoTo exit_sub_with_error End Try 'Проверить, не поступила ли команда отменить выполнение If (m_wasListenerStopped = True) Then GoTo exit_sub_with_abort End If
'------------------ 'Принять соединение '------------------ Try '-------------------------------------------------------------------- 'Выполнение будет приостановлено здесь до тех пор, пока устройство не 'начнет передавать информацию, или не будет остановлен объект 'прослушивания, выполняющийся в другом потоке) '-------------------------------------------------------------------- irdaClient = m_irListener.AcceptIrDAClient() Catch eClientAccept As System.Exception 'Если прослушивание остановлено другим потоком, инициировавшим отмену 'выполнения, будет сгенерировано исключение и управление будет 'передано сюда. If (m_wasListenerStopped = True) Then GoTo exit_sub_with_abort End If
'Если прослушивание не было прекращено, 'то произошло иное исключение. Обработать его. m_errorDuringTransfer = "Error accepting connection - " + _ eClientAccept.Message GoTo exit_sub_with_error End Try
'В этом месте возможны два состояния: '#1: Мы получили соединение от передающего устройства IR '#2: IR-запрос был отменен (кто-то вызвал функцию STOP) ' (в этом случае приведенный ниже код сгенерирует исключение) 'Проверить, не было ли отменено выполнение If (m_wasListenerStopped = True) Then GoTo exit_sub_with_abort End If
'========================================== 'ОБНОВЛЕНИЕ СОСТОЯНИЯ '========================================== setStatus(ReceiveStatus.NotDone_Receiving)
'------------------------- 'Открыть принимающий поток '------------------------- Try irStreamIn = irdaClient.GetStream() Catch exGetInputStream As System.Exception m_errorDuringTransfer = "Error getting input stream - " + _ exGetInputStream.Message GoTo exit_sub_with_error End Try
'Приготовиться к получению данных! Const BUFFER_SIZE As Integer = 1024 Dim inBuffer() As Byte ReDim inBuffer(BUFFER_SIZE) Dim bytesRead As Integer
Do 'Считать байты из порта IR bytesRead = irStreamIn.Read(inBuffer, 0, BUFFER_SIZE) 'Записать байты в наш выходной поток If (bytesRead > 0) Then outputStream.Write(inBuffer, 0, bytesRead) End If Loop While (bytesRead > 0)
outputStream.Flush() 'Закончить запись любых выходных данных
'========================================== 'ОБНОВЛЕНИЕ СОСТОЯНИЯ: УСПЕШНО ВЫПОЛНЕНО '========================================== setStatus(ReceiveStatus.Done_Success) Return 'No errors
'========================================== 'ОШИБКА. '========================================== exit_sub_with_abort: 'ОБНОВЛЕНИЕ СОСТОЯНИЯ: Отменено (но не из-за ошибки) setStatus(ReceiveStatus.Done_Aborted) Return
exit_sub_with_error: 'ОБНОВЛЕНИЕ СОСТОЯНИЯ: ОШИБКА!!!! setStatus(ReceiveStatus.Done_ErrorOccured) End Sub End Class
Листинг 15.6. Простая Web-служба
'Этот код следует вставить в класс Service1, содержащийся 'в файле "Service1.asmx.vb". '"[WebMethod]" - это атрибут метаданных, который указывает механизму 'Web-службы на то, что данный метод должен быть доступным через Web <WebMethod()> _ Public Function AddTwoNumbers(ByVal x As Integer, _ ByVal у As Integer) As Integer Return x + у End FunctionЛистинг 15.7. Вызовы Web-служб с передачей параметров только явным образом
Этот код представляет собой всего лишь последовательность вызовов функций. Программистам на VB будет несложно написать его, используя в качестве образца код на С#.Листинг 15.8. Вызов Web-служб путем неявной передачи параметров посредством cookie-файлов
Этот код представляет собой всего лишь последовательность вызовов функций. Программистам на VB будет несложно написать его, используя в качестве образца код на С#.Листинг 15.9. Неэффективная организация диалога с Web-службой, в которой используется множество вызовов
Этот код представляет собой всего лишь последовательность вызовов функций. Программистам на VB будет несложно написать его, используя в качестве образца код на С#.Листинг 15.10. Группирование запросов в одном вызове Web-службы
Этот код представляет собой всего лишь последовательность вызовов функций. Программистам на VB будет несложно написать его, используя в качестве образца код на С#.Листинг 15.11. Код для загрузки файла с Web-сервера
'---------------------------------------------------------- 'Осуществляет синхронную загрузку файла с Web-сервера 'и сохраняет его в локальной файловой системе '[in] httpWhereFrom: URL-адрес файла ' (например, "http://someserver/somefile.jpg") '[in] filenameWhereTo: Место, куда необходимо записать файл ' (например, "\\localfile.jpg") '---------------------------------------------------------- Public Sub downloadFileToLocalStore(ByVal httpWhereFrom As _ String, ByVal filenameWhereTo As String) Dim myFileStream As System.IO.FileStream = Nothing Dim myHTTPResponseStream As System.IO.Stream = Nothing Dim myWebRequest As System.Net.WebRequest = Nothing Dim myWebResponse As System.Net.WebResponse = Nothing'Если файл, который мы хотим записать, уже существует, удалить его If (System.IO.File.Exists(filenameWhereTo) = True) Then System.IO.File.Delete(filenameWhereTo) End If Try 'Создать Web-запрос