|
Программирование >> Программирование с использованием ajax
<Grid> <Grid.RowDefinitions> <RowDefinition Height= 30 /> <RowDefinition /> <RowDefinition Height= 30 /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Image x:Name= pictureBox Grid.Row= 0 Grid.Column= 0 Grid.RowSpan= 3 Margin= 6, 6, 6, 6 /> <Button Grid.Row= 0 Grid.Column= l Margin= 5,5,5,5 x:Name= buttonGetPictureList > Get Picture List </Button> <Button Grid.Row= 2 Grid.Column= l Margin= 5,5,5,5 x:Name= buttonGetPicture > Get Picture </Button> <ListBox ItemsSource= {Binding} Grid.Row= l Grid.Column= l Margin= 5,5,5,5 x:Name= listFiles /> </Grid> </Window> 5. Импортируйте пространства имен System.Net, System.Net. Sockets и System. 10 в файл PictureClientWindow.xaml.cs. 6. Добавьте в класс PicutreClientWindow константу bufferSize: public partial class PictureClientWindow : Window { private const int bufferSize = 8192; 7. Добавьте вспомогательный метод ConnectToServer () с реализацией, показанной ниже: private TcpClient ConnectToServer () { Подключение к серверу. TcpClient client = new TcpClient(); IPHostEntry host = Dns.GetHostEntry( Properties.Settings.Default.Server); var address= (from h in host.AddressList where h.AddressFamily == AddressFamily.InterNetwork select h).First (); client.Connect(address.ToString (), Properties.Settings.Default.ServerPort); return client; 8. Добавьте к кнопке buttonListPictures обработчик события Click, содержащий следующий код: private void buttonGetPictureList Click(object sender, RoutedEventArgs e) { TcpClient client = ConnectToServer () ; Отправка запроса серверу. NetworkStream clientStream = client. GetStream () ; string request = LIST ; byte[] requestBuffer = Encoding.ASCII.GetBytes(request); clientStream.Write(requestBuffer, 0, requestBuffer.Length); Считывание ответа с сервера. byte[] responseBuffer = new byte [bufferSize] ; MemoryStream memStream = new MemoryStream () ; int bytesRead = 0 ; bytesRead = clientStream. Read (responseBuffer, 0, bufferSize); memStream. Write (responseBuffer, 0, bytesRead); ) while (bytesRead > 0); clientStream.Close(); client.Close 0; byte[] buffer = mшnStream.GвtBuffer (); string response = Encoding.ASCII .GetString(buffer) ; this. DataContext = response. Split ( : ); 9. Добавьте к кнопке buttonGetPicture обработчик события Click, содержащий следующий код: private void buttonGetPicture Click(object sender, RoutedEventArgs e) { TcpClient client = ConnectToServer () ; NetworkStream clientStream = client.GetStream(); string request = FILE: + this.listFiles.Selectedltem.ToStringO ; byte[] requestBuffer = Encoding.ASCII.GetBytes(request); clientStream.Write(requestBuffer, 0, requestBuffer.Length); byte[] responseBuffer = new byte [bufferSize]; MemoryStream memStream = new MemoryStream () ; int bytesRead = 0; bytesRead = clientStream. Read (responseBuffer, 0, bufferSize); memStream. Write (responseBuffer, 0, bytesRead); ) while (bytesRead > 0); ClientStream.Close(); client.Close 0; Bitmaplmage bitmaplmage = new Bitmaplmage () ; memStream.Seek(0, SeekOrigin.Begin); bitmaplmage.Beginlnit(); bitmaplmage. StreamSource = memStream; bitmaplmage.Endlnit0; pictureBox. Source = bitmaplmage; 10. Теперь можно запустить серверное приложение, а затем - клиентское приложение (рис. 32.12). Щелчок на кнопке List Pictures (Вывести список изображений) ведет к отображению списка всех изображений в каталоге изображений (сконфигурированном на сервере). Выбор изображения и щелчок на кнопке Get Picture (Получить изображение) вызывает передачу изображения клиенту и его отображению в окне изображения. При включенном брандмауэре Windows Vista система попросит разблокировать программу. Чтобы сервер прослушивал конкретный порт, это действие нужно разрешить. Настройки брандмауэра позволяют также конфигурировать исключения для конкретных номеров портов, используемых во время разработки. V Pfclure CUtnt Рис. 32.12. Работа приложения PictureCllent Описание полученных результатов Класс TcpClient используется клиентом для подключения к серверу. После создания объекта TcpClient метод Connect!) инициирует подключение к серверу. Метод Connect () требует указания IP-адреса и номера порта. IP-адрес считывается из IPHostEntry переменной host. Объект IPHostEntry, содержащий все IP-адреса сервера, возвращается методом GetHostEntry!) класса Dns. Имя сервера считывается из файла конфигурации приложения посредством объекта Properties. Settings. Default.Server: TcpClient client = new TcpClient (); IPHostEntry host = Dns.GetHostEntry( Properties.Settings.Default.Server); client.Connect(host.AddressList[0] , Properties.Settings.Default.ServerPort) ; Теперь посредством объекта NetworkStream данные могут быть отправлены серверу. Объект NetworkStream доступен посредством метода GetStream () объекта TcpClient. Теперь предназначенные для записи данные могут быть отправлены серверу методом объекта NetworkStream. Поскольку метод Write () требует использования массива байтов, строка LIST преобразуется классом Encoding в массив байтов. Encoding.ASCII возвращает ASCII-объект Encoding. С помощью этого объекта метод GetBytes () преобразует строку в массив байтов: NetworkStream clientStream = client.GetStream (); string request = LIST ; byte[] requestBuffer = Encoding.ASCII.GetBytes(request); clientStream.Write(requestBuffer, 0, requestBuffer.Length); Данные, возвращенные с сервера, считываться методом Read () объекта clientStream. Поскольку объем данных, которые должны быть получены с сервера, не известен, для считывания всех поступающих данных используется цикл while. Считанные данные дописываются в конец объекта MemoryStream, размеры которого автоматически изменяются: byte[] responseBuffer = new byte[bufferSize] ; MemoryStream memStream = new MemoryStream(); int bytesRead = 0;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.132
При копировании материалов приветствуются ссылки. |