}
Помимо 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:wroxquotes.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 {
client.Connect(
textBoxHostname.Text, Convert.ToInt32(textBoxPortNumber.Text));
NetworkStream stream = client.GetStream();
byte[] buffer = new Byte[1024];
int received = stream.Read(buffer, 0, 1024);
if {received <= 0) {
statusBar.Text = 'Read failed'; return;
}
texBoxQuote.Text = Encoding.Unicode.GetString(buffer);
} catch (SocketException ex) {
statusBar.Text = ex.Message;
} finally {
client.close();
}
}
Запустив тестовый сервер и клиент этого оконного приложения, можно протестировать функциональность. Успешное выполнение может дать следующий результат при использовании указанных на экране настроек:

Добавим серверу функциональность службы. Программа уже выполняется, что же нужно еще сделать? Необходимо, чтобы серверная программа автоматически запускалась во время начальной загрузки системы без какого-либо пользователя, зарегистрировавшегося в системе, и мы хотим управлять ею с помощью служебных управляющих программ.