Чтение онлайн

на главную - закладки

Жанры

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

}

Другим вспомогательным методом является

GetRandomQuoteOfTheDay
. Этот метод возвращает случайную цитату из цитат
StringCollection quotes
:

protected string GetRandomQuoteOfTheDay {

int index = random.Next(0, quotes.Count); return quotes[index];

}

В методе

Start
весь файл, содержащий цитаты, в
StringCollection quotes
считывается с помощью вспомогательной функции
ReadQuotes
. После этого запускается новый
поток выполнения, который незамедлительно вызывает метод
Listener
. Мы используем поток выполнения, так как метод
Start
не может блокироваться и ждать клиента, он должен сразу же вернуть управление вызывающей стороне (SCM). SCM предположит, что запуск отказал, если метод не вернет своевременно управление вызывающей стороне.

public void Start {

ReadQuotes;

listenerThread = new Thread(new ThreadStart(this.Listener));

listenerThread.Start;

}

Функция потока выполнения

Listener
создает экземпляр
TCPListener
. В методе
AcceptSocket
ожидается соединение клиента. Как только клиент соединяется,
AcceptSocket
возвращает управление с сокетом, связанным с клиентом. Метод
GetRandomQuoteOfTheDay
вызывается для отправки возвращаемой случайной цитаты клиенту с помощью
socket.Send
:

protected void Listener {

listener = new TcpListener(port);

listener.Start;

while (true); {

Socket socket = listener.AcceptSocket;

if (socket == null) {

return;

}

string message = GetRandomQuoteOfTheDay;

UnicodeEncoding encoder = new UnicodeEncoding;

byte [] buffer = encoder.GetBytes(message);

socket.Send(buffer, buffer.Length, 0);

socket.Close;

}

}

Помимо

Start
существуют другие методы для управления службой:
Stop
,
Suspend
и
Resume
:

public void Stop {

listener.Stop;

}

public void Suspend {

listenerThread.Suspend;

}

public void Resume {

listenerThread.Resume;

}

Методом, который будет открыто доступным, является

RefreshQuotes
. Если содержащий цитаты файл изменяется, то запускается повторное чтение данного файла с помощью этого метода:

public void RefreshQuotes {

ReadQuotes;

}

 }

}

Прежде чем разрабатывать службу для нашего сервера, полезно будет создать тестовую программу, которая имеет экземпляр

QuoteServer
и вызывает
Start
. Таким образом можно протестировать функциональность без необходимости обрабатывать специфические для службы вопросы. Можно сконцентрироваться на создании требуемой функциональности. Этот тестовый сервер должен запускаться вручную и код легко просматривается с помощью отладчика.

Тестовая программа является консольным приложением C#. Мы ссылаемся на сборку класса

QuoteServer
. Содержащий цитаты класс копируется в каталог
с:\wrox
(или нужно изменить аргумент конструктора для определения, куда копируется файл). После вызова конструктора мы обращаемся к методу
Start
экземпляра
QuoteServer.Start
возвращает управление сразу после создания потока выполнения, поэтому консольное приложение продолжает выполняться до тех пор, пока не будет нажата клавиша
Return
:

static void Main(string[] args) {

 QuoteServer qs = new QuoteServer(@"c:\wrox\quotes.txt", 4567);

 qs.Start;

 Console.WriteLine("Hit return to exit");

 Console.ReadLine;

 qs.Stop;

}

Отметим, что

QuoteServer
с помощью этой программы будет выполняться на порте 4567 на
localhost
и необходимо использовать эти настройки позже на клиенте.

Пример TcpClient

Клиент является простым приложением Windows, где можно вводить имя хоста и номер порта сервера. Это приложение использует класс

TCPClient
для соединения с функционирующим сервером и получения возвращаемого сообщения для вывода его в текстовом поле. Внизу формы выводится статусная строка:

В этом коде используются инструкции

using
:

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

using System.Net;

using System.Net.Sockets;

using System.Text;

Мы также включаем ссылку на файл

QuoteServer.dll
. Оставшаяся часть кода автоматически создается в IDL, поэтому он здесь не будет рассматриваться подробно. Основная функциональность клиента находится в обработчике нажатия кнопки Get Quote:

protected void buttonQuote_Click(object sender, System.EventArgs e) {

 statusBar.Text = "";

 string server = textBoxHostname.Text;

 try {

int port = Convert.ToInt32(textBoxPortNumber.Text);

 } catch (FormatException ex) {

statusBar.Text = ex.Message; return;

 }

 TcpClient client = new TcpClient;

 try {

Поделиться:
Популярные книги

Убивать чтобы жить 4

Бор Жорж
4. УЧЖ
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 4

Новик

Ланцов Михаил Алексеевич
2. Помещик
Фантастика:
альтернативная история
6.67
рейтинг книги
Новик

Инвестиго, из медика в маги. Том 6. Финал

Рэд Илья
6. Инвестиго
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Инвестиго, из медика в маги. Том 6. Финал

Законы Рода. Том 11

Flow Ascold
11. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 11

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Аристократ из прошлого тысячелетия

Еслер Андрей
3. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Аристократ из прошлого тысячелетия

Страж Кодекса. Книга IX

Романов Илья Николаевич
9. КО: Страж Кодекса
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Страж Кодекса. Книга IX

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

Охота на царя

Свечин Николай
2. Сыщик Его Величества
Детективы:
исторические детективы
8.68
рейтинг книги
Охота на царя

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Страж Кодекса. Книга III

Романов Илья Николаевич
3. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Страж Кодекса. Книга III

Неудержимый. Книга V

Боярский Андрей
5. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга V

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

Надуй щеки! Том 6

Вишневский Сергей Викторович
6. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки! Том 6